在使用php mysqli操作數(shù)據(jù)庫(kù)時(shí),我們經(jīng)常會(huì)涉及到問(wèn)號(hào)的使用,這也是一個(gè)極其重要的知識(shí)點(diǎn)。本文將通過(guò)多個(gè)例子來(lái)講解問(wèn)號(hào)的使用方法及其優(yōu)點(diǎn)。
首先,我們來(lái)看一個(gè)最簡(jiǎn)單的例子:
$mysqli = new mysqli('localhost', 'root', 'password', 'test');
if ($mysqli->connect_error) {
die('Connect Error ('.$mysqli->connect_errno.') '.$mysqli->connect_error);
}
$stmt = $mysqli->prepare("SELECT id, name FROM users WHERE age = ?");
$age = 18;
$stmt->bind_param('i', $age);
$stmt->execute();
$stmt->bind_result($id, $name);
while ($stmt->fetch()) {
echo "id: $id, name: $name";
}
$stmt->close();
$mysqli->close();
在這個(gè)例子中,我們執(zhí)行了一條“SELECT”語(yǔ)句來(lái)查詢用戶的id和name,其中使用了問(wèn)號(hào)來(lái)占位。在“bind_param”方法中,第一個(gè)參數(shù)表示參數(shù)的類型,第二個(gè)參數(shù)則是對(duì)應(yīng)的變量。這里使用了“i”表示參數(shù)類型為整數(shù),而$age則對(duì)應(yīng)了這個(gè)參數(shù)。
問(wèn)號(hào)的優(yōu)點(diǎn)在于可以起到預(yù)編譯的作用,即將SQL語(yǔ)句中的參數(shù)與參數(shù)類型提前綁定,減少了SQL注入的可能,同時(shí)也增加了SQL語(yǔ)句的復(fù)用性。
舉個(gè)例子,現(xiàn)在我們需要查詢不同城市的用戶數(shù)量,SQL語(yǔ)句如下:$mysqli = new mysqli('localhost', 'root', 'password', 'test');
if ($mysqli->connect_error) {
die('Connect Error ('.$mysqli->connect_errno.') '.$mysqli->connect_error);
}
$stmt = $mysqli->prepare("SELECT city, COUNT(*) FROM users WHERE city = ? GROUP BY city");
$cities = array('Beijing', 'Shanghai', 'Guangzhou');
foreach ($cities as $city) {
$stmt->bind_param('s', $city);
$stmt->execute();
$stmt->bind_result($city, $count);
$stmt->fetch();
echo "city: $city, count: $count\n";
}
$stmt->close();
$mysqli->close();
在這個(gè)例子中,我們使用了一個(gè)foreach循環(huán)來(lái)分別查詢不同城市的用戶數(shù)量,通過(guò)綁定不同的參數(shù),可以避免SQL注入,提高了代碼的安全性。當(dāng)然,如果沒有使用問(wèn)號(hào),這個(gè)例子也是可以實(shí)現(xiàn)的,但需要手動(dòng)處理參數(shù)類型和參數(shù)值,代碼會(huì)比較冗長(zhǎng)。
問(wèn)號(hào)的使用方法比較簡(jiǎn)單,可以在SQL語(yǔ)句中使用“?”來(lái)占位,然后在“bind_param”方法中通過(guò)指定參數(shù)類型和參數(shù)值來(lái)綁定參數(shù)。總的來(lái)說(shuō),問(wèn)號(hào)的使用可以提高代碼的安全性和可讀性。