mysql_error

(PHP 4, PHP 5)

mysql_error返回先前 MySQL 操作的错误消息文本

警告

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

描述

mysql_error(resource $link_identifier = NULL): string

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

参见

添加备注

用户贡献的备注 14 备注

8
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 数据库后端的错误不再发出警告。” 这并不正确。
4
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=
"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 );
}

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

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

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

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

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

此错误发生在未经授权的用户尝试进行 SQL 插入操作时。结果:mysql_errno = 0 且 mysql_error = ""。
-3
匿名
19 年前
我建议的 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
-3
josh ><>
20 年前
糟糕,我之前帖子的代码仅适用于不返回数据的查询(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;
}
-4
scott at rocketpack dot net
21 年前
我建议的 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
-4
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());
}
?>
-5
Gianluigi_Zanettini-MegaLab.it
17 年前
"来自 MySQL 数据库后端的错误不再发出警告。"请注意,这里存在错误/错误。实际上,MySQL 5.1 与 PHP 5.2

Warning: mysql_connect() [function.mysql-connect]: Unknown MySQL server host 'locallllllhost' (11001)

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

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

https://www.mysqlserver.cn/doc/en/Error-returns.html
-8
Gerrit
9 年前
以下代码返回两次相同的错误,即使我希望只返回一次

$ 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。
To Top