在这里感到困惑....这段代码:
$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_packet设置为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;
}
答案 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。