2015-11-28 29 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錯誤。 –

相關問題