我不确定我是否完全错过了什么,所以我请求,希望成为一个更好的人。所以我现在就请求原谅我的愚蠢,如果有的话。
我有一个客户,其托管方公司现在指责我为客户建立的网站,导致服务器一次又一次“崩溃”(或至少运行速度非常慢)。这不是一个拥有任何复杂脚本的大型网站。这是一个博客,具有评论功能。
他们告诉我这就是问题所在,因为从日志来看似乎只有一个问题:
www.xxxxxx.se xxx.xxx.xx.xxx [14/Mar/2011:05:08:02 +0100] fcgi_php_error:PHP 警告:mysql_query() [function.mysql-query]: 无法保存 /home/t/xxxxx/www/include/php/newsfeed_full.php 第 66 行中的结果集,PHP 警告:mysql_fetch_assoc():提供的参数不是 /home/t/xxxxx/www/include/php/newsfeed_full.php 第 68 行中有效的 MySQL 结果资源
第 66 行:
$sql = "INSERT INTO `newsfeed_comments` (post_id, reply_id, date, name, text) VALUES ('".mysql_real_escape_string($post_id)."', '".mysql_real_escape_string($_POST['reply_id'])."', '".date('YmdHis')."', '".mysql_real_escape_string($_POST['name'])."', '".mysql_real_escape_string($_POST['text'])."')";
mysql_query($sql) or die(mysql_error());
$sql 输出:
INSERT INTO `newsfeed_comments` (post_id, reply_id, date, name, text) VALUES ('168', '111194', '20110322145339', 'Test 2', 'Test text 2')
第 68 行:
$sql = "SELECT * FROM `newsfeed_comments` WHERE `post_id` = '".$post_id."' && `reply_id` IS NULL ORDER BY `date` DESC";
$result = mysql_query($sql);
$i = 0;
while ($row = mysql_fetch_assoc($result)) {
//and so on...
$sql 输出:
SELECT * FROM `newsfeed_comments` WHERE `post_id` = '168' && `reply_id` IS NULL ORDER BY `date` DESC
问题是,我从未在测试中亲眼见过这些错误。我从未能够以任何方式复制这些错误。所以它显然是有效的。
我的问题是,可能出了什么问题?托管公司只是告诉我,我需要确保我的脚本可以处理他们的服务器可能出现的所有错误。
相同的脚本可以在其他 10-15 个托管服务上完美运行,没有任何问题,而且我从来没有遇到过任何问题。
我是否遗漏了什么关键内容?我对 PHP 的知识缺口是否很大?
答案1
这里根本没有任何错误处理,这是一个问题。如果您对 mysql_query() 的调用由于某种原因不起作用,它将返回 FALSE。然后将其交给 mysql_fetch_assoc(),它也会失败。
你确实应该做一些基本的错误处理,类似于这样的:
$sql = "SELECT * FROM `newsfeed_comments` WHERE `post_id` = '".$post_id."' && `reply_id` IS NULL ORDER BY `date` DESC";
$result = mysql_query($sql);
if (!$result) {
//do error handling and fail
}
$i = 0;
while ($row = mysql_fetch_assoc($result)) {
...
这页有一些关于如何使用 mysql_fetch_assoc() 执行此操作的很好的例子。
防御性地编程,检查任何可能失败的错误情况,并生成关于发生的情况的详细说明性错误消息,这样您将获得更好的结果。