手机版

PDO对象常用方法 - MySQL中文参考手册

2019-09-11 阅读 :

PDO 对象常用方法

PDO 对象方法

方法描述
exec()执行一条 SQL 语句,并返回其受影响的行数,如果没有受影响的行数则返回 0
query()执行一条 SQL 语句,返回一个 PDOStatement 对象
prepare()准备要执行的 SQL 语句,返回 PDOStatement 对象
quote()返回一个添加引号的字符串,用于 SQL 语句中
lastInertId返回最后插入的行的ID
setAttribute()设置数据库连接属性
getAttribute()获取数据库连接属性
errorCode()获取跟数据库句柄上一次操作相关的 SQLSTATE
errorInfo()获取跟数据库句柄上一次操作的错误信息

PDOStatement 对象方法

方法描述
execute()执行一条预处理语句
rowCount()返回上一个 SQL 语句影响的行数
fetch()从结果集中获取一行
fetchAll()返回一个包含结果集中所有行的数组
setFetchMode()为语句设置默认的获取模式
fetchColumn()从结果集下一行返回单独的行
fetchObject()获取下一行并作为一个对象返回
bindParam()绑定一个参数到指定的变量名
bindValue()把一个值绑定到一个参数
bindColumn()绑定一列到一个 PHP 变量
getColumnMeta()返回结果集中一列的元数据
columnCount()返回结果集中的列数
setAttribute()设置一个语句属性
getAttribute获取一个语句属性
errorCode()获取跟上一个语句句柄操作相关的SQLSTATE
errorInfo()获取跟上一个语句句柄操作相关的拓展错误信息
debugDumpParams()打印一条 SQL 预处理命令
nextRowset()在一个多行集语句句柄中推进到下一个行集

exec() 方法

exec() 写入

exec() 方法可以用来执行数据库的 INSERT 、UPDATE、DELETE操作。并且不支持 SELECT 相关操作

<?phptry {    $dsn = 'mysql:host=localhost;dbname=test';    $username = 'root'; // 数据库用户名    $passwd = 'aaaaaa'; // 数据库密码    $pdo = new PDO($dsn, $username, $passwd, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES UTF8"));    // 建表 SQL    $sql = <<<EOF        CREATE TABLE IF NOT EXISTS user(            id INT UNSIGNED NOT NULL AUTO_INCREMENT,            username VARCHAR(20) NOT NULL UNIQUE,            password CHAR(32) NOT NULL,            email VARCHAR(30) NOT NULL,            PRIMARY KEY (id)        )ENGINE=InnoDB DEFAULT CHARSET UTF8;EOF;    $pdo->exec($sql); // 使用 PDO 对象的 exec()方法执行建表语句    // 写入 SQL 语句    $rand = mt_rand(0, 999);    $sql = sprintf('INSERT INTO user (username, password, email) VALUES ("%s","%s","%s")', 'user' . $rand, md5($rand), 'email' . $rand . '@163.com');    $pdo->exec($sql); // 执行成功,返回 int(1)    $pdo->lastInsertId(); // 返回最后写入的主键值,即主键的自增值    // 一次写入多条    $arr = [        ['username' => 'username' . mt_rand(0, 999), 'password' => md5(mt_rand(0, 999)), 'email' => 'email' . mt_rand(0, 999) . '@outlook.com'],        ['username' => 'username' . mt_rand(0, 999), 'password' => md5(mt_rand(0, 999)), 'email' => 'email' . mt_rand(0, 999) . '@icloud.com'],        ['username' => 'username' . mt_rand(0, 999), 'password' => md5(mt_rand(0, 999)), 'email' => 'email' . mt_rand(0, 999) . '@163.com'],    ];    $sql = 'INSERT INTO user (username, password, email) VALUES ';    foreach ($arr as $v) {        $sql .= "('{$v['username']}', '{$v['password']}', '{$v['email']}'),";    }    $sql = rtrim($sql, ',');    $pdo->exec($sql); // 返回受影响行数 int(3)} catch (PDOException $e) {    echo $e->getMessage();}

执行 pdo 对象的 exec() 方法返回受影响的行数、0[例如上例执行创建表的语句返回 0 ] 或者 false [当 SQL 语句错误,使用 errorInfo() 方法获取错误信息。]

exec() 更新与删除

<?phptry {    $dsn = 'mysql:host=localhost;dbname=test';    $username = 'root'; // 数据库用户名    $passwd = 'aaaaaa'; // 数据库密码    $pdo = new PDO($dsn, $username, $passwd, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES UTF8"));    // 更新    $sql = "UPDATE user SET username='user1' where id = 1;";    $pdo->exec($sql); // 返回受影响行数    // 删除    $sql = 'DELETE FROM user where id = 1;';    $pdo->exec($sql); // 返回受影响的行数    // 执行 SELECT 操作    $sql = 'SELECT * FROM user;';    $pdo->exec($sql); // 返回 int(0)} catch (PDOException $e) {    echo $e->getMessage();}

不允许使用 exec() 进行 SELECT 操作。

query() 查询

<?phptry {    $dsn = 'mysql:host=localhost;dbname=test';    $username = 'root'; // 数据库用户名    $passwd = 'aaaaaa'; // 数据库密码    $pdo = new PDO($dsn, $username, $passwd, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES UTF8"));    $sql = 'SELECT * FROM user where id = 2';    $res = $pdo->query($sql); // object(PDOStatement)#2 (1) { ["queryString"]=> string(31) "SELECT * FROM user where id = 2" }    // 通过 foreach 遍历对象    foreach ($res as $row) {        print_r($row);    }} catch (PDOException $e) {    echo $e->getMessage();}

设置数据库连接属性

<?phptry {    $dsn = 'mysql:host=localhost;dbname=test';    $username = 'root'; // 数据库用户名    $passwd = 'aaaaaa'; // 数据库密码    $options = [PDO::ATTR_AUTOCOMMIT => 0];    $pdo = new PDO($dsn, $username, $passwd, $options); // 实例化 PDO 对象时传入属性    /**     * PDO::ATTR_AUTOCOMMIT 自动提交     * PDO::ATTR_CASE 字段名大小写     * PDO::ATTR_CLIENT_VERSION 客户端版本     * PDO::ATTR_CONNECTION_STATUS 连接状态信息     * PDO::ATTR_DRIVER_NAME     * PDO::ATTR_ERRMODE 错误处理模式     * PDO::ATTR_ORACLE_NULLS 空字符串转换成SQL时的 Null     * PDO::ATTR_PERSISTENT     * PDO::ATTR_PREFETCH     * PDO::ATTR_SERVER_INFO 服务器信息     * PDO::ATTR_SERVER_VERSION 服务器版本     * PDO::ATTR_TIMEOUT 超时时间     */    $pdo->getAttribute(PDO::ATTR_AUTOCOMMIT); // 获取连接属性值    $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 0); // 设置连接属性} catch (PDOException $e) {    echo $e->getMessage();}

错误信息

<?phptry {    $dsn = 'mysql:host=localhost;dbname=test';    $username = 'root'; // 数据库用户名    $passwd = 'aaaaaa'; // 数据库密码    $pdo = new PDO($dsn, $username, $passwd, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES UTF8"));    $sql = 'SELECT * FROM users'; // 表名不正确    $res = $pdo->exec($sql);    if ($res === false) {        echo $pdo->errorCode(); // 返回SQLSTATE的值 42S02        print_r($pdo->errorInfo()); // 返回错误信息的数组,[0=>'SQLSTATE值', 1=>'错误码', 2=>'错误提示'],Array ( [0] => 42S02 [1] => 1146 [2] => Table 'test.users' doesn't exist )    }} catch (PDOException $e) {    echo $e->getMessage();}

quote() 防止 SQL 注入

<?phptry {    $dsn = 'mysql:host=localhost;dbname=test';    $username = 'root'; // 数据库用户名    $passwd = 'aaaaaa'; // 数据库密码    $pdo = new PDO($dsn, $username, $passwd, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES UTF8")); // 实例化 PDO 对象时传入属性    $username = ' or 1 = 1 #';    // $pdo->quote('username');    $pdo->quote($username); // quote() 过滤 SQL 字符串中特殊字符    $sql = "SELECT * FROM user where username = '{$username}'";    $pdo->query($sql);} catch (PDOException $e) {    echo $e->getMessage();}

使用 quote() 方法会转移特殊字符,防止SQL注入,但是不建议这样操作。

预处理查询

<?phptry {    $dsn = 'mysql:host=localhost;dbname=test';    $username = 'root'; // 数据库用户名    $passwd = 'aaaaaa'; // 数据库密码    $pdo = new PDO($dsn, $username, $passwd, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES UTF8"));    $sql = "SELECT * FROM user";    // 准备一条 SQL 语句    $res = $pdo->prepare($sql); // object(PDOStatement)#2 (1) { ["queryString"]=> string(43) "SELECT * FROM user where username='user291'" }    // execute() 执行 SQL 语句    $r = $res->execute(); // 返回 boolean    $res->setFetchMode(PDO::FETCH_ASSOC); // 设置返回数据的格式    // $res->fetchAll();    if ($r) {        while ($row = $res->fetch(PDO::FETCH_ASSOC)) { // 获取结果集中一条数据 PDO::FETCH_ASSOC 参数返回关联数组            var_dump($row);        }    }} catch (PDOException $e) {    echo $e->getMessage();}

预处理语句中占位符的使用

  • 在调用

    execute()

    的时候传入对应的值,进行语句的预处理。

<?phptry {    $dsn = 'mysql:host=localhost;dbname=test';    $username = 'root'; // 数据库用户名    $passwd = 'aaaaaa'; // 数据库密码    $pdo = new PDO($dsn, $username, $passwd, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES UTF8")); // 实例化 PDO 对象时传入属性    $username = ' or 1 = 1 #'; // 'username430'    $sql = "SELECT * FROM user where username = :username"; // 不用给字符串 :username 加上引号    $res = $pdo->prepare($sql); // prepare() 过滤 SQL 字符串中特殊字符    $res->execute([':username' => $username]);} catch (PDOException $e) {    echo $e->getMessage();}
  • 使用

    ?

    占位符,预处理完 SQL 后使用

    excute()

    的时候,相当于传递一个索引数组。

<?phptry {    $dsn = 'mysql:host=localhost;dbname=test';    $username = 'root'; // 数据库用户名    $passwd = 'aaaaaa'; // 数据库密码    $pdo = new PDO($dsn, $username, $passwd, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES UTF8")); // 实例化 PDO 对象时传入属性    $username = 'username430';// ' or 1 = 1 #'; // 'username430'    $sql = "SELECT * FROM user where username = ?"; // 不用给字符串 :username 加上引号    $res = $pdo->prepare($sql); // prepare() 过滤 SQL 字符串中特殊字符    $res->execute([$username]);    var_dump($res->rowCount());} catch (PDOException $e) {    echo $e->getMessage();}
  • bindParam()

    方法绑定参数

<?phptry {    $dsn = 'mysql:host=localhost;dbname=test';    $username = 'root'; // 数据库用户名    $passwd = 'aaaaaa'; // 数据库密码    $pdo = new PDO($dsn, $username, $passwd, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES UTF8")); // 实例化 PDO 对象时传入属性    $sql = 'INSERT INTO user (username, password, email) VALUES (:username, :password, :email)';    $statement = $pdo->prepare($sql); // 预执行SQL    $statement->bindParam(':username', $username, PDO::PARAM_STR); // 绑定参数 :username    $statement->bindParam(':password', $password, PDO::PARAM_STR);    $statement->bindParam(':email', $email, PDO::PARAM_STR);    // 参数赋值    $rand = mt_rand(0, 999);    $username = 'username' . $rand;    $password = md5($rand);    $email = $username . '@qq.com';    $statement->execute();} catch (PDOException $e) {    echo $e->getMessage();}

bindValue() 将值绑定到参数

<?phptry {    $dsn = 'mysql:host=localhost;dbname=test';    $username = 'root'; // 数据库用户名    $passwd = 'aaaaaa'; // 数据库密码    $pdo = new PDO($dsn, $username, $passwd, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES UTF8")); // 实例化 PDO 对象时传入属性    $sql = 'INSERT INTO user (username, password, email) VALUES (:username, :password, :email)';    $statement = $pdo->prepare($sql);    $rand = mt_rand(0, 999);    $username = 'username' . $rand;    $password = md5($rand);    $statement->bindValue(':username', $username);    $statement->bindValue(':password',$password);    $statement->bindValue(':email',$rand . '@126.com');    $statement->execute();    echo $statement->rowCount();    // 再次绑定值,但是 email 字段使用上面的值    $rand = mt_rand(0, 999);    $username = 'username' . $rand;    $password = md5($rand);    $statement->bindValue(':username', $username);    $statement->bindValue(':password',$password);    $statement->execute();    echo $statement->rowCount();} catch (PDOException $e) {    echo $e->getMessage();}

注意: 赋值的 $username 和 $password 的赋值要在 bindValue() 之前。

bindColum() 绑定参数到列

<?phptry {    $dsn = 'mysql:host=localhost;dbname=test';    $username = 'root'; // 数据库用户名    $passwd = 'aaaaaa'; // 数据库密码    $pdo = new PDO($dsn, $username, $passwd, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES UTF8")); // 实例化 PDO 对象时传入属性    $sql = 'SELECT username,password,email FROM user';    $statement = $pdo->prepare($sql);    $statement->execute();    $statement->columnCount(); // 获取结果集中列数    $statement->bindColumn(1, $username);    $statement->bindColumn(2, $password);    $statement->bindColumn(3, $email);    while ($statement->fetch(PDO::FETCH_BOUND)) {        echo 'username:',$username,',password:',$password,',email:',$email;    }} catch (PDOException $e) {    echo $e->getMessage();}

fetchColumn() 从结果集下一行返回单独的行

<?phptry {    $dsn = 'mysql:host=localhost;dbname=test';    $username = 'root'; // 数据库用户名    $passwd = 'aaaaaa'; // 数据库密码    $pdo = new PDO($dsn, $username, $passwd, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES UTF8")); // 实例化 PDO 对象时传入属性    $sql = 'SELECT username,password,email FROM user';    $statement = $pdo->prepare($sql);    $statement->execute();    echo $statement->fetchColumn();    echo $statement->fetchColumn(2); // 获取第 2 行的 password 字段值} catch (PDOException $e) {    echo $e->getMessage();}

debugDumpParams() 打印预处理语句

<?phptry {    $dsn = 'mysql:host=localhost;dbname=test';    $username = 'root'; // 数据库用户名    $passwd = 'aaaaaa'; // 数据库密码    $pdo = new PDO($dsn, $username, $passwd, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES UTF8")); // 实例化 PDO 对象时传入属性    $sql = 'SELECT username,password,email FROM user WHERE id > :id';    $statement = $pdo->prepare($sql);    $statement->bindParam(':id', $id, PDO::PARAM_INT);    $id = 10;    $statement->execute();    print_r($statement->debugDumpParams());} catch (PDOException $e) {    echo $e->getMessage();}


服务器软件 网络工具 网站工具 服务器教程 服务器知识 服务器技术 服务器之家 vps教程 vps是什么

本文标题:PDO对象常用方法 - MySQL中文参考手册 - 服务器教程_服务器技术_服务器知识_vps教程
本文地址:http://www.helloaliyun.com/tutorial/526.html

相关文章

  • Linux Shell 教程_Linux Shell 中文详解参考手册
    Linux Shell 教程_Linux Shell 中文详解参考手册

    Shell是外壳的意思,就是操作系统的外壳。我们可以通过shell命令来操作和控制操作系统,比如Linux中的Shell命令就包括ls、cd、pwd等等。总结来说,Shell是一个命令解释器,它通过接受用户输入的Shell命令来启动、暂停、停止程序的运行或对计算机进行控制。Shell脚本就是由Shell命令组成的文件,这些命令都是可执行程序的名字,脚本不用编译即可运行,它通过解释器解释运行。...

    2019-09-11 服务器教程
  • Shell 教程:Shell是什么?一分钟理解Shell的概念!
    Shell 教程:Shell是什么?一分钟理解Shell的概念!

    现在我们使用的操作系统(Windows、Mac OS、Android、iOS 等)都是带图形界面的,简单直观,容易上手,对专业用户(程序员、网管等)和普通用户(家庭主妇、老年人等)都非常适用;计算机的普及离不开图形界面。 然而在计算机的早期并没...

    2019-09-11 服务器教程
  • Shell 教程:Shell 文件包含

    和其他语言一样,Shell 也可以包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件。Shell 文件包含的语法格式如下:. filename # 注意点号(.)和文件名中间有一空格或source filename实例创建两个 sh...

    2019-09-11 服务器教程
  • Shell 教程:Shell 输入/输出重定向

    大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回​​到您的终端。一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出,默认情况下,这也是...

    2019-09-11 服务器教程
  • Shell 教程:Shell 函数

    linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。shell中函数的定义格式如下:[ function ] funname [()]{ action; [return int;]}说明: 1、可以带function fun() 定义,也可以直接fun() 定义,不带任...

    2019-09-11 服务器教程
  • Shell 教程:Shell的流程控制

    和Java、PHP等语言不一样,Shell的流程控制不可为空,如(以下为PHP流程控制写法):<?phpif (isset($_GET["q"])) { search(q);}else { // 不做任何事情}在sh/bash里可不能这么写,如果else分支没有语句执行,就不要写这个...

    2019-09-11 服务器教程
  • Shell 教程:Shell test 命令

    Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。数值测试 参数 说明 -eq 等于则为真 -ne 不等于则为真 -gt 大于则为真 -ge 大于等...

    2019-09-11 服务器教程
  • Shell 教程:Shell printf 命令

    printf 命令模仿 C 程序库(library)里的 printf() 程序。printf 由 POSIX 标准所定义,因此使用 printf 的脚本比使用 echo 移植性好。printf 使用引用文本或空格分隔的参数,外面可以在 printf 中使用格式化字符串,还可以制...

    2019-09-11 服务器教程
  • Shell 教程:Shell echo命令

    Shell 的 echo 指令与 PHP 的 echo 指令类似,都是用于字符串的输出。命令格式:echo string您可以使用echo实现更复杂的输出格式控制。1.显示普通字符串:echo "It is a test"这里的双引号完全可以省略,以下命令与上面实例...

    2019-09-11 服务器教程
  • Shell 教程:Shell 基本运算符

    Shell 和其他编程语言一样,支持多种运算符,包括: 算数运算符 关系运算符 布尔运算符 字符串运算符 文件测试运算符原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。expr 是一款表...

    2019-09-11 服务器教程
你可能感兴趣