【问题标题】:error executing my query in php but not in phpmyadmin在 php 中执行我的查询但在 phpmyadmin 中没有执行错误
【发布时间】:2011-10-21 10:32:19
【问题描述】:

我正在尝试在我的 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() 中的数组 ( )(/home/...的第 94 行...

【问题讨论】:

  • 或许可以在$db_catalogus->query($sql_insert_product);方法的代码中找到解释。可以发一下吗?
  • 这是一个标准的drupal函数:s

标签: php mysql sql pdo drupal-7


【解决方案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);

而且任何引号都不会有任何问题。

【讨论】:

  • 我编辑了代码,使其更具可读性。 :) 但是我选择双引号的原因是我插入的一些值将包含单引号。
  • 例如,我将 'tt' 替换为 '{$prod->merk}' 并且值的示例是 l'artigiano italiano 当我达到这个值时,查询当然会遇到麻烦。
  • 是的,但我的意思是我在我的 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 设置。

【讨论】:

    猜你喜欢
    • 2017-03-03
    • 1970-01-01
    • 2018-03-31
    • 1970-01-01
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    • 2020-09-08
    • 2016-04-07
    相关资源
    最近更新 更多