如果要显示类似“拒绝访问...”的错误,当 mysql_error() 返回 "" 且 mysql_errno() 返回 0 时,使用 $php_errormsg。此警告将存储在那里。您需要在 php.ini 中将 track_errors 设置为 true。
注意。关于 error_reporting() 或 mysql_error() 函数的文档中存在错误,因为 mysql_error() 的手册说:“来自 MySQL 数据库后端的错误不再发出警告。” 这并不正确。
(PHP 4, PHP 5)
mysql_error — 返回上一个 MySQL 操作的错误消息文本
此扩展在 PHP 5.5.0 中已弃用,并在 PHP 7.0.0 中移除。应改用 MySQLi 或 PDO_MySQL 扩展。另请参阅 MySQL:选择 API 指南。此函数的替代方案包括
返回上一个 MySQL 函数的错误文本。来自 MySQL 数据库后端的错误不再发出警告。相反,使用 mysql_error() 来检索错误文本。请注意,此函数仅返回最近执行的 MySQL 函数的错误文本(不包括 mysql_error() 和 mysql_errno()),因此,如果要使用它,请确保在调用另一个 MySQL 函数之前检查其值。
link_identifier
MySQL 连接。如果未指定链接标识符,则假定为 mysql_connect() 打开的最后一个链接。如果找不到此类链接,它将尝试创建一个链接,就像 mysql_connect() 没有参数被调用一样。如果找不到或建立连接,则会生成 E_WARNING
级别的错误。
返回上一个 MySQL 函数的错误文本,如果未发生错误则返回 ''
(空字符串)。
示例 #1 mysql_error() 示例
<?php
$link = mysql_connect("localhost", "mysql_user", "mysql_password");
mysql_select_db("nonexistentdb", $link);
echo mysql_errno($link) . ": " . mysql_error($link). "\n";
mysql_select_db("kossu", $link);
mysql_query("SELECT * FROM nonexistenttable", $link);
echo mysql_errno($link) . ": " . mysql_error($link) . "\n";
?>
上面的示例将输出类似以下内容
1049: Unknown database 'nonexistentdb' 1146: Table 'kossu.nonexistenttable' doesn't exist
如果要显示类似“拒绝访问...”的错误,当 mysql_error() 返回 "" 且 mysql_errno() 返回 0 时,使用 $php_errormsg。此警告将存储在那里。您需要在 php.ini 中将 track_errors 设置为 true。
注意。关于 error_reporting() 或 mysql_error() 函数的文档中存在错误,因为 mysql_error() 的手册说:“来自 MySQL 数据库后端的错误不再发出警告。” 这并不正确。
在创建大型应用程序时,创建用于处理查询的自定义函数非常方便。只需在每个脚本中包含此函数即可。并使用 db_query(在此示例中)代替 mysql_query。
此示例在调试模式(变量 $b_debugmode)中提示错误。否则,将向网站运营商发送包含错误的电子邮件。
脚本还写入目录(在本例中为 /log)中的日志文件。
当数据库/查询信息提示给访客时,系统容易受到攻击。因此,请务必始终对访客隐藏此信息。
此致
Lennart Poot
http://www.twing.nl
<?php
$b_debugmode = 1; // 0 或 1
$system_operator_mail = '[email protected]';
$system_from_mail = '[email protected]';
function db_query( $query ){
global $b_debugmode;
// 执行查询
$result = mysql_query($query);
// 检查结果
// 这显示了发送到 MySQL 的实际查询以及错误。对于调试很有用。
if (!$result) {
if($b_debugmode){
$message = '<b>无效查询:</b><br>' . mysql_error() . '<br><br>';
$message .= '<b>完整查询:</b><br>' . $query . '<br><br>';
die($message);
}
raise_error('db_query_error: ' . $message);
}
return $result;
}
function raise_error( $message ){
global $system_operator_mail, $system_from_mail;
$serror=
"环境: " . $_SERVER['SERVER_NAME'] . "\r\n" .
"时间戳: " . Date('m/d/Y H:i:s') . "\r\n" .
"脚本: " . $_SERVER['PHP_SELF'] . "\r\n" .
"错误: " . $message ."\r\n\r\n";
// 打开日志文件并写入错误
$fhandle = fopen( '/logs/errors'.date('Ymd').'.txt', 'a' );
if($fhandle){
fwrite( $fhandle, $serror );
fclose(( $fhandle ));
}
// 将错误邮件发送给系统操作员
if(!$b_debugmode)
mail($system_operator_mail, '错误:'.$message, $serror, 'From: ' . $system_from_mail );
}
?>
请注意,如果您使用多个 MySQL 连接,则必须为 mysql_error() 函数提供链接标识符。否则,您的错误消息将为空。
我花了 30 分钟才弄清楚为什么我看不到我的 SQL 错误。
使用对 josh ><> 函数的修改,我创建了以下内容。其目的是使用数据库来存储错误。它处理原始查询以及错误日志。还包括 Larry Ullman 的 escape_data(),因为我在 q() 中使用它。
<?php
function escape_data($data){
global $dbc;
if(ini_get('magic_quotes_gpc')){
$data=stripslashes($data);
}
return mysql_real_escape_string(trim($data),$dbc);
}
function q($page,$query){
// $page
$result = mysql_query($query);
if (mysql_errno()) {
$error = "MySQL 错误 ".mysql_errno().": ".mysql_error()."\n<br>执行时:<br>\n$query\n<br>";
$log = mysql_query("INSERT INTO db_errors (error_page,error_text) VALUES ('$page','".escape_data($error)."')");
}
}
// 使用 q() 运行查询
$query = "INSERT INTO names (first, last) VALUES ('myfirst', 'mylast'");
$result = q("示例页面标题",$query);
?>
在处理用户输入时,请确保使用
<?php
echo htmlspecialchars (mysql_error ());
?>
而不是
<?php
echo mysql_error ();
?>
否则,可能可以通过提交导致 SQL 查询失败并包含 javascript 命令的数据来入侵您的系统。
是否应该相应地更改 mysql_query() 和 mysql_error() 文档中的示例?
某些错误无法处理。例如
ERROR 1044: Access denied for user: '[email protected]' to database 'itcom'
当未经授权的用户尝试执行 SQL 插入操作时,会出现此错误。结果:mysql_errno = 0 且 mysql_error = ""。
我建议的 mysql_error() 实现
$result = mysql_query($query) or die("<b>发生了致命的 MySQL 错误</b>.\n<br />查询: " . $query . "<br />\n错误:(" . mysql_errno() . ") " . mysql_error());
这将打印类似以下内容...
发生了致命的 MySQL 错误。
查询:SELECT * FROM table
错误:(错误编号) 等等,你犯了所有错误
查看您的查询以检测语法问题非常有用。大多数情况下,MySQL 的输出消息不会让您在错误消息中看到足够的查询内容,以了解您的查询在何处出错 - 缺少引号、逗号或 ( 或 ) 可能在检测到错误之前很久就发生了。但是,我不建议对您网站上执行的非用户特定查询使用此过程,因为它有可能泄漏敏感数据。建议仅用于调试/构建脚本,以及对于一般用户特定查询,这些查询在最坏的情况下,只会将用户自己的信息泄漏给他们自己。
祝你好运,
-Scott
我建议的 mysql_error() 实现
$result = mysql_query($query) or die("<b>发生了致命的 MySQL 错误</b>.\n<br />查询: " . $query . "<br />\n错误:(" . mysql_errno() . ") " . mysql_error());
这将打印类似以下内容...
<b>发生了致命的 MySQL 错误</b>。
查询:SELECT * FROM table
错误:(错误编号) 等等,你犯了所有错误
查看您的查询以检测语法问题非常有用。大多数情况下,MySQL 的输出消息不会让您在错误消息中看到足够的查询内容,以了解您的查询在何处出错 - 缺少引号、逗号或 ( 或 ) 可能在检测到错误之前很久就发生了。但是,我不建议对您网站上执行的非用户特定查询使用此过程,因为它有可能泄漏敏感数据。建议仅用于调试/构建脚本,以及对于一般用户特定查询,这些查询在最坏的情况下,只会将用户自己的信息泄漏给他们自己。
祝你好运,
-Scott
糟糕,我之前帖子中的代码仅适用于不返回数据的查询(INSERT、UPDATE、DELETE 等),此更新后的函数应该适用于所有类型的查询(使用 $result = myquery($query);)
function myquery ($query) {
$result = mysql_query($query);
if (mysql_errno())
echo "MySQL 错误 ".mysql_errno().": ".mysql_error()."\n<br>执行时:<br>\n$query\n<br>";
return $result;
}
我的一个朋友提出了一个很棒的解决方案。
<?php
$old_track = ini_set('track_errors', '1');
.....
if ($this->db_handle!=FALSE && $db_selection_status!=FALSE)
{
$this->connected=1;
ini_set('track_errors', $old_track);
}
else
{
$this->connected=-1;
$mysql_warning=$php_errormsg;
ini_set('track_errors', $old_track);
throw new mysql_cns_exception(1, $mysql_warning . " " . mysql_error());
}
?>
“来自 MySQL 数据库后端的错误不再发出警告。” 请注意,这里存在错误/bug。实际上,MySQL 5.1 与 PHP 5.2
警告:mysql_connect() [function.mysql-connect]:未知的 MySQL 服务器主机 'locallllllhost' (11001)
这是一个警告,mysql_error() 无法捕获!
这是一个大问题 - 从 MySQL 4.1 及更高版本开始,显然,密码的哈希方式发生了变化。PHP 4.x 与此更改不兼容,而 PHP 5.0 兼容。由于各种兼容性原因,我仍在使用 4.x 系列,因此当我在运行 PHP 4.4.4 的 IIS 6.0 上设置 MySQL 5.0.x 时,我惊讶地从 mysql_error() 收到了此错误
MYSQL:客户端不支持服务器请求的身份验证协议;请考虑升级 MySQL 客户端
根据 MySQL 网站 (https://dev.mysqlserver.cn/doc/refman/5.0/en/old-client.html),解决此问题的最佳方法是为您的 mysql 数据库用户使用 OLD_PASSWORD() 函数。您可以通过向 MySQL 发出以下命令来重置它
Set PASSWORD for 'user'@'host' = OLD_PASSWORD('password');
这救了我。
以下是当您从任何主机语言调用 MySQL 时可能出现的错误代码
https://mysqlserver.cn/doc/en/Error-returns.html