#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, ... ));