0

我不确定这是否与另一个问题重复,但我有一个小文件,PHP它调用了一些图像标记系统。大多数情况下,插入和删除都有效,但在某些情况下,插入不起作用。SQL INSERTDELETE

有没有办法查看SQL语句执行失败的原因,类似于在or中使用SQL函数时的情况,如果失败,它会告诉你原因(例如:重复键插入、未终止的引号等)?PythonJava

4

3 回答 3

3

我能想到两件事,还有一件事是我从 amitchhajer 那里偷来的

  • pg_last_error会告诉你会话中的最后一个错误。出于显而易见的原因,这太棒了,您将希望将错误记录到磁盘上的文本文件中,以防问题类似于数据库出现故障。如果您尝试将错误存储在数据库中,您可能会在找出原因的过程中遇到一些 HILARIOUS* hi-jinks。

  • 将每个查询记录到此文本文件,即使是成功的查询。找出问题是否影响相同的操作(再次是您的数据库或连接的问题)或每次的某些查询(您的应用程序的问题。)

  • 如果您有权访问您的服务器(或者您的共享主机很好),请启用并检查数据库的查询日志。但是,如果应用程序和服务器之间存在网络问题,这将无济于事。

但如果我不得不猜测,我会想象当应用程序失败时,它会得到奇怪的输入。十分之九的输入没有正确转义,或者 - 因为您使用的是 PHP,它在类型转换期间作为例行程序谋杀变量 - 它被设置为 FALSE 或 NULL 或其他东西,并且系统正在生成一个损坏的查询喜欢INSERT INTO wizards (hats, cloaks, spell_count) VALUES ('Wizard Hat', 'Robes', );

*实际上并不搞笑

于 2012-08-21T06:12:26.570 回答
2

通过启动日志开始监视您的 SQL 查询。在那里您可以查看所有查询被触发的内容和错误(如果有)。

本教程启动记录器将有所帮助。

于 2012-08-21T06:14:01.097 回答
0

根据您的 PHP 文件使用的 API(希望它是 PDO ;),您可以使用 s.th 检查当前事务中的错误。像

$naughtyPdoStatement->execute();
if ($naughtyPdoStatement->errorCode() != '00000')
    DebuggerOfChoice::log( implode (' ', $naughtyPdoStatement->errorInfo() );

当使用遗留 API 时,有类似mysql_errno, mysql_error,pg_last_error等的等价物......应该能够做到这一点。DebuggerOfChoice::Log当然可以是您想使用的任何日志功能

于 2012-08-21T06:24:42.577 回答