在循环中执行查询会导致脚本在第一次迭代后退出

时间:2010-02-02 03:35:19

标签: php mysql

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

$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;
}

2 个答案:

答案 0 :(得分:3)

我的建议是放弃解决此问题并切换到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”)。

答案 1 :(得分:0)

我喜欢使用PDO和预处理语句但是(尝试)回答你的问题尝试将$ db作为链接标识符添加到mysql_real_escape_string()函数。

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

抱歉缺少格式化,我是移动ATM。