2010-10-19 88 views
0

我在Linux机器上有PHP 5.2.3,apache2.x,mysql 5.x。事情工作正常,直到昨天。今天早上,突然之间,一个php文件开始抛出“致命错误:调用成员函数execute()中的非对象”。我使用PDO(准备,执行,关闭游标等)。你有没有遇到过这个问题?请有人知道此问题的解决方法。致命错误 - 执行()PHP 5.2.13

非常感谢, [R

+0

当数据库连接无效时,我在'prepare()'上看到这个错误。到目前为止,我还没有在'execute()'中看到它。 – JAL 2010-10-19 20:45:20

回答

0

正如Alan所说,问题可能是prepare正在返回false而不是PDOStatement。调试这个最好的方法是打开警告。要做到这一点,把这个代码,你初始化PDO之后:

$db = new PDO(); // insert the following after this line 
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); 

这将意味着一个PHP警告将通过PDO当准备语句失败得到提升。这应该包含有助于您调试问题的信息。

+0

谢谢LSD,我似乎有错误,在我添加上面的行后,我的SQL语句。让我克服它,看看是否有帮助:)再次感谢! – racky 2010-10-19 21:03:41

+0

谢谢,固定它:) – racky 2010-10-19 21:14:47

2

prepare调用可能失败。这可能是由于SQL语句无效。

我们需要知道您正在使用哪个库才能知道更多,但prepare可能返回的是false而不是对象。然后,当您尝试在返回值上调用execute时,您尝试在false而不是对象上调用它,导致出现错误消息。

如果你echovar_dump你打电话execute的价值,你将能够看到更多的细节。

+0

准备语句中的SQL无效将产生“SQLSTATE [42000]:语法错误或访问冲突”错误,而不是此错误。几乎任何东西都可以成功准备(我刚刚尝试过“asl aslkjd”,它返回了一个PDO语句对象)。 – JAL 2010-10-19 20:41:12

+0

这取决于正在使用的库。该SQL错误可能被SQL访问库或驱动程序转换为null或false返回值,这会导致此错误。 – 2010-10-19 20:42:22

+0

对,我刚刚在PDO手册中看到(关于一些使用模拟准备语句的驱动程序,而没有检查语法)。我使用与racky相同的设置,虽然(php 5.2.3,Mysql 5.1) - 我想知道为什么它会有所不同? – JAL 2010-10-19 20:45:35