$pdo->query($sql); //用于记录所有查询结果的操作 返回 statement 对象
这里常用的方法:$statement->fetchAll(PDO::FETCH_OBJ) 或 $statement->fetchAll(PDO::FETCH_ASSOC);
$statement->rowCount() 返回影响的条数 $statement->fetch(PDO::FETCH_OBJ) 返回下一条记录
$pdo->exec($sql) 返回sql 影响的条数
$pdo->laseInsertId() 返回最后插入的ID
开启事务
$pdo->startTransaction();
$pdo->commit();
$pdo->rollback();
//判断pdo是否可以进行连接
try{
$pdo->getAttribute(PDO::ATTR_SERVER_INFO);
}catch(PDOExceptiono $e){
if(strpos($e->getMessage()),'MySQL server has gone away')!==false){
return false;
}
}
return true;
query 和 exec 都可以执行所有的sql语句,只是返回值不同
query能实现所有的exec的功能
当把select语句应用到exec时,总是返回0
预处理语句
$sql="INSERT INTO web_student(username,age,sex)VALUES(:username,:age,:sex)";
$stmt=$pdo->prepare($sql); 返回一个statement
$stmt->execute([":username"=>123,":age":18,":sex":1]);
echo $pdo->lastInsertId(); 返回刚刚插入数据的ID
//绑定参数
PDO长连接
PDO::ATTR_PERSISTENT=>true //开启长连接
header("Content-type:text/html;charset=utf-8"); $dsn="mysql:host=localhost;dbname=test;port=3306"; try{ $options=[ PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION, PDO::ATTR_PERSISTENT=>true //开启长连接 ]; $pdo=new PDO($dsn,'root','song',$options); $stmt=$pdo->prepare("show tables"); $stmt->execute(); $data=$stmt->fetchAll(PDO::FETCH_OBJ); print_r($data); }catch (Exception $e){ printf($e->getMessage()); }
当持续一段时间后,会自动关闭长连接
持久连接在脚本结束后不会被关闭,且被缓存,当另一个使用相同凭证的脚本连接请求时被重用。持久连接缓存可以避免每次脚本需要与数据库回话时建立一个新连接的开销,从而让 web 应用程序更快。
mysql连接情况预览:
C:\Users\songyongzhan>mysqladmin -uroot -psong processlist +----+------+-----------------+------+---------+------+-------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+------+-----------------+------+---------+------+-------+------------------+ | 10 | root | localhost:57474 | test | Sleep | 4 | | | | 11 | root | localhost:57477 | | Query | 0 | | show processlist | +----+------+-----------------+------+---------+------+-------+------------------+ C:\Users\songyongzhan>mysqladmin -uroot -psong processlist +----+------+-----------------+------+---------+------+-------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+------+-----------------+------+---------+------+-------+------------------+ | 10 | root | localhost:57474 | test | Sleep | 107 | | | | 12 | root | localhost:57518 | | Query | 0 | | show processlist | +----+------+-----------------+------+---------+------+-------+------------------+
pdo1.php
try{ $dsn="mysql:host=localhost;dbname=test;port=3306"; //$dsn="mysql:localhost=localhost;dbname=test;port=3306"; //以上这两种localhost 和 host 这是一样的, 记住没以后面都没有引号或单引号 $root="root"; $pass="song"; $param=[ PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION, PDO::ATTR_ORACLE_NULLS=>PDO::NULL_EMPTY_STRING ]; $pdo=new pdo($dsn,$root,$pass,$param); $sql="SELECT * FROM web_student where id=:id"; $stmt=$pdo->prepare($sql); $stmt->execute([":id"=>1]); $obj=array(); while(!!$row=$stmt->fetchObject()){ $obj[]=$row; } P($obj); }catch(PDOException $e){ echo $e->getMessage(); } function P($_data){ echo "<pre style='color:blue'>"; print_r($_data); echo "</pre>"; }
以上因为用到setAttribute()方法,放上那两个参数,把字段名强制转换成大写。下面列出多有PDO::setAttribute()的参数: PDO::ATTR_CASE: 强制列名变成一种格式,详细如下(第二个参数): PDO::CASE_LOWER: 强制列名是小写. PDO::CASE_NATURAL: 列名按照原始的方式 PDO::CASE_UPPER: 强制列名为大写. ------------------------------------------------ PDO::ATTR_ERRMODE: 错误提示: PDO::ERRMODE_SILENT: 不显示错误信息,只显示错误码. PDO::ERRMODE_WARNING: 显示警告错误. PDO::ERRMODE_EXCEPTION: 抛出异常. 我们常用这种模式 ---------------------------------------------------- PDO::ATTR_ORACLE_NULLS(不仅仅是ORACLE有效,别的数据库也有效): )指定数据库返回的NULL值在php中对应的数值。 PDO::NULL_NATURAL: 不变. PDO::NULL_EMPTY_STRING: Empty string is converted toNULL. PDO::NULL_TO_STRING: NULL is converted to an empty string. PDO::ATTR_STRINGIFY_FETCHES: Convert numeric values to strings when fetching. Requiresbool. PDO::ATTR_STATEMENT_CLASS: Set user-supplied statement class derived from PDOStatement. Cannot be used with persistent PDO instances. Requiresarray(string classname, array(mixed constructor_args)). PDO::ATTR_AUTOCOMMIT(available in OCI, Firebird and MySQL): Whether to autocommit every single statement. PDO::MYSQL_ATTR_USE_BUFFERED_QUERY(available in MySQL): Use buffered queries. 例子中的$rs->setFetchMode(PDO::FETCH_ASSOC);是PDOStatement::setFetchMode(),对返回类型的声明。 有如下: PDO::FETCH_ASSOC-- 关联数组形式 PDO::FETCH_NUM -- 数字索引数组形式 PDO::FETCH_BOTH -- 两者数组形式都有,这是缺省的 PDO::FETCH_OBJ -- 按照对象的形式,类似于以前的 mysql_fetch_object()
PDO::ATTR_PERSISTENT:当前对Mysql服务器的连接是否是长连接
TRUE:是长连接(长连接的使用必须要配合:Apache(connection:keepAlive),Mysqld)
FALSE:默认的,非长连接
PDO::ATTR_TIMEOUT: 指定超时的秒数。并非所有驱动都支持此选项,这意味着驱动和驱动之间可能会有差异。比如,SQLite等待的时间达到此值后就放弃获取可写锁,但其他驱动可能会将此值解释为一个连接或读取超时的间隔。 需要 int 类型。
PDO::ATTR_AUTOCOMMIT (在OCI,Firebird 以及 MySQL中可用): 是否自动提交每个单独的语句。
PDO::ATTR_EMULATE_PREPARES 启用或禁用预处理语句的模拟。 有些驱动不支持或有限度地支持本地预处理。使用此设置强制PDO总是模拟预处理语句(如果为 TRUE ),或试着使用本地预处理语句(如果为 FALSE )。如果驱动不能成功预处理当前查询,它将总是回到模拟预处理语句上。 需要 bool 类型。
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY (在MySQL中可用): 使用缓冲查询。
PDO::ATTR_DEFAULT_FETCH_MODE: 设置默认的提取模式。关于模式的说明可以在 PDOStatement::fetch() 文档找到。
pdo2.php
header("Content-type:text/html;charset=utf-8"); try{ $dsn="mysql:host=localhost;dbname=test;port=3306"; //$dsn="mysql:localhost=localhost;dbname=test;port=3306"; charset=UTF8; //以上这两种localhost 和 host 这是一样的, 记住没以后面都没有引号或单引号 //\PDO::ATTR_DEFAULT_FECTH_MODE => \PDO::FETCH_OBJ, $root="root"; $pass="song"; $param=[ PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION ]; $pdo=new pdo($dsn,$root,$pass,$param); $sql="SELECT * FROM web_student order by posttime desc limit 5"; /*$stmt=$pdo->prepare($sql); $stmt->execute(); $obj=array(); while(!!$row=$stmt->fetchObject()){ $obj[]=$row; } */ $sqlCount="select count(*) as count from web_student"; $stmtCount=$pdo->query($sqlCount); $data=$stmtCount->fetch(PDO::FETCH_OBJ); P("数据库总条数:".$data->count); $stmt=$pdo->query($sql); $obj=$stmt->fetchAll(PDO::FETCH_OBJ); echo $stmt->rowCount(); P($obj); }catch(PDOException $err){ P($err->getLine()); P($err->getFile()); P($err->getCode()); P($err->getMessage()); P($err->getTrace()); /*$trace = '<table border="0">'; foreach ($err->getTrace() as $a => $b) { foreach ($b as $c => $d) { if ($c == 'args') { foreach ($d as $e => $f) { $trace .= '<tr><td><b>' . strval($a) . '#</b></td><td align="right"><u>args:</u></td> <td><u>' . $e . '</u>:</td><td><i>' . $f . '</i></td></tr>'; } } else { $trace .= '<tr><td><b>' . strval($a) . '#</b></td><td align="right"><u>' . $c . '</u>:</td><td></td><td><i>' . $d . '</i></td>'; } } } $trace .= '</table>'; echo '<br /><br /><br /><font face="Verdana"><center><fieldset style="width: 66%; border: 4px solid white;"><legend><b>[</b>PHP PDO Error ' . strval($err->getCode()) . '<b>]</b></legend> <table border="0"><tr><td align="right"><b><u>Message:</u></b></td><td><i>' . $err->getMessage() . '</i></td></tr><tr><td align="right"><b><u>Code:</u></b></td><td><i>' . strval($err->getCode()) . '</i></td></tr><tr><td align="right"><b><u>File:</u></b></td><td><i>' . $err->getFile() . '</i></td></tr><tr><td align="right"><b><u>Line:</u></b></td><td><i>' . strval($err->getLine()) . '</i></td></tr><tr><td align="right"><b><u>Trace:</u></b></td><td><br /><br />' . $trace . '</td></tr></table></fieldset></center></font>'; echo '</body></html>';*/ //throw new Exception("123"); //echo $e->getMessage(); } function P($_data){ echo "<pre style='color:blue'>"; print_r($_data); echo "</pre>"; }
pdo3.php
$ini="config.ini"; $parse=parse_ini_file($ini,true); try{ $dsn=$parse['dsn'].":"; foreach($parse['dsn_option'] as $key=>$val){ $dsn.=$key."=".$val.";"; //分号可去可不去 } $pdo=new pdo($dsn,$parse['user'],$parse['pass'],$parse['db_options']); $sql="select * from web_student "; $stmt=$pdo->query($sql); //$_data=$stmt->fetchAll(PDO::FETCH_OBJ); $_data=$stmt->fetchAll(PDO::FETCH_ASSOC); P($stmt->debugDumpParams()); P($_data); //$stmt->close(); }catch(PDOException $err){ P("[PDO ERR ".$err->getCode()." ]"); P("File:".$err->getFile()." row:".$err->getLine()); P("Message:".$err->getMessage()); } function P($_data){ echo "<pre style='color:blue'>"; print_r($_data); echo "</pre>"; }
config.ini
Here is an singleton PDO example: dsn=mysql user=root pass=song [dsn_option] host=localhost dbname=test port=3306 [db_options] PDO::MYSQL_ATTR_INIT_COMMAND=set names utf8 PDO::ATTR_ERRMODE=PDO::ERRMODE_EXCEPTION
pdo4.php
//请使用pdo连接test数据库,并读取web_student 中的数据 header("Content-type:text/html;charset=utf-8"); try{ $dsn="mysql:host=localhost;dbname=test;port=3306"; //$dsn="mysql:localhost=localhost;dbname=test;port=3306"; charset=UTF8; //以上这两种localhost 和 host 这是一样的, 记住没以后面都没有引号或单引号 //\PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_OBJ, $root="root"; $pass="song"; $param=array( PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION ); $pdo=new pdo($dsn,$root,$pass,$param); $sql="INSERT INTO web_student(username,age,posttime)VALUES(:username,:age,:posttime)"; $stmt=$pdo->prepare($sql); /*$stmt->bindParam(":username",mt_rand(100,1000),PDO::PARAM_STR); $stmt->bindParam(":age",mt_rand(10,70),PDO::PARAM_INT); $stmt->bindParam(":posttime",time(),PDO::PARAM_INT);*/ //$_r=$stmt->execute(); $_r=$stmt->execute([":username"=>mt_rand(100,1000),":age"=>mt_rand(18,99),":posttime"=>time()]); if($_r){ echo "添加成功"; echo $pdo->lastInsertId(); } }catch(PDOException $err){ P($err->getLine()); P($err->getFile()); P($err->getCode()); P($err->getMessage()); P($err->getTrace()); /*$trace = '<table border="0">'; foreach ($err->getTrace() as $a => $b) { foreach ($b as $c => $d) { if ($c == 'args') { foreach ($d as $e => $f) { $trace .= '<tr><td><b>' . strval($a) . '#</b></td><td align="right"><u>args:</u></td> <td><u>' . $e . '</u>:</td><td><i>' . $f . '</i></td></tr>'; } } else { $trace .= '<tr><td><b>' . strval($a) . '#</b></td><td align="right"><u>' . $c . '</u>:</td><td></td><td><i>' . $d . '</i></td>'; } } } $trace .= '</table>'; echo '<br /><br /><br /><font face="Verdana"><center><fieldset style="width: 66%; border: 4px solid white;"><legend><b>[</b>PHP PDO Error ' . strval($err->getCode()) . '<b>]</b></legend> <table border="0"><tr><td align="right"><b><u>Message:</u></b></td><td><i>' . $err->getMessage() . '</i></td></tr><tr><td align="right"><b><u>Code:</u></b></td><td><i>' . strval($err->getCode()) . '</i></td></tr><tr><td align="right"><b><u>File:</u></b></td><td><i>' . $err->getFile() . '</i></td></tr><tr><td align="right"><b><u>Line:</u></b></td><td><i>' . strval($err->getLine()) . '</i></td></tr><tr><td align="right"><b><u>Trace:</u></b></td><td><br /><br />' . $trace . '</td></tr></table></fieldset></center></font>'; echo '</body></html>';*/ //throw new Exception("123"); //echo $e->getMessage(); } function P($_data){ echo "<pre style='color:blue'>"; print_r($_data); echo "</pre>"; }
简单总结了以上的方法:
PDO::query()
PDO::exec()
$stmt=PDO::prepare("select * from user where id=:id and class=:classId");
$stmt->execute([':id'=>33,':classId'=>101]);
进行数据绑定
//遍历
PDO::fetch(PDO::FETCH_OBJ);
//不用遍历,全部拿回数据
PDO::fetchAll(PDO::FETCH_OBJ);
PDO::lastInsertId() //最后插入的ID
PDO::rowCount() //返回的数量