2015-11-28 3 views
-1

У меня есть следующий запрос в подготовленном заявлении:Почему я не могу вызвать хранимую функцию MySQL в подготовленном запросе через 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 в 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 | hello[email protected] | 1 

Когда я бегу, что с помощью PHP MySQLi подготовленное заявление, его не удается его подготовить (Fatal error: Call to a member function execute() on a non-object). Если я вывожу вызов функции, он работает нормально.

EDIT код 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, но PHP смотрит на $conn, когда вы его вызываете, и видя null (или, возможно, false или какое-то другое значение не объекта). Вот почему он дает эту ошибку.

Вы не показали нам достаточно кода для объяснения , почему он может это сделать; возможно, вы находитесь в функции и не прошли $conn, но есть и другие возможные причины. Как я не могу быть уверен, я оставлю вас оттуда оттуда.

+0

Спасибо за ответ Spudley. Я упомянул, что если я выберу вызов хранимой функции в самом запросе, запрос будет работать так же, как и следовало бы (за исключением 'count_client_locations (cid) AS loc_cnt' в выбранных столбцах. Я также упомянул, что запрос не подходит подготовить.Мой фактический вопрос заключался в том, почему исходный запрос работает на MySQL Workbench, но не в PHP-коде (как я думал, если он работает в одном, он работает в другом). Однако я только что исправил свою проблему. – dan

+1

Да; «подготовка» не сработала (на уровне MySQL) и вернула «false», а потому, что вы на ней вместо этого вызывали «prepare()», а не проверяли возвращаемое значение для состояния ошибки, вы эффективно выполняли «false-> prepare() 'в PHP, что привело к ошибке PHP, которую вы действительно видели. –