为什么我不能通过 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);
当我运行SQL在MySQLWorkbench时,它returns想要的结果:
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 准备语句时,它无法准备它 (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 workbench 中有效,而不是在 PHP 代码中,我能做些什么来修复它吗?
您收到一条错误消息 Fatal error: Call to a member function execute() on a non-object
。
需要说明的是,这是 PHP 错误消息,而不是 MySQL 错误消息。该错误与您的查询字符串或数据库完全无关。
您的代码如下所示:$conn->prepare(...)
。
发生错误是因为 PHP 无法识别 $conn
变量。您可能认为 $conn
是 MySQL 连接对象,但是 PHP 在您调用它时正在查看 $conn
并看到 null
(或者可能是 false
或其他一些非对象值)。这就是它给出此错误的原因。
您没有向我们展示足够的代码来让我解释为什么它可能会这样做;可能你在一个函数中并且没有将 $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
我在准备好的语句中有以下查询:
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);
当我运行SQL在MySQLWorkbench时,它returns想要的结果:
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 准备语句时,它无法准备它 (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 workbench 中有效,而不是在 PHP 代码中,我能做些什么来修复它吗?
您收到一条错误消息 Fatal error: Call to a member function execute() on a non-object
。
需要说明的是,这是 PHP 错误消息,而不是 MySQL 错误消息。该错误与您的查询字符串或数据库完全无关。
您的代码如下所示:$conn->prepare(...)
。
发生错误是因为 PHP 无法识别 $conn
变量。您可能认为 $conn
是 MySQL 连接对象,但是 PHP 在您调用它时正在查看 $conn
并看到 null
(或者可能是 false
或其他一些非对象值)。这就是它给出此错误的原因。
您没有向我们展示足够的代码来让我解释为什么它可能会这样做;可能你在一个函数中并且没有将 $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