PHP中使用引數化查詢
阿新 • • 發佈:2019-01-04
PHP 中提供了三種訪問 MySQL 資料庫的擴充套件,即 mysql,mysqli 和 PDO。它們的區別可以比較如下:
擴充套件 | mysql | mysqli | PDO |
PHP 版本 | 2.0+ | 5.0+ | 5.1+ |
生命週期 | 廢棄 | 活躍 | 活躍 |
面向物件語法 | 否 | 是 | 是 |
過程式語法 | 是 | 是 | 否 |
伺服器端預處理語句 | 否 | 是 | 是 |
客戶端預處理語句 | 否 | 否 | 是 |
上面所說的預處理語句就是用於引數化查詢的。可以看到,除了舊的 mysql 擴充套件不支援,mysqli 和 PDO 這兩個新擴充套件都支援引數化查詢。PDO 擴充套件相比 mysqli 擴充套件的好處是,它是與關係資料庫型別無關的,因此很方便切換資料庫,比如從 MySQL 切換到 PostgreSQL。
首先我們來看看利用 mysqli 擴充套件如何使用引數化查詢。例如:
$mysqli = new mysqli("localhost","dbusername", "dbpassword", "database"); $username= "somename"; $password= "someword"; $query = "SELECT filename, filesize FROM users WHERE (name = ?) and (password = ?)"; $stmt = $mysqli->stmt_init(); if ($stmt->prepare($query)) { $stmt->bind_param("ss",$username, $password); $stmt->execute(); $stmt->bind_result($filename,$filesize); while($stmt->fetch()) { printf ("%s : %d\n",$filename, $filesize); } $stmt->close(); } $mysqli->close();
再看看用 PDO 擴充套件如何使用引數化查詢。例如:
$pdo = new PDO("mysql:host=localhost;dbname=database","dbusername", "dbpassword"); $username= "somename"; $password= "someword"; $query = "SELECT * FROM users WHERE (name = :username) and (password = :password)"; $statement= $pdo->prepare($query,array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY)); $statement->bindParam(":username",$username, PDO::PARAM_STR, 10); $statement->bindParam(":password",$password, PDO::PARAM_STR, 12); $statement->execute(); while ($row = $statement->fetch(PDO::FETCH_ASSOC)) { printf ("%s : %d\n",$row["filename"],$row["filesize"]); } $statement->closeCursor(); $pdo = null;