我将教你如何为自己钓鱼,而不是通过给你一条鱼来回答你的问题。
以下是我如何构建 SQL...
function example()
{
if (!failed_condition) {/*error handling*/}
else
{
$query1 = '';//Construct queries, NEVER put them in loops.
$result1 = mysql_query($query1);
if ($result1)
{
//success
$query2 = '';
$result2 = mysql_query($query2);
if ($result2)
{
//success
}
else {mysql_error_report($query2,mysql_error(),__FUNCTION__);}
}
else {mysql_error_report($query1,mysql_error(),__FUNCTION__);}
}
}
如您所见,我唯一一次缩进另一个空格是在遇到成功的 SQL 查询时。否则,我会将查询、错误和 PHP 函数的名称交给错误处理服务。
这是错误处理代码...
function mysql_error_report($q,$e,$f)
{
if (!isset($database)) {include('database.php');}
if (isset($_SERVER['HTTP_USER_AGENT'])) {$ua = mysql_real_escape_string($_SERVER['HTTP_USER_AGENT']);} else {$ua = '';}
if (isset($database))
{
if (isset($_SESSION['member_id'])) {$id = $_SESSION['member_id'];} else {$id = 0;}
if (isset($_SESSION)) {$session = mysql_real_escape_string(session_id());} else {$session = 0;}
$ip = mysql_real_escape_string(getenv('REMOTE_ADDR'));
if (ip_version($ip)=='4')
{
$ipsql = "INET_ATON('$ip')";
}
else
{
$ip = ip2long6($ip);
$ipsql = mysql_real_escape_string($ip);
}
$query = mysql_real_escape_string($q);
$error = mysql_real_escape_string($e);
$function = mysql_real_escape_string($f);
if (isset($_SESSION['cms_browser'])) {$browser = mysql_real_escape_string($_SESSION['cms_browser'].' '.$_SESSION['cms_browser_version']);} else {$browser = '';}
if (isset($_SESSION['type'])) {$type = mysql_real_escape_string($_SESSION['type']);} else if (isset($_SESSION['cms_browser'])) {$type = 'Browser';} else {$type = 'Unknown';}
if (isset($_SERVER['REQUEST_URI'])) {$url = $_SERVER['REQUEST_URI'];} else {$url = '';}
$query1 = "INSERT INTO errors_sql (id_session, type, id_user, browser, date, ip, function, mysql_error, mysql_query, url, user_agent) VALUES ('$session', '$type', '$id', '$browser', NOW(), $ipsql, '$function', '$error', '$query', '$url', '$ua')";
$result1 = mysql_query($query1);
if (!$result1) {mysql_error_report_mail($q,$e,$f,$ua);}
}
else {mysql_error_report_mail($q,$e,$f,$ua);}
既然您已经创建了一个日志以便您能够采取行动,那么您需要能够看到正在发生的事情。您需要启用 MySQL 日志记录。由于这与此问题没有直接关系,因此我将简单地给您一个链接...
http://www.jabcreations.com/blog/enable-mysql-logging
一旦达到了这么远,您所需要的就是能够查看实时日志文件,而无需手动重新加载文档。我一直在使用 BareTail,我之前使用的是 TailforWin32。我使用语法高亮,蓝色表示SELECT
,绿色表示UPDATE
,蓝色表示INSERT
和红色表示DELETE
。
让实时 MySQL 日志保持打开状态,当您遇到问题时,请检查它。
我还强烈建议您记录所有 PHP、JavaScript 和 HTTP 错误。如果您真的想全力以赴踢驴,请将 PHP 的错误报告灵敏度调到最大...
error_reporting(E_ALL);
...它会迫使你使用isset()
.
随时要求澄清并享受自己钓鱼的能力。;-)