Застрял с неизвестным столбцом в поле MySQL

#php #mysql #mysqli

#php #mysql #mysqli

Вопрос:

Я продолжаю получать эту ошибку

Неизвестный столбец «Привет» в «списке полей»

когда я выполняю этот код

 $sql = "INSERT INTO installs (date,addedBy,customer,reg,vehMake,vehModel,colour,mileage,location,tracker,serial,sim,extr    as,satnav,input1,input2,output,comments) VALUES (" . $date . ", " . $addedBy . ", " . $customer . ", " . $reg . ", " . $vehMake . ", " . $vehModel . ", " . $colour . ", " . $mileage . ", " . $location . ", " . $tracker . ", " . $serial . ", " . $sim . ", " . $extras . ", " . $satnav . ", " . $input1 . ", " . $input2 . ", " . $output . ", " . $comments . ")";
$result = $connect->query($sql) or die($connect->error);
 

Комментарии:

1. Есть какая-нибудь причина для всех этих точек? И зачем вставлять строку в поле даты?

2. Исследуйте фактическую инструкцию SQL, которая выполняется. Возможно, там что-то не так.

3. множество точек можно заменить на implode(',' ['Hello', 2, 3, 4, ...]);

4. Просто используйте подготовленный оператор. Это одновременно решит вашу проблему и защитит ваш код от инъекций, когда вы заменяете эти значения между точками переменными.

Ответ №1:

замените это

   (' . "Hello" . ', ' . 2 . ', ' . 3 . ', ' . 4 . ', ' . 4 . ', ' . 5 . ', ' . 6 . ', ' . 7 . ', ' . 8 . ', ' . 9 . ', ' . 10 . ', ' . 11 . ', ' . 12 . ', ' . 13 . ', ' . 14 . ', ' . 15 . ', ' . 16 . ', ' . 17 . ')';
 

Автор:

   ("Hello", 2 ,3, 4,4,5,6,7,8,9,10,11,12, 13,14,15,16,17)';
 

Редактировать:

замените это

   (" . $date . ", " . $addedBy . ",..........
 

Автор:

   ('$date', '$addedBy',...........
 

или это

   ('" . $date . "', '" . $addedBy . "',..........
 

Комментарии:

1. Я обновил исходный вопрос, ваше решение помогло с временным, но не для моего нового. Можете ли вы это проверить.

Ответ №2:

Привет должен быть заключен в одинарные кавычки. Экранируйте кавычки следующим образом:

         $sql = 'INSERT INTO installs 
(date,addedBy,customer,reg,vehMake,vehModel,colour,
    mileage,location,tracker,serial,sim,extras,satnav,
    input1,input2,output,comments)
    VALUES
        ('' . "Hello" . '', ' . 2 . ', ' . 3 . ', ' . 4 . ', ' . 4 . ', 
    ' . 5 . ', ' . 6 . ', ' . 7 . ', ' . 8 . ', ' . 9 . ', 
    ' . 10 . ', ' . 11 . ', ' . 12 . ', ' . 13 . ', ' . 14 . ', ' . 15 . ',
    ' . 16 . ', ' . 17 . ')';
 

Комментарии:

1. Фактически, MySQL будет принимать строковые литералы, заключенные либо в одинарные, либо в двойные кавычки, если только sql_mode сеанса не включает / не включает ANSI_QUOTES .

2. @spencer7593 Тот факт, что ошибка sql говорит о неизвестном столбце: Привет, говорит нам, что привет отправляется как имя столбца (не заключенное в кавычки, одинарные или двойные), а не как строковое значение.

Ответ №3:

Одним из вероятных объяснений такого поведения является то, что sql_mode включает (или включает) ANSI_QUOTES .

 SELECT @@SESSION.sql_mode
 

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


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

например

 $sql = "INSERT INTO installs (date,addedBy,customer, ...) 
        VALUES ( :date, :addedBy, :customer, ...)";
$sth = $connect->prepare($sql);
$sth->execute(array(':date' => $date, ':addedBy' => $addedBy, ':customer' => $customer, ... ));