2013-04-23 33 views
0

關於mysqli擴展的php手冊似乎有點輕,我沒有發現任何與Google戳動的信息。函數調用mysqli預處理語句的順序?

當我創建的mysqli準備好的語句,應該調用的順序是

mysqli::prepare() 
mysqli::stmt::bind_param() 
mysqli::stmt::execute() 
mysqli::stmt::store_result() 
mysqli::stmt::bind_result() 

mysqli::prepare() 
mysqli::stmt::bind_param() 
mysqli::stmt::execute() 
mysqli::stmt::bind_result() 
mysqli::stmt::store_result() 

而且,如果我再要更改的參數並重新執行的說法,我應該使用

mysqli::free_result() 
mysqli::stmt::execute() 
mysqli::stmt::store_result() 
mysqli::bind_result() 

或者我可以簡單地使用execute(),然後使用free_result()on我完成了使用該聲明?

+0

我試圖只是運行的功能在這兩個訂單和,毫無疑問,我的測試服務器上的任何命令的作品,但我的生產服務器上,一個爲了工作有時,然後另外的順序工作的時候,但是這種隨時間變化。 – 2013-04-23 18:14:28

+0

如果您在使用某些代碼時遇到問題,最好提出一個關於這個特定代碼的問題,並將其與問題一起提供。但是,我有一種感覺,這不是電話訂單,而是缺少錯誤報告的原因。 – 2013-04-29 19:17:51

回答

1

它不是PHP手冊,但mysqli擴展本身是不明確,曖昧的權力。

然而,要明確你的困惑

  1. 您可以撥打store_result()任何你希望之間準備()和fetch()。事實上,bind_result()只是fetch()的補充功能。

  2. 在PHP中,你很少需要釋放一般什麼,尤其是在這樣的情況下,當結果將在下次調用被覆蓋。所以 - 是的,您可以再次撥打​​(首先使用bind_param())。

還要注意,一些設施將讓你打電話get_result這使得至少有合理的獲取變量的所有過程。但並不總是可用

還要注意的是,無論bind_param()也不bind_result()將讓你輕鬆地結合任意一些變數,這將使甚至代碼更加臃腫。

所以,看所有的爛攤子我還是建議你使用任何PDO或手動實現佔位符,像safeMysql一樣。

+0

我實際上已經找到了一個簡單的解決方案,我一直使用bind_param()和bind_result()。那麼我想它大約比你在PDO上使用的時間長一行,但是,嘿,它就是它的意思。 – 2013-05-01 13:28:57

1

這裏是工作的例子:

$query="SELECT service_ip,service_port FROM users WHERE username=? and password=?"; 
$conn=connection(); 

$stmt = $conn->prepare($query); 
$stmt->bind_param('ss', $user,$pass); 
$ans=$stmt->execute(); 

$service_ip=false; 
$service_port=false; 
$stmt->bind_result($service_ip,$service_port); 

$stmt->fetch(); 

mysqli_free_result($ans); 
$stmt->close(); 
$conn -> close(); 
+0

感謝您的工作代碼,但是,手冊注意到您應該調用store_result來返回結果的所有查詢,並且在代碼中的任何位置都看不到此調用。 – 2013-04-23 19:02:47

+0

我記得我幾個月前學過api,而且我給你的代碼是一個正在運行的生產代碼,我認爲你只是錯過了取回 – Dima 2013-04-23 19:24:35

+0

我發佈的代碼只是綁定的sudo代碼。我也有工作生產代碼,但我列出的調用順序對我的生產服務器有一些問題。該手冊對調用store_result非常明確。另外,打開多個語句將不起作用,除非您調用store_result。 直接從PHP手冊中獲取: 對於成功生成結果集(SELECT,SHOW,DESCRIBE,EXPLAIN)的每個查詢,並且僅當您想緩衝客戶端的完整結果集時,您必須調用mysqli_stmt_store_result ... – 2013-04-23 19:42:14

-1

這裏是正確代碼:

$query="SELECT service_ip,service_port FROM users WHERE username=? and password=?"; 
$stmt = $conn->prepare($query); 
$stmt->execute(array($user,$pass)); 
$data = $stmt->fetch()/fetchAll()/fetchColumn(); 
// whoops! that's all 

// ...in case you want to execute again 
$stmt->execute(array($user2,$pass2)); 
$data = $stmt->fetch()/fetchAll()/fetchColumn(); 

// and again... 
$stmt->execute(array($user3,$pass3)); 
$data = $stmt->fetch()/fetchAll()/fetchColumn(); 

注意,你已經擁有所有必需的數據。感受PDO

+1

我確定PDO很棒,但是這個代碼根本沒有回答這個問題。您的代碼完全無法綁定任何參數或任何結果。 – 2013-04-23 20:43:20

+1

恐怕你錯了。它實際上綁定了參數和結果。這就是讓PDO確實很棒的一點。 – 2013-04-23 20:49:39

+0

就像我說過的,PDO舒爾很棒,但使用它的答案並不能毫無問題地回答這個問題。 – 2013-04-23 21:08:22

相關問題