ошибка при выполнении моего запроса в php, но не в phpmyadmin - PullRequest
0 голосов
/ 21 октября 2011

Я пытаюсь выполнить запрос в моей работе 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' в 'списке полей': INSERT INTOЦЕННОСТИ tblProducten (productnummer, merk, doelgroep, RefLev) (16657, «tt», «Meisjes», «11803»);Array () в cronner_cron () (строка 94 из /home/...

Ответы [ 2 ]

3 голосов
/ 21 октября 2011

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

3 голосов
/ 21 октября 2011

проблема действительно в вашем запросе.В 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);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...