2012-10-08 51 views
1

我使用mysqli函數(mysqli_connect, mysqli_select_db, mysqli_query)來調用1個select查詢和2個存儲過程。

看來,當我使用的是相同的$connection(由mysqli_connect返回)多次,我收到以下錯誤消息:"Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in..."

下面是我的代碼:

<?php 
$server="localhost"; 
$user="user"; 
$pass="pass"; 
$db="db"; 

$connection=mysqli_connect("$server","$user","$pass"); 
mysqli_select_db($connection, "$db") or die('Unable to select database.'); 

//First SELECT using $connection 
$query=mysqli_query($connection, "SELECT item_name FROM items ORDER BY item_name DESC");  

While ($result=mysqli_fetch_array($query,MYSQL_NUM)) 
{ 
    $complete_result[] = $result[0]; 
    $total_rows = $total_rows + 1; 
} 

//CALL to first sp using $connection 
$query2 = mysqli_query($connection, "CALL sp_check_edits_remaining()"); 

while ($row2 = mysqli_fetch_array($query2, MYSQL_ASSOC)) { 
    $edits_remaining = $row2['edits_remaining']; 
} // End while 

//CALL to second sp using $connection 
$query3 = mysqli_query($connection, "CALL sp_edit_data"); 

while ($row3 = mysqli_fetch_array($query3, MYSQL_ASSOC)) {); 
    $edits_id = $row3['id']; 
} // End while 

?> 

就像我描述,當我調用第二個sp時,上面的代碼給了我上面提到的錯誤信息。 (請注意,連接永遠不會關閉。)

但是,當我創建另一個連接並將其提供給第二個sp調用時,此錯誤消失。這顯示在下面的代碼

$connection2=mysqli_connect("$server","$user","$pass"); 
mysqli_select_db($connection2, "$db") or die('Unable to select database.'); 

//CALL to second sp using $connection 
$query3 = mysqli_query($connection2, "CALL sp_edit_data"); 

while ($row3 = mysqli_fetch_array($query3, MYSQL_ASSOC)) { 
    $edits_id = $row3['id']; 
} // End while 

任何人都可以請幫我爲什麼這種意想不到的行爲? 非常感謝!

回答

2

看來我找到了一個解決方案,這可能是特定於我的方案。

我的存儲過程只返回結果集中的一行。

所以,該呼叫到第一個SP和相應的while循環中,我已簡單地添加後:

mysqli_next_result($connection); 

這已經移除了錯誤消息/警告我被接收。

任何人都想評論這是否是「專業」方法?

+0

太好了。謝謝... – Sayka

1

某處出現錯誤,導致其中一個mysql函數(可能是查詢調用)返回一個布爾值false,然後您在提取調用中盲目地使用它。您需要添加額外的錯誤處理,例如

$query = mysqli_query($connection, "...") or die(mysqli_error($connection));  

永不假定查詢成功。

+0

嗨,謝謝你的回覆;但正如我所說的,當我提供第二個$連接(在上例中稱爲$ connection2)時,此錯誤消失。那麼,可能會出現什麼問題呢?順便說一句,我也改變了CALL爲一個簡單的SELECT * FROM等,但仍然是相同的行爲。 –

+0

可能你的查詢是以非緩衝模式打開的,默認爲mysqli - 在第一個查詢處於打開狀態時運行第二個查詢會導致錯誤,並且沒有錯誤處理。打開第二個連接繞過錯誤。 –

+0

如果sp只返回一行,您是否認爲您在上述評論中描述的問題仍可能發生?另外,我添加了'code' mysqli_store_result($ connection);但仍然沒有改變。 –

0

在此後輸入代碼查詢完成後,您必須關閉$connection然後再進行一次查詢,再次連接並分配$connection

mysqli_close($connection); 

$connection=mysqli_connect(bla,bla,bla,bla).