pdo执行sql语句的方法
1.用pdo连接数据库
//创建数据库对象 $dsn = 'mysql:host=127.0.0.1;dbname=liuyanban';//数据源,不要加空格!!! $user = 'root'; $password = 'root'; //$pdo = new PDO('数据源', '用户名', '密码'); $pdo = new PDO($dsn, $user, $password);
要点:1.dsn——数据源:包括服务器地址,数据库名称
2.创建pdo变量的方法——new PDO('数据源', '用户名', '密码');
2.编写sql语句,创建预处理对象
// 2. 准备SQL语句,创建预处理对象 $sql = 'SELECT * FROM `message` where id = :id';//模板语句 $stmt = $pdo->prepare($sql);//$stmt为预处理对象
要点:1.':id'——id的占位符,以此类推。
2.Prepare()方法负责准备要执行的查询
3.为模板语句中的占位符绑定变量参数,并执行该语句
$stmt->bindParam(':id', $id, PDO::PARAM_INT); $id = 3; $res = $stmt->execute(); if ($res) { $result = $stmt->fetch(PDO::FETCH_ASSOC);// fetch_style:控制结果集的返回方式 print_r($result); }
要点: 1.bindParam——绑定一个参数到指定的变量名。(bindValue——绑定一个值到指定的参数)
PDO::PARAM_INT——规定变量的数据类型
2.execute()执行sql语句
3.fetch()获取第一条受影响的语句。(fetchall()——获取受影响的所有语句,一般配合分页使用)
4参数 fetch_style:控制结果集的返回方式,其中可选择的值如下表:
值 说 明
PDO::FETCH_ASSOC 关联数组形式。
PDO::FETCH_NUM 数字索引数组形式。
PDO::FETCH_BOTH 两者数组形式都有,这是默认的。
PDO::FETCH_OBJ 按照对象的形式,类似于以前的mysql_fetch_object()函数。
PDO::FETCH_BOUND 以布尔值的形式返回结果,同时将获取的列值赋给bindParam()方法中指定的变量。
PDO::FETCH_LAZY 以关联数组、数字索引数组和对象3种形式返回结果。
注:‘->’与‘=>’的区别——前者是指从一个类中调用一个方法,后者是将它前面的值赋予它后面的参数。
若不想使用绑定参数的方法,可以使用直接在execute()的方法中赋值格式如下
$res = $stmt->execute(array(':id'=>3));
execute()与exec()与query()的区别
PDO::query执行一条SQL语句,如果通过,则返回一个PDOStatement对象。PDO::query函数有个“非常好处”,就是可以直接遍历这个返回的记录集。
query同传统的mysql query函数类似,同样需要对开发者自行对输入的sql语句进行安全检查。
query因为会返回PDOStament对象,似乎用在SELECT语句执行上更合适,这跟上文提到的query支持直接遍历不谋而合。
query执行后,在下一次query执行之前,如果不取走所有返回的记录集,则query将会执行失败,除非我们调用 PDOStatement::closeCursor()来释放数据库资源与PDOStatement对象。
PDO::exec执行一条SQL语句,并返回受影响的行数。此函数不会返回结果集合。官方建议:
对于在程序中只需要发出一次的 SELECT 语句,可以考虑使用 PDO::query()。
对于需要发出多次的语句,可用 PDO::prepare() 来准备一个 PDOStatement 对象并用 PDOStatement::execute() 发出语句。
PDO::exec支持SELECT/DELETE/UPDATE/INSERT等全部SQL语句执行,所以相比PDO query()函数功能要强大的多。由于只返回受影响的函数,所以,如果执行SELECT则无法得到PDOStatement对象,故也无法遍历结果集,只能按照官方建议去使用query或execute函数。
再看一下PDOStatement::execute函数,execute函数是用于执行已经预处理过的语句,只是返回执行结果成功或失败。也就是说execute需要配合prepare函数使用,这个的确是麻烦了一点,每次都要先prepare,然后才能exec。所以,如果执行SELECT等SQL语句,则还需要借助fetch等函数进行结果读取(当然上文的query也是可使用fetch等函数)。