【问题标题】:Query executing in a loop causes script to exit after first iteration在循环中执行的查询导致脚本在第一次迭代后退出
【发布时间】:2012-01-11 10:03:59
【问题描述】:

在这里感到困惑....这段代码:

$qry = sprintf("INSERT INTO news_sites_homepage_grab 
                VALUES ('', %d, '%s', NOW(), NOW())", 
                        $site_id, mysql_real_escape_string($html));

...在$html 每次更改的循环中执行。此代码执行一次,但下一次,脚本就会死掉。没有警告/错误,什么都没有。 $html 是一个代表网页的字符串,因此它可能很长。我已将 PHP 中的内存限制提高到 32M,并将 MySQL 中的 max_allowed_pa​​cket 设置为 16M,但没有。

有人有什么想法吗?谢谢!

更新:这是在循环中调用的函数。

function save_html($site_id, $html) {
global $db;
try {
    $qry = sprintf("INSERT INTO site_grab VALUES ('', %d, '%s', NOW(), NOW())",
                   $site_id,
                   mysql_real_escape_string($html));

    $db->insert($qry);

}
catch(Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}

return;
}

【问题讨论】:

  • 你能发布更多代码吗?至少看到循环会很有帮助。
  • 您要插入的列的名称是什么?
  • id、sid、site_text、date_added、date_modified
  • 看来我的猜测离我们不远了。 foo 列除外。那根本不对。
  • 什么是$db?您是在使用PEAR::MDB2 还是其他抽象库,还是一些随机的内部类?问题可能在于那个神秘的->insert 方法。

标签: php mysql


【解决方案1】:

我的建议是放弃解决此问题并转至PDO。它支持prepared statements,当您使用参数时不易受到SQL注入的影响,并且对于重复查询具有更高的性能。

这是对函数的简单重构,假设 $db 拥有一个 PDO 实例:

function save_html($site_id, $html) {
    global $db;
    static $insert = Null;
    if (isnull($insert)) {
        /* explicitly name the columns, in case you later add more to the table
           or change their order. I'm also guessing `id` is auto-incrementing,
           so I'm leaving it out.
         */
        $insert = $db->prepare("INSERT INTO site_grab (sid, site_text, date_added, date_modified) VALUES (?, ?, NOW(), NOW())");
    }
    try {
        $insert->execute(array($site_id, $html));
    } catch(Exception $e) {
        echo 'Caught exception: ',  $e->getMessage(), "\n";
    }

    return;
}

如果 date_added 的类型为 TIMESTAMP,您可以将其默认值设置为 CURRENT_TIMESTAMP 并将其排除在插入之外。或者,将ON UPDATE CURRENT_TIMESTAMP 属性添加到date_modified 列,这意味着您在更新行时不需要显式设置该字段。如果插入比更新更常见,请执行前者;否则,做后者。

您还可以将准备好的语句存储在一个对象中,以便可以从多个函数访问它们,并将全局 $db 替换为某种服务定位器(最简单的方法是使用某个类的静态函数或属性)或使用依赖注入(阅读“Inversion of Control Containers and the Dependency Injection pattern”)。

【讨论】:

  • 工作就像一个魅力。谢谢。知道为什么我的代码会失败吗?
  • 说实话,我并没有很认真地看原版。旧的 mysql 驱动程序已经过时了,我从不费心去尝试使用它来工作的代码。
【解决方案2】:

我更喜欢使用 PDO 和准备好的语句,但要(尝试)回答您的问题,请尝试将 $db 作为链接标识符添加到 mysql_real_escape_string() 函数。

这有帮助吗?如果没有,请尝试回显 mysql_error() 函数的输出。

对不起,我是移动提款机。

【讨论】:

  • 谢谢。尝试将 $db 发送到 mysql_real_escape_stirng() 但仍然没有。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-13
  • 2016-08-18
  • 1970-01-01
  • 2019-08-29
  • 1970-01-01
  • 1970-01-01
  • 2018-07-07
相关资源
最近更新 更多