PHP Conference Japan 2024

mysql_error

(PHP 4, PHP 5)

mysql_error返回上一个 MySQL 操作的错误消息文本

警告

此扩展在 PHP 5.5.0 中已弃用,并在 PHP 7.0.0 中移除。应改用 MySQLiPDO_MySQL 扩展。另请参阅 MySQL:选择 API 指南。此函数的替代方案包括

描述

mysql_error(资源 $link_identifier = NULL): 字符串

返回上一个 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

参见

添加注释

用户贡献的注释 13 个注释

aleczapka _at) gmx dot net
20 年前
如果要显示类似“拒绝访问...”的错误,当 mysql_error() 返回 "" 且 mysql_errno() 返回 0 时,使用 $php_errormsg。此警告将存储在那里。您需要在 php.ini 中将 track_errors 设置为 true。

注意。关于 error_reporting() 或 mysql_error() 函数的文档中存在错误,因为 mysql_error() 的手册说:“来自 MySQL 数据库后端的错误不再发出警告。” 这并不正确。
l dot poot at twing dot nl
18 年前
在创建大型应用程序时,创建用于处理查询的自定义函数非常方便。只需在每个脚本中包含此函数即可。并使用 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 );
}

?>
Florian Sidler
14 年前
请注意,如果您使用多个 MySQL 连接,则必须为 mysql_error() 函数提供链接标识符。否则,您的错误消息将为空。

我花了 30 分钟才弄清楚为什么我看不到我的 SQL 错误。
Pendragon Castle
15 年前
使用对 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);
?>
olaf at amen-online dot de
20 年前
在处理用户输入时,请确保使用
<?php
echo htmlspecialchars (mysql_error ());
?>
而不是
<?php
echo mysql_error ();
?>

否则,可能可以通过提交导致 SQL 查询失败并包含 javascript 命令的数据来入侵您的系统。

是否应该相应地更改 mysql_query() 和 mysql_error() 文档中的示例?
匿名用户
23 年前
某些错误无法处理。例如

ERROR 1044: Access denied for user: '[email protected]' to database 'itcom'

当未经授权的用户尝试执行 SQL 插入操作时,会出现此错误。结果:mysql_errno = 0 且 mysql_error = ""。
匿名用户
19 年前
我建议的 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
scott at rocketpack dot net
21 年前
我建议的 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
josh ><>
21 年前
糟糕,我之前帖子中的代码仅适用于不返回数据的查询(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;
}
Gianluigi_Zanettini-MegaLab.it
17 年前
我的一个朋友提出了一个很棒的解决方案。

<?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());
}
?>
Gianluigi_Zanettini-MegaLab.it
17 年前
“来自 MySQL 数据库后端的错误不再发出警告。” 请注意,这里存在错误/bug。实际上,MySQL 5.1 与 PHP 5.2

警告:mysql_connect() [function.mysql-connect]:未知的 MySQL 服务器主机 'locallllllhost' (11001)

这是一个警告,mysql_error() 无法捕获!
phpnet at robzazueta dot com
17 年前
这是一个大问题 - 从 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');

这救了我。
miko_il AT yahoo DOT com
20 年前
以下是当您从任何主机语言调用 MySQL 时可能出现的错误代码

https://mysqlserver.cn/doc/en/Error-returns.html
To Top