2011-03-04 73 views
0

我對mysqli預處理語句有基本的疑問。例如,我想執行SELECT查詢,我應該這樣做:關於mysqli預處理語句的問題

<? 
$city = "Amersfoort"; 

if ($stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")) { 
    $stmt->bind_param("s", $city); 
    $stmt->execute(); 
    $stmt->bind_result($district); 
    $stmt->close(); 
} 
$mysqli->close(); 
?> 

在上面的代碼中,bind_result也是必需的嗎?它究竟做了什麼?

另外,我需要每次查詢後關閉mysqli連接嗎? 謝謝。

回答

2

bind_result使得它如此,當你遍歷查詢的結果,從結果集的列會自動映射到局部變量。

例如,假設您執行返回結果有三列設置這樣的查詢:

$query = "SELECT Name, CountryCode, District FROM myCity"; 

要執行的查詢和做的結果的東西,比方說打印出來:

if ($result = $mysqli->query($query)) { 
    while ($row = $result->fetch_row()) { 
     printf("%s (%s,%s)\n", $row[0], $row[1], $row[2]); 
    } 
} 

上述代碼的「問題」是$row[0]不是很具描述性。另一種方法是使用bind_result,這是這樣的:

$query = "SELECT Name, CountryCode, District FROM myCity"; 

if ($stmt = $mysqli->prepare($query)) { 
    $stmt->bind_result($name, $countryCode, $district); 

    while ($stmt->fetch()) { 
     printf("%s (%s,%s)\n", $name, $countryCode, $district); 
    } 
} 

正如你看到的,每次使用bind_result當你調用fetch變量$name$countryCode$district與值自動填充從目前的結果行。有一些你必須確保的細節,請閱讀the documentation瞭解更多信息。

要回答您的其他問題:您並不需要,而且確實您不會在每次查詢後關閉連接(除非您非常清楚自己在做什麼)。

+0

感謝您的詳細和明確的解釋。 – Jay 2011-03-04 23:48:20

+0

@adam:很高興幫助! – Jon 2011-03-05 00:06:58