#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, которую я бы не рекомендовал.