错误在php中执行我的查询但在phpmyadmin中没有

时间:2011-10-21 10:32:20

标签: php mysql sql pdo drupal-7

我正在尝试在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行

2 个答案:

答案 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设置。