如果mysql_query()失败了,该怎么办?

10

有时候,mysql_query() 失败了,导致数据无法插入,而我并不知道。那么问题来了,如何知道它失败了呢?


3
我认为这个问题不应该被踩。它虽然基础,但措辞合理,到目前为止的回答也很真诚。来自 Pod Six 的家伙们需要停止这种行为。 - Drew
9个回答

11
引用mysql_query的文档页面:
对于返回结果集的SELECTSHOWDESCRIBEEXPLAIN和其他语句,mysql_query()在成功时返回一个resource,在错误时返回FALSE
对于其他类型的SQL语句,如INSERTUPDATEDELETEDROP等,mysql_query()在成功时返回TRUE,在错误时返回FALSE
因此,要检测是否发生错误,您需要测试对mysql_query的调用的返回值。
$result = mysql_query('...');
if ($result === false) {
    // And error has occured while executing
    // the SQL query
}

那么,你能做些什么呢?
  • 首先,你可以将错误记录到一个文件中,以便以后分析
  • 然后,你可以向用户显示一个友好的错误信息
    • 例如,一种类似于“哎呀,出错了”的页面。

不过要记住:用户不需要知道(也不会理解)技术性的错误信息,所以不要显示出来。


如果查询失败,你一定要使用mysql_error()。它并不总是非常有用,特别是当你有一个很大的查询时。但它可能会帮助你诊断问题所在。 - Steve Hill

3

我通常进行的一个检查,类似于这个例子:

$result = mysql_query( $query );
if ( !empty( $error = mysql_error() ) )
{
    echo 'Mysql error '. $error ."<br />\n";
}
else
{
    // the query ran successfully
}

这是任何类型查询的好检查方式。


1
不错的技巧,但在生产环境中你不想这样做,因为 SQL 注入攻击者将会更容易地利用你的弱点。 - Johan

3
您可以使用mysql_error php.net/mysql_error来获得更好的解释,然后将其显示或记录在文件中。

1
建议创建一个包装器(wrapper)来检测mysql_query的失败,并将查询(query)和mysql_error记录在某个地方。

1
如果您使用的是一个明智的客户端库,当 SQL 命令失败时它会抛出一个异常,您可以通过编程方式检查错误代码以了解该怎么做。
如果您没有处理特定错误路径的代码,那么您应该运行一个标准的错误处理程序,将错误、堆栈跟踪和一些其他调试信息记录到日志中。

0

0

你需要分析你的SQL语句。你转义了参数吗?听起来可能是这个问题。你可以贴出你的SQL语句,这样我们可以帮助你。

为了显示错误,你可以例如:

$result = mysql_query($query) or die ("Error in query: $query. ".mysql_error());

.


4
虽然这是解析失败原因的好答案,但我认为它并没有回答提问者想知道的内容。我认为提问者想知道的是如何确定何时出现故障,而不是什么可能导致它出现故障。 - Chris Thompson

0
如果错误的原因是死锁,您可能需要再试一次。

-2

你可以尝试使用LAST_INSERT_ID()函数(在PHP中为mysql_insert_id()函数)。前提是你的表必须有自增列。


如果mysql_insert_id()返回0且您的表具有auto_increment列,则最后一次插入失败了。不过,我更喜欢mysql_error。 - Phil Rykoff
-1,last_insert_id()会显示上一个插入操作的插入编号,如果此次插入失败,则会在(可能是另一个)表中显示。毫无意义。 - Johan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接