ошибка при выполнении моего запроса на php, но не в phpmyadmin

#php #mysql #sql #pdo #drupal-7

#php #mysql #sql #pdo #drupal-7

Вопрос:

Я пытаюсь выполнить запрос в моем cron-задании drupal7. Однако происходит что-то странное. Каждый раз, когда он пытается выполнить, я получаю исключение PDOException. Когда я вставляю запрос в phpmyadmin, проблем нет, и запрос выполняется. Но в моем cronjob это выдает ошибку. Проблема не в моем cronjob, я знаю это, потому что он также выполняет другие запросы без каких-либо проблем.

Php-код запроса:

 $sql_insert_product = 'INSERT INTO tblProducten(productnummer, merk, doelgroep, RefLev)'
. 'VALUES(' . $prod->productnummer . ', "tt", "' . $prod->doelgroep . '", "'
. $prod->reflev . '")';
$db_catalogus->query($sql_insert_product);
 

Результирующий запрос, который генерирует код, который работает в phpmyadmin:

 INSERT INTO tblProducten(productnummer, merk, doelgroep, RefLev) VALUES(16657, "tt", "Meisjes", "11803")
 

Исключение:

Исключение PDOException: SQLSTATE[42S22]: Столбец не найден: 1054 неизвестных столбца ‘tt’ в ‘списке полей’: ВСТАВИТЬ В tblProducten(productnummer, merk, doelgroep, RefLev) ЗНАЧЕНИЯ (16657, «tt», «Meisjes», «11803»); Array ( ) в cronner_cron() (строка 94 из /home/ …

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

1. Возможно, объяснение можно найти в коде метода $db_catalogus->query($sql_insert_product); . Не могли бы вы опубликовать это, пожалуйста?

2. это стандартная функция drupal: s

Ответ №1:

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

Итак, измените двойные кавычки на одинарные (и соответствующим образом измените синтаксис)

 $sql = "INSERT INTO tblProducten(productnummer, merk, doelgroep, RefLev)
VALUES ({$prod->productnummer}, 'tt', '{$prod->doelgroep}','{$prod->reflev}')";
$db_catalogus->query($sql);
 

и, чтобы вы знали, ваше форматирование почти нечитаемо, со всеми этими ненужными конкатенациями и кавычками.

если у вас возникли проблемы с кавычками, то вы не экранируете свои значения
, это приведет вас к SQL-инъекции.
ВСЕГДА экранируйте любую строку, которую вы размещаете в запросе.
и соответствующим образом отформатируйте другие значения.

добавьте этот код перед вашим запросом

 $prod->productnummer = intval($prod->productnummer);
$prod->doelgroep = mysql_real_escape_string($prod->doelgroep);
$prod->reflev = mysql_real_escape_string($prod->reflev);
 

и никогда не будет никаких проблем с кавычками.

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

1. Я отредактировал код, чтобы он был более читабельным. 🙂 Но причина, по которой я выбрал для кавычек dubble, заключается в том, что некоторые из значений, которые я вставляю, будут содержать одинарную кавычку.

2. например, я заменил ‘tt’ на ‘{$ prod-> merk}’, и примером значения является l’artigiano italiano Когда я достигаю этого значения, запрос, конечно, сталкивается с проблемами.

3. Да, но я имел в виду, что я отредактировал его в своем файле cron, я благодарю вас за помощь! Я постараюсь сделать все более читаемым в будущем!

Ответ №2:

По-видимому, phpMyAdmin и ваш скрипт cron выполняются в разных режимах SQL. Вот иллюстрация проблемы:

 SET sql_mode = 'ANSI_QUOTES'; # treats double quotes as an identifier quote character 
SELECT "name" FROM table1;

name
=====
alpha
beta
gamma

SET sql_mode = ''; # treats double quotes as string literal quote character
SELECT "name" FROM table1;

name
=====
name
name
name
 

В идеале вы не должны использовать " в качестве разделителя строк ( "tt" в вашем примере), вместо этого используйте одинарные кавычки, что является стандартом, который поймет каждая база данных SQL. Или вы можете поиграть с настройкой ANSI_QUOTES, которую я бы не рекомендовал.