我正在尝试在drupal7的cron作业中执行查询。然而,一些奇怪的事情正在发生每次尝试执行时我都会得到一个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)VALUES(16657,“tt”,“Meisjes”, “11803”); cronner_cron()中的Array()(/ home /...
的第94行
答案 0 :(得分:3)
问题确实存在于您的查询中。 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 :(得分:3)
显然,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设置。