Member 14721629 Ответов: 1

Вопрос по SQL в PHP вставить


Овации,

Итак, у меня есть "родительская таблица", куда мне нужно вставить некоторые вещи.
"Родительская таблица" - файлы содержат
id_file
id_cust - foreign key for idcust from table Customers
register_date
id_object - foreign key for idcust from table Objects


Таблица Клиенты
idcust
cust_name
address
phone


объект таблицы
idobject
name_object


Я создал HTML-форму для вставки нового файла, который содержит 2 поля со списком и дату регистрации


<pre><form method="post" action="">
<tr>
<td>Customer name: </td> <td> 
<select name="cust_name">
<?php 
$sql = mysqli_query($conn, "SELECT * FROM customers");
while ($row = $sql->fetch_assoc()){ 
echo "<option value=\"cust_name1\">" . $row['cust_name'] . "</option>";
}?>
</select></td></tr>

<tr>
<td>Register date</td>
<td> <input  type="date" name="register_date"/></td>
</tr>

<tr>
<td>Object: </td> <td> 
<select name="object">
<?php 
$sql = mysqli_query($conn, "SELECT * FROM objects");
while ($row = $sql->fetch_assoc()){ 
echo "<option value=\"name_object1\">" . $row['name_object'] . "</option>";
}?>
</select></td></tr>
<tr><td colspan=2> <input name ="submit" type="submit" value="Add a new file"></td>
</tr></form>


Что я уже пробовал:

Со вчерашнего дня я попробовал looooot запросов, это последний:

<?php

 $conn = mysqli_connect("localhost", "root", "", "testdb");
 if ($conn -> connect_error){
   die("Connection failed:". $conn-> connect_error);
 }
 if(!empty($_POST['submit'])){

   $cust_name = $_POST['cust_name'];
       $register_date  = date('Y-m-d',strtotime($_POST['register_date']));
       $name_object =$_POST['name_object'];

   $sql = "INSERT INTO files VALUES (
   (SELECT * FROM customers c WHERE c.cust_name = $cust_name),
   $register_date,
   (SELECT * FROM objects o  WHERE o.name_object = $name_object)
   )";

   $conn->query($sql);
   if($conn->error){
     echo $conn->error;
   } else
   {
     $message= "We have added the file no. " .$conn->insert_id;
   }
 }
 ?>


Я пробовал с левым соединением, но безуспешно...
Не могли бы вы помочь мне с этим вопросом? Спасибо.

Richard Deeming

Ваш код уязвим для SQL-инъекция[^]. НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.

PHP: SQL-инъекция - руководство пользователя[^]

1 Ответов

Рейтинг:
2

W∴ Balboos, GHB

Позвольте мне начать с того, что я дам вам указатель на то, как настроить выпадающий список элементов <option> в форме:

Вы заполняете свои выпадающие списки из дочерних таблиц.
Для значения каждого параметра используйте фактическое значение, которое вы планируете вставить в таблицу, то есть допустимый список внешних ключей, и, следовательно, только допустимые значения.
(Вы можете поместить все, что вам нравится, чтобы пользователь мог видеть в списке выбора - текстовая часть ваших дочерних таблиц-это хорошая идея)

Теперь у вас есть только допустимые параметры для внешних ключей в качестве возможных записей.

Прежде чем вы начнете это делать, убедитесь, что ваш входной запрос действительно будет работать, создав его вручную (то есть жестко закодировав) и отправив через ваше приложение. Если "гарантированный" правильный вариант не сработает, у вас есть проблема, которую нужно решить прямо там, в том, что хочет родительская таблица и почему вы думаете, что она хочет!

Наконец - и это "большой вопрос": если вы получаете какие-либо сообщения об ошибках, каковы они? Если в таблицу попадают неверные данные, что вы отправляете и что получаете? Это делает возможным диагностирование реальной проблемы.


Member 14721629

Я действительно застрял здесь. Вы можете мне помочь с этим? Или предложить мне что-нибудь? Мне действительно нужна небольшая помощь..

W∴ Balboos, GHB

Добавление к исходному ответу: настройте дамп экрана фактического SQL, который вы отправляете на сервер. Это то, что ты думаешь? Правильно ли подобраны кавычки? Если вы создадите списки опций, как я уже отмечал, значения, отправленные в целевую форму, будут готовы к вставке "как есть".

Например, это

 $sql = "INSERT INTO files VALUES (
   (SELECT * FROM customers c WHERE c.cust_name = $cust_name),
   $register_date,
   (SELECT * FROM objects o  WHERE o.name_object = $name_object)
   )";

действительно давая вам то, что вы хотите для ввода?