PHP回顾系列目录
PHP的数据库拓展
数据库操作概览
PDO操作namespace tlanyan;use PDO;use PDOException;$dns = "mysql:host=localhost;dbname=foo";$username = "foo";$password = "password";// 建立数据库链接$conn = new PDO($dns, $username, $password, [ PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,]);// 设置出错时抛异常$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);// 设置结果字符集$conn->exec("set NAMES 'utf8mb4'");// 数据定义$sql = <<exec($sql);// 数据操作$sql = "insert into user values(null, 'tlanyan', sha1('1234password'), 'tlanyan', 20)";$row = $conn->exec($sql);$userId = $conn->lastInserId();echo "new user id: $userId\n";$sql = "select * from user limit 1";$stmt = $conn->query($sql);// 遍历结果集foreach ($stmt as $record) { print_r($record);}$sql = "update user set password=sha1('abcd2345') where id=1";$conn->exec($sql);// 事务操作$sql = "insert into user values(null, :username, sha1('test1234'), :name, 25)"; $stmt = $conn->prepare($sql);$conn->beginTransaction();try { for ($copy = 2; $copy < 5; ++ $copy) { $stmt->execute([ ':username' => 'tlanyan' . $copy, ':name' => 'tlanyan' . $copy, ]); } $conn->commit();} catch (PDOException $e) { echo 'error! message:', $e->getMessage(), PHP_EOL; $conn->rollback();}
SQL注入
// 执行命令$sql = "select id, name, age from user where username=:username";// 编译命令$stmt = $conn->prepare($sql);// 绑定变量$username = "tlanyan";$stmt->bindParam(":username", $username, PDO::PARAM_STR);// 执行和获取结果$stmt->execute();$row = $stmt->fetch();print_r($row);// 变量变量后,可方便的改变变量的值,多次执行预编译命令获取结果$username = 'tlanyan2'$stmt->execute();print_r($stmt->fetch());杂项
- 设置出错模式为PDO::ERRMODE_EXCEPTION后,执行语句过程中出现错误,将抛出PDOException的实例对象
- PDOStatement的bindParam和bindValue,类似于函数中的引用调用和传值调用:bindParam将变量绑定,变量的值改变,则执行命令中参数也改变。bindValue则是绑定值,变量改变不影响执行的语句。
- 事务支持依赖于数据表使用的引擎。MySQL的MyISAM引擎不支持事务,InnoDB引擎支持(InnoDB为5.5+后的默认引擎)。可通过show engines命令查看数据库支持的引擎已经对事务的支持情况。