PHP中使用参数化查询

来源:互联网 发布:js函数式编程书籍 编辑:程序博客网 时间:2024/05/29 16:11

PHP 中提供了三种访问 MySQL 数据库的扩展,即 mysql,mysqli 和 PDO。它们的区别可以比较如下:

扩展mysqlmysqliPDOPHP 版本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;



0 0