如果您想显示类似“拒绝访问...”的错误,而 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=
"Env: " . $_SERVER['SERVER_NAME'] . "\r\n" .
"timestamp: " . Date('m/d/Y H:i:s') . "\r\n" .
"script: " . $_SERVER['PHP_SELF'] . "\r\n" .
"error: " . $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, 'error: '.$message, $serror, 'From: ' . $system_from_mail );
}
?>
请注意,如果您使用多个 MySQL 连接,则必须支持 mysql_error() 函数的链接标识符。否则您的错误消息将为空。
我花了 30 分钟才弄清楚为什么我看不到我的 SQL 错误。
通过修改 josh ><> 的函数,我创建了以下内容。它的目的是使用数据库来存储错误。它处理原始查询以及错误日志。由于我在 q() 中使用它,因此也包含了 Larry Ullman 的 escape_data()。
<?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 error ".mysql_errno().": ".mysql_error()."\n<br>When executing:<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("Sample Page Title",$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>A fatal MySQL error occured</b>.\n<br />Query: " . $query . "<br />\nError: (" . mysql_errno() . ") " . mysql_error());
这将打印类似以下的内容...
A fatal MySQL error occured.
Query: SELECT * FROM table
Error: (err_no) Bla bla bla, you did everything wrong
查看您的查询以检测语法问题非常有用。大多数情况下,MySQL 的输出消息不会在错误消息中显示足够的查询信息,以供您查看查询出错的位置 - 可能在检测到错误之前很久就出现了一个缺少的引号、逗号或 ( 或 )。但是,我不建议将此过程用于在您的站点上执行的非用户特定的查询,因为它有可能泄露敏感数据。建议仅用于调试/构建脚本,以及用于一般的用户特定查询,这些查询在最坏的情况下只会将用户的个人信息泄露给他们自己。
祝您好运,
-Scott
糟糕,我之前帖子的代码仅适用于不返回数据的查询(INSERT、UPDATE、DELETE 等),此更新后的函数应该适用于所有类型的查询(使用 $result = myquery($query);)
function myquery ($query) {
$result = mysql_query($query);
if (mysql_errno())
echo "MySQL error ".mysql_errno().": ".mysql_error()."\n<br>When executing:<br>\n$query\n<br>";
return $result;
}
我建议的 mysql_error() 实现
$result = mysql_query($query) or die("<b>A fatal MySQL error occured</b>.\n<br />Query: " . $query . "<br />\nError: (" . mysql_errno() . ") " . mysql_error());
这将打印类似以下的内容...
<b>A fatal MySQL error occured</b>.
Query: SELECT * FROM table
Error: (err_no) Bla bla bla, you did everything wrong
查看您的查询以检测语法问题非常有用。大多数情况下,MySQL 的输出消息不会在错误消息中显示足够的查询信息,以供您查看查询出错的位置 - 可能在检测到错误之前很久就出现了一个缺少的引号、逗号或 ( 或 )。但是,我不建议将此过程用于在您的站点上执行的非用户特定的查询,因为它有可能泄露敏感数据。建议仅用于调试/构建脚本,以及用于一般的用户特定查询,这些查询在最坏的情况下只会将用户的个人信息泄露给他们自己。
祝您好运,
-Scott
我的一个朋友提出一个很棒的解决方案。
<?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 数据库后端的错误不再发出警告。"请注意,这里存在错误/错误。实际上,MySQL 5.1 与 PHP 5.2
Warning: mysql_connect() [function.mysql-connect]: Unknown MySQL server host 'locallllllhost' (11001)
这是一个警告,不会被 mysql_error() 捕获!
这是一个大问题 - 从 MySQL 4.1 及更高版本开始,显然,密码的哈希方式发生了变化。PHP 4.x 与此更改不兼容,但 PHP 5.0 兼容。由于各种兼容性原因,我仍在使用 4.x 系列,因此,当我将 MySQL 5.0.x 设置在运行 PHP 4.4.4 的 IIS 6.0 上时,我惊讶地发现 mysql_error() 返回了此错误。
MYSQL: Client does not support authentication protocol requested by server; consider upgrading MySQL client
根据 MySQL 网站 (https://dev.mysqlserver.cn/doc/refman/5.0/en/old-client.html),解决此问题的最佳方法是使用 OLD_PASSWORD() 函数为您的 mysql DB 用户设置密码。您可以通过对 MySQL 发出以下命令来重置它
Set PASSWORD for 'user'@'host' = OLD_PASSWORD('password');
这拯救了我的程序。
以下是您从任何主机语言调用 MySQL 时可能出现的错误代码
https://www.mysqlserver.cn/doc/en/Error-returns.html
以下代码返回两次相同的错误,即使我希望只返回一次
$ conn = mysql_connect ('localhost', 'root', '');
$ conn2 = mysql_connect ('localhost', 'root', '');
mysql_select_db ('db1', $ conn);
mysql_select_db ('db2', $ conn2);
$ result = mysql_query ("select 1 from dual", $ conn);
$ result2 = mysql_query ("select 1 from luad", $ conn2);
echo mysql_error ($ conn) "<hr>".
echo mysql_error ($ conn2) "<hr>".
造成这种情况的原因是 mysql_connect 未按预期工作,因此返回了进一步的连接。由于参数相同,因此返回了对之前链接的进一步引用。因此,第二个 mysql_select_db 也将 $conn 的选定数据库更改为 'db2'。
如果您将第二个连接的连接参数更改为 127.0.0.1,则会返回一个新的连接。除了参数之外,还会强制 mysql_connect() 函数使用 new_link。