У меня есть следующий запрос в подготовленном утверждении:
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 в MySQL Workbench, он возвращает желаемый результат:
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 подготовленный MySQL запрос, он не может подготовить его (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, но 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