为什么可以';t我通过PHP在准备好的查询中调用MySQL存储的函数


Why can't I call a MySQL stored function in a prepared query via PHP?

我在准备好的语句中有以下查询:

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

我在服务器count_client_locations上存储了一个函数。函数的查询部分如下所示:

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

当我在MySQL Workbench中运行SQL时,它会返回所需的结果:

cid | cname       | cemail            | loc_cnt
------------------------------------------------
2   | Acme Inc    | fred@example.com  | 3
1   | Example Ind | alice@example.com | 5
3   | Foobar Inc  | joe@example.com   | 0
1   | Barfoo Ltd  | hello@example.com | 1

当我通过PHP-mysqli-prepared语句运行它时,它无法准备它(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代码中无效呢?我能做些什么来修复它吗?

您收到一条错误消息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传递给它,但也有其他可能的原因。由于我不能确定,我将让你从那里解决。

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

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