Проблема PHP/FORM

Я новичок в программировании, поэтому, пожалуйста, потерпите меня... Я использую MySQL/PHP для создания приложения, часть которого позволяет пользователям выбирать местоположение и комнату из двух выпадающих меню. Есть три таблицы, комната, местоположение и room_location. Я создал формы, которые позволяют пользователю добавлять комнату к таблице комнат, и форму, позволяющую им добавлять местоположение в таблицу местоположений - они оба работают нормально, так как ввод - это просто текстовое поле, и пользователь может отправлять любой текст, который ему нравится. Моя проблема с третьей формой / таблицей (dropdown_form.php)- эта таблица имеет три поля, id | номер_имя | название местоположения.

Что я пытаюсь достичь с помощью таблицы room_location: пользователь получит веб-страницу с раскрывающимся меню для выбора местоположения name (которое получено из таблицы местоположений) и другое раскрывающееся меню для выбора имени комнаты (которое получено из стол в комнате). После выбора из обоих выпадающих меню пользователь отправит эту комбинацию комнаты и местоположения, и новая запись будет добавлена ​​в таблицу room_location в базе данных.

пример таблицы room_location

ID | location_name | название комнаты
1 | Больница1 | room1

2 | Больница1 | room2

3 | Больница1 | room3

4 | Больница2 | room1

5 | Больница2 | комната2 и т. д.

Пока у меня есть форма для этого, чтобы отобразить оба выпадающих меню, но когда я выбираю и отправляю, я получаю сообщение об ошибке "Ошибка: повторяющаяся запись" для ключа "ПЕРВИЧНЫЙ". Я включил несколько эхо-операторов для тестирования, чтобы посмотрим, что происходит, теперь я получаю:

Введено местоположение и название комнаты было

Массив ( [select_location] => [select_room] =>)

Ошибка: Дублирующая запись '' для ключа 'PRIMARY' (дублирующаяся запись выглядит как NULL?, Поэтому не думайте, что на самом деле что-то передается в process.php)

Похоже, что что-то не так (я думаю) с селекторами, которые должны передавать данные в process.php, который обрабатывает операторы $_POST. Я включил копию своего кода, любая помощь на этот счет будет принята с благодарностью.

dropdown_form.php

    <html>
    <head>
    <title>Testing Dropdown form</title>
    </head>
    <body>

<?php
        //make connection to the database
        mysql_connect ("localhost", "root", "password") or die ('Database connection ERROR: ' . mysql_error());
        mysql_select_db ("my_database");
?>

<fieldset style="width:30%" align="center"><legend><b>Add New Location/Room Combination</b></legend>
<table align="center" cellspacing="0" cellpadding="10" border="0">
<tr>
    <td align="center" valign="middle"> 
        <b> Location Name: </b> 
    </td>
    <td align="center" valign="middle"> 
        <b> Room Name: </b> 
    </td>
</tr>
<tr>
    <td align="center" valign="middle">
        <!-- create form to submit data process.php -->
        <form name="room_location_form" action="process.php" method="post">
        <select name="select_location">         

        <?php
        //create and run a query that selects all the locations to create an options list
        $loc_query = "SELECT location_name FROM location ORDER BY location_name";
        $loc_result = mysql_query($loc_query);

        while ($row = mysql_fetch_array($loc_result, MYSQL_ASSOC)) 
        {
        echo "<option value=$row[id]>$row[location_name]</option>";
        }
        ?>
        </select>
    </td>

    <td>        
        <?php
        //create and run a query that selects all the rooms to create an options list
        $room_query = "SELECT room_name FROM room_name ORDER BY room_name";
        $room_result = mysql_query($room_query);
        ?>

        <select name="select_room">

        <?php
            while ($row = mysql_fetch_array($room_result, MYSQL_ASSOC)) 
            {
            echo "<option value=$row[id]>$row[room_name]</option>";
            }
        ?>  
        </select>

    </td>

    <!--Add a submit button -->
    <td align="center" valign="middle">
        <input type="submit" value="Add Location/Room">
    </td>

</tr>

</form>
</table>
</fieldset>

<br>
<br>
<hr width=50%>
<br>
 <table border=1 align=center cellspacing=1>
    <tr>
        <th>Location Name</th>
        <th>Room Name</th>
    </tr>

<?php

//build query to display a list of all current locations and rooms
 $query = mysql_query("select * from room_location ORDER BY location_name, room_name"); 

  //return the array and loop through each row
  while ($row = mysql_fetch_array($query)) {
  $location_name = $row['location_name'];
  $room_name = $row['room_name'];

 ?>

    <tr>
        <th><?php echo $location_name;?></th>
        <th><?php echo $room_name;?></th>
    </tr>

<?php }  //this ends the loop   
?>

process.php

<?php
//make connection
$conn = mysql_connect ("localhost", "root", "password"); 
if (!$conn) 
    {
    die ('Database connection ERROR: ' . mysql_error());
    }
$db = mysql_select_db ("my_database");

//Add new Location and Room Name combination - sent from form
$sql="INSERT INTO room_location (location_name, room_name) VALUES (('$_POST[select_location]'), ('$_POST[select_room]'))"; 
    echo "Location and Room name entered was ", $_POST['select_location'], " & ", $_POST['select_room']; 
?>
<br> <!-- Line break just to see what is being output when testing -->
<?php
print_r($_POST);  //added for testing purposes to see what is being POSTed
?>
<br> <!-- Line break just to see what is being output when testing -->
<?php
if (!mysql_query($sql,$conn))
    {
    die ('Error: ' . mysql_error());
    }
    echo "Location and Room name entered was ", $_POST['select_location'], " & ", $_POST['select_room']; 

mysql_close($conn)
 ?>

*** ОБНОВЛЕНИЯ, СДЕЛАННЫЕ КАК ПРЕДЛАГАЕМЫЕ * * Спасибо за предложения, я сделал некоторые проги, спасибо всем вам. Используя приведенный ниже код, я теперь получаю select_location в качестве location_id и select_room в качестве room_name_id вместо location_name и room_name - есть идеи, что я делаю не так, ребята?

dropdown_form.php

    <?php
    //make connection to the database
            mysql_connect ("localhost", "root", "password") or die ('Database connection ERROR: ' . mysql_error());
            mysql_select_db ("my_database");
    ?>

    <fieldset style="width:30%" align="center"><legend><b>Add New Location/Room Combination</b></legend>
    <table align="center" cellspacing="0" cellpadding="10" border="0">
    <tr>
        <td align="center" valign="middle"> 
            <b> Location Name: </b> 
        </td>
        <td align="center" valign="middle"> 
            <b> Room Name: </b> 
        </td>
    </tr>
    <tr>
        <td align="center" valign="middle">
            <!-- create form to submit data process.php -->
            <form name="room_location_form" action="process.php" method="post">
            <select name="select_location">         

            <?php
            //create and run a query that selects all the locations to create an options list
            $loc_query = "SELECT location_id,location_name FROM location ORDER BY location_name";
            $loc_result = mysql_query($loc_query);

            while ($row = mysql_fetch_array($loc_result, MYSQL_ASSOC)) 
            {
            echo "<option value=\"".$row['location_id']."\">".$row['location_name']."</option>\n";
            }
            ?>
            </select>
        </td>

        <td>        
            <?php
            //create and run a query that selects all the rooms to create an options list
            $room_query = "SELECT room_name_id,room_name FROM room_name ORDER BY room_name";
            $room_result = mysql_query($room_query);
            ?>

            <select name="select_room">

            <?php
                while ($row = mysql_fetch_array($room_result, MYSQL_ASSOC)) 
                {
                echo "<option value=\"".$row['room_name_id']."\">".$row['room_name']."</option>\n";
                        }
            ?>  
            </select>

        </td> 

        <!--Add a submit button -->
        <td align="center" valign="middle">
            <input type="submit" value="Add Location/Room">
        </td>

    </tr>

    </form>
    </table>
    </fieldset>

    <br>
    <br>
    <hr width=50%>
    <br>
     <table border=1 align=center cellspacing=1>
        <tr>
            <th>Location Name</th>
            <th>Room Name</th>
        </tr>

    <?php

    //build query to display a list of all current locations and rooms
     $query = mysql_query("select * from room_location ORDER BY location_name, room_name"); 

      //return the array and loop through each row
      while ($row = mysql_fetch_array($query)) {
      $location_name = $row['location_name'];
      $room_name = $row['room_name'];

     ?>

        <tr>
            <th><?php echo $location_name;?></th>
            <th><?php echo $room_name;?></th>
        </tr>

    <?php }  //this ends the loop   
    ?>

process.php

    <?php
    //make connection
    $conn = mysql_connect ("localhost", "root", "password"); 
    if (!$conn) 
        {
        die ('Database connection ERROR: ' . mysql_error());
        }
    $db = mysql_select_db ("my_database");

        //Add new Location and Room Name combination - sent from form
        $sql="INSERT INTO room_location (location_name, room_name) VALUES (('".$_POST['select_location']."'), ('".$_POST['select_room']."'))"; 

    ?>
    <br> <!-- Line break just to see what is being output when testing -->
    <?php
    print_r($_POST);  //added for testing purposes to see what is being POSTed
    ?>
    <br> <!-- Line break just to see what is being output when testing -->
    <?php
    if (!mysql_query($sql,$conn))
        {
        die ('Error: ' . mysql_error());
        }
    echo "Location and Room name entered was ", [$_POST['select_location']], " & ", $_POST['select_room']; 

    mysql_close($conn)
     ?>

4 ответа

Кроме того, что сказали другие,

в dropdown_form.php на ваших SELECTS, чтобы получить выпадающие списки, вы не получаете идентификатор для значения идентификатора в форме.

SELECT location_name FROM location ORDER BY location
make it 
SELECT id,location_name FROM location ORDER BY location desc

тогда вы можете получить к нему доступ, как:

echo "<option value=\"".$row['id']."\">".$row['location_name']."</option>\n";

обратите внимание, я также отформатировал его правильно

сделать то же самое со вторым выбором...

При вставке новой строки в базу данных убедитесь, что идентификатор является первичным ключом и автоматически увеличивается.запрос:

$sql='INSERT INTO room_location (`id`,`location_name`, `room_name`) VALUES ("","'.mysql_real_escape_string($_POST['select_location']).'", "'.mysql_real_escape_string($_POST['select_room']).'")';

Попробуйте установить автоинкремент в поле id в базе данных

Просто делаю заметку, потому что я предполагаю, что вы удалили дезинфицирующее средство для быстрых целей в этом посте, но убедитесь, что вы дезинфицируете свои $_POST переменные против SQL-инъекции.

С учетом сказанного попробуйте заменить ваш запрос следующим:

$sql="INSERT INTO room_location (location_name, room_name) VALUES (('".$_POST['select_location']."'), ('".$_POST['select_room']."'))";

РЕДАКТИРОВАТЬ:

Кажется, я немного опоздал на это, как уже заметил Блендер.

Наконец-то взломал это сам... не самое элегантное решение, но оно работает:D Спасибо за указатели.

* ОБНОВЛЕНИЕ для process.php * **

<?php
    //This section retrieves the room name selected on dropdown_form.php page
    $room_id = $_POST['select_room']; //temp variable to hold room_name_id
    $query = mysql_query("SELECT room_name FROM room_name WHERE room_name_id = $room_id");
      while ($row = mysql_fetch_array($query)) 
      {
       $room_name = $row['room_name'];
      }

    //This section retrieves the location name selected on add_room_location_form.php page
    $location_id = $_POST['select_location']; //temp variable to hold location_name_id
    $query = mysql_query("SELECT location_name FROM location WHERE location_id = $location_id");
      while ($row = mysql_fetch_array($query)) 
      {
      $location_name = $row['location_name'];
          }

    //Insert room & location data held in $location_name & $room_name into room_location table
    $sql="INSERT INTO room_location (location_name, room_name) VALUES (('$location_name'), ('$room_name'))"; 
    echo "Location and Room name entered was ", $location_name, " & ", $room_name;  

    //I tried using this INSERT below but it inserts the array indexes instead of elements to location_name, room_name.
    //$sql="INSERT INTO room_location (location_name, room_name) VALUES (('".$_POST['select_location']."'), ('".$_POST['select_room']."'))";    
?>
Другие вопросы по тегам