2015-11-28 8 views
-1

我有一份声明以下查询:服务器count_client_locations为什么我不能通过PHP在准备好的查询中调用MySQL存储的函数?

SELECT 
    cid, cname, cemail, count_client_locations(cid) AS loc_cnt 
FROM 
    clients 
WHERE isactive = 1 ORDER BY cname ASC 

我有一个存储功能。函数的查询部分看起来是这样的:

RETURN (SELECT COUNT(lid) FROM locations WHERE linked_client = cid); 

当我运行在MySQL Workbench中的SQL,它返回所期望的结果:

cid | cname  | cemail   | loc_cnt 
------------------------------------------------ 
2 | Acme Inc | [email protected] | 3 
1 | Example Ind | [email protected] | 5 
3 | Foobar Inc | [email protected] | 0 
1 | Barfoo Ltd | [email protected] | 1 

当我运行通过PHP的mysqli准备好的声明中,它未能准备(Fatal error: Call to a member function execute() on a non-object)。如果我把这个函数的调用取出来,它可以正常工作。

编辑PHP代码:

$sql = $conn->prepare("SELECT cid, cname, cemail, count_client_locations(cid) AS loc_cnt FROM clients WHERE isactive = 1 ORDER BY cname ASC"); 
$sql->execute(); 

那么,为什么在MySQL工作台此查询工作,而不是在PHP代码,有什么我可以做些什么来解决呢?

+0

@Drew - 我不确定我是否遵循你的意思。我得到了什么错误?查询? – dan

+0

http://stackoverflow.com/questions/12769982/reference-what-does-this-error-mean-in-php/12769983#12769983' – Drew

+0

没有什么真正革命性的吧 – Drew

回答

0

所以,回答我的问题,为什么查询在MySQL Workbench中工作,而不是在PHP代码,因为我没有指定该数据库存储的函数调用:

SELECT 
    cid, cname, cemail, DBName.count_client_locations(cid) AS loc_cnt 
FROM 
    clients 
WHERE isactive = 1 ORDER BY cname ASC 
+1

你也可以为连接指定一个默认的数据库,在这一点上你不需要为每个语句指定它(当创建一个新的mysqli连接时,它是一个可选参数。) –

+0

是的,我已经改变了我的连接。谢谢你的提示! – dan

0

您会收到一条错误消息Fatal error: Call to a member function execute() on a non-object

只是要清楚,这是一个PHP错误消息,而不是MySQL错误消息。该错误与您的查询字符串或数据库无关。

您的代码如下所示:$conn->prepare(...)

由于PHP无法识别$conn变量,因此发生该错误。您可能认为$conn是MySQL连接对象,但当您调用它并看到null(或可能是false或某些其他非对象值)时,PHP正在查看$conn。这就是它给出这个错误的原因。

您没有向我们展示足够的代码来解释为什么它可能会这样做;可能你是一个函数,并没有通过$conn进去,但也有其他可能的原因。因为我不能确定,我会让你从那里开始工作。

+0

感谢您的回答Spudley。我确实提到过,如果我在查询本身中调用存储函数,那么查询就会按照它应该的方式工作(减去所选列中的'count_client_locations(cid)AS loc_cnt'。我也提到查询失败准备。我的实际问题是原始查询为什么在MySQL Workbench上工作,而不是在PHP代码中(因为我认为如果它在一个工作在另一个中)。不过,我只是解决了我的问题。 – dan

+1

是的; 'prepare'失败了(在MySQL级别)并返回'false',并且由于您之后调用了'prepare()'而不是检查返回值是否存在错误状态,所以您正在有效地执行'false-> prepare ()'在PHP中,这导致了你实际看到的PHP错误。 –

相关问题