2016-04-20 147 views
1

我已經徹底檢查了各處,並且已經盡一切可能找到答案。除了說「代碼不起作用」,這顯然是不夠的,我還沒有找到任何甚至會接近這一點的東西。我可能會得到低估,但讓我們看看這是怎麼回事。MySQLi多個準備語句

我正在學習如何爲用戶端的搜索查詢準備好語句,而且我必須爲多個查詢執行此操作。我必須將參數綁定到這些多個查詢,然後執行它們並使用它們並接收多行。這是我的大部分代碼,並且我目前有而不是報告任何錯誤。它只是返回一個空白的白頁。

我正在從一個簡單的test.php文件這樣做,這些都是我得到的結果。

現在的代碼。

$prep1 = $test->prepare("SELECT * FROM sb__bans WHERE sb__bans.authid=? ORDER BY sb__bans.bid DESC"); 
$prep2 = $test->prepare("SELECT * FROM sb__bans AS bans INNER JOIN sb__admins AS admins ON bans.aid = admins.aid WHERE bans.authid=? ORDER BY bans.bid DESC"); 
$prep3 = $test->prepare("SELECT * FROM sb__bans AS bans INNER JOIN sb__servers AS servers ON bans.sid = servers.sid WHERE bans.authid=? ORDER BY bans.bid DESC"); 

$search = "steam"; 

$prep1->bind_param("s", $search); 
$prep2->bind_param("s", $search); 
$prep3->bind_param("s", $search); 

$prep1->execute(); 
$prep2->execute(); 
$prep3->execute(); 

while($row = $prep1->fetch() && $admin = $prep2->fetch() && $sv = $prep3->fetch()) { 
echo $row['test']; 
echo $admin['test']; 
echo $sv['test']; 
} 

數據庫上面這個初始化爲$test = new mysqli("localhost", "test", "test", "test");

$search = "steam"蒸汽將與課程後變量代替,但是出於測試的原因,我已刪除了現在和我只是一個簡單的測試變量。

這似乎是什麼問題?

在此先感謝。

+0

爲什麼3個查詢?你可以只做一個。 – rmondesilva

回答

-1

兩點:

  1. 根據個人經驗,你只能有存在一個準備的語句在同一時間。我懷疑這是因爲數據庫要求每個PS具有會話唯一名稱,並且PHP層傳遞一些通用的默認名稱,而不是爲每個PS生成唯一的名稱。相比之下,PostgreSQL驅動程序允許爲每個PS指定一個可選名稱,但仍然只允許存在一個未命名的 PS。本質上這意味着你必須prepare,bind, executefetch一個PS 完全之前,你可以prepare下一個PS。

  2. 您錯了mysqli_stmt::fetch()fetch()僅返回truefalse,用於更新之前與mysqli_stmt::bind_result()綁定的變量。要將值檢索到$row陣列中,您必須先撥打mysqli_stmt::get_result()返回mysqli_result,然後再撥打mysqli_result::fetch_array()

+0

我已經對它們進行了排序,以便一次只准備一個,然後綁定結果(因爲我無法使用get_result,因爲我沒有mysqlnd),然後使用fetch_array,但是在獲取該錯誤之前它能夠獲取數組'PHP警告:mysqli_stmt :: bind_result():綁定變量的數量與預準備語句中的字段數量不匹配 – Joel

+0

如果您正在執行'SELECT *',則必須爲'bind_result()'提供儘可能多的變量是表中的列。你可能會發現使用[PDO](http://php.net/manual/en/book.pdo.php)更容易做到這一點。 –

+0

我不知道。謝謝。我接受了你的建議,決定重寫它來使用PDO,現在一切似乎都奏效了。我現在留下的唯一問題是由於某種原因empty()不能在清晰的空數組上工作。不過,我會另存一個問題。謝謝您的幫助。 – Joel

0

關於您提出的一般問題。

準備好多個查詢沒有任何問題。雖然說到從準備好的查詢中獲取結果,但確實存在由結果緩衝引起的問題。爲了能夠執行另一個查詢,您必須在執行後立即調用store_result()/ get_result()。

關於您遇到的特定問題。

  1. 獲取錯誤you have to ask PHP for them
  2. 做出三個查詢是絕對沒有意義的,你必須做出一個。如果你在製作一個問題時遇到麻煩,可以問問另一個問題,用mysql標記標記它,然後帶上3個查詢。
  3. 即使對於多個查詢,在單個循環中執行多次讀取也是錯誤的想法。逐個提取查詢結果。
  4. 即使對於單個查詢,您的mysqli語法也是不完整的。你需要重新閱讀你的教程,並首先在單個查詢上練習。