Проблема 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']).'")';
Просто делаю заметку, потому что я предполагаю, что вы удалили дезинфицирующее средство для быстрых целей в этом посте, но убедитесь, что вы дезинфицируете свои $_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']."'))";
?>