<?php
/*
pdo 连接mysql
pdo开启方法:
windows:在pho.ini文件中,追加如下代码;
extension=php_pdo.dll
extension=php_pdo_mysql.dll --使用mysql驱动
extension=php_pdo_oci.dll --使用oracle驱动
extension=php_pdo_odbc.dll --使用odbc驱动
extension=php_pdo_mssql.dll --使用sqlserver驱动
linux:
安装源代码包时,向configure命令添加一下标志:
--with-pdo-mysql=/usr/local/mysql //其中/usr/local/mysql为mysql安装目录。
*/
try {
$dsn = 'mysql:dbname=xsphp;host=localhost';
$user = 'root';
$password = 'root';
$opt = array(PDO::ATTR_PERSISTENT=>true,PDO::MYSQL_ATTR_INIT_COMMAND=>'set names gbk');
$pdo = new PDO($dsn,$user,$password,$opt);
var_dump($pdo);
}catch(PDOException $e) {
echo $e->getmessage();
}
<?php
/*
使用exec()方法
*/
try {
$dsn = 'mysql:dbname=xsphp;host=localhost';
$user = 'root';
$pwd = 'root';
$opt = array(PDO::MYSQL_ATTR_INIT_COMMAND=>'set names gbk',PDO::ATTR_PERSISTENT=>true);
$pdo = new PDO($dsn,$user,$pwd,$opt);
//设置pdo错误处理模式
/*
PDO::ERRMODE_SILENT
这是默认模式,如果出错,可以调用errorCode()和errorInfo()方法查看。
PDO::ERRMODE_WARNING
这是警告模式,除了设置错误代码以外,pdo还将发出一条php传统的E_WARNING消息。直接在网页上显示。
PDO::ERRMODE_EXCEPTION ※※※※
异常模式,除了设置错误代码以外,pdo还将抛出一个PDOExecption异常。
一般都用此模式
*/
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
}catch(PDOException $e) {
echo '数据库连接失败,失败原因:'.$e->getMessage();
exit;
}
try {
$sql = 'insert into users1 values(null,"gg",50)';
$affected_row = $pdo->exec($sql);
if($affected_row > 0) {
echo '插入数据成功';
echo "插入新数据的ID为{$pdo->lastInsertId()}";
}else {
echo '插入数据失败';
}
}catch(PDOException $e) {
echo $e->getMessage();
}
create table zhanghao (
id int primary key auto_increment,
name varchar(20) not null,
price int(10) not null
);
insert into zhanghao values(null,'yc',500);
insert into zhanghao values(null,'wy',1000);
mysql> select * from zhanghao;
+----+------+-------+
| id | name | price |
+----+------+-------+
| 1 | yc | 500 |
| 2 | wy | 1000 |
+----+------+-------+
2 rows in set (0.00 sec)
<?php
/*
pdo处理事务
yc账户转入50,wy账户转出50
*/
try {
$dsn = 'mysql:dbname=xsphp;host=localhost';
$user = 'root';
$pwd = 'root';
$opt = array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION ,PDO::ATTR_PERSISTENT=>true);
$pdo = new PDO($dsn,$user,$pwd,$opt);
//关闭事务提交
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,0);
}catch(PDOException $e) {
echo '连接数据库出错'.$e->getMessage();
exit;
}
try{
$pdo->beginTransaction(); //开启事务
$price = 50; //转入转出金额
//向yc账户转入50
$sql = 'update zhanghao set price = price + '.$price.' where name = "yc"' ;
$affected_row = $pdo->exec($sql);
if(!$affected_row) {
throw new PDOException('yc转入'.$price.'金额失败');
}else {
echo 'yc转入'.$price.'金额成功';
}
//wy账户转出50
$sql = 'update zhanghao set price = price - '.$price.' where name = "wy"' ;
$affected_row = $pdo->exec($sql);
if(!$affected_row) {
throw new PDOException('wy转出'.$price.'金额失败');
}else {
echo 'wy转出'.$price.'金额成功';
}
//提交事务
$pdo->commit();
}catch(PDOException $e) {
//回滚事务
$pdo->rollback();
echo $e->getMessage();
}
//重新开启事务提交
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,1);
/*
mysql> select * from zhanghao;
+----+------+-------+
| id | name | price |
+----+------+-------+
| 1 | yc | 550 |
| 2 | wy | 950 |
+----+------+-------+
2 rows in set (0.00 sec)
*/
mysql> select * from users1;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 3 | gg | 50 |
| 4 | gg | 50 |
| 5 | gg | 50 |
| 1 | yc | 37 |
| 2 | yc | 37 |
+----+------+-----+
5 rows in set (0.00 sec)
<?php
/*
使用pdo query()方法
当执行返回结果集select查询时,使用pdo对象中的query()方法。返回一个pdoStatement对象。
此对象相当于一个二维数组,直接遍历即可。
*/
try {
$dsn = 'mysql:dbname=xsphp;host=localhost';
$user = 'root';
$pwd = 'root';
$opt = array(PDO::ATTR_PERSISTENT=>true,PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,PDO::MYSQL_ATTR_INIT_COMMAND => 'set names gbk');
$pdo = new PDO($dsn,$user,$pwd,$opt);
}catch(PDOException $e) {
echo '数据库连接失败,'.$e->getMessage();
exit;
}
try {
$sql = 'select * from users1';
$stmt = $pdo->query($sql);
foreach($stmt as $row) {
echo $row['id'].' ' . $row['name'].' '.$row['age'].'<br/>';
}
}catch(PDOException $e) {
echo $e->getMessage();
}
/*
使用pdo过滤一些特殊字符,防止一些能引起sql注入的代码。我们在pdo中使用quote()方法实现。
例子如下:
*/
$query = 'select * from admin where user = '.$pdo->quote($_POST['user']).' and password = ' .$pdo->quote($_POST['password']);
<?php
/*
pdo对预处理语句的支持 insert update delete
*/
try {
$dsn = 'mysql:dbname=xsphp;host=localhost';
$user = 'root';
$pwd = 'root';
$opt = array(PDO::MYSQL_ATTR_INIT_COMMAND=>'set names gbk',PDO::ATTR_PERSISTENT=>true,PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION);
$pdo = new PDO($dsn,$user,$pwd,$opt);
}catch(PDOException $e) {
echo '数据库连接出错,'.$e->getMessage();
exit;
}
/*
在pdo中有两种占位符的语法:命名参数和问号参数。
使用哪种语法看个人喜好。
命名参数相当于关联数组。
问号参数相当于索引数组。
*/
try {
$sql = 'insert into users1 values(null,?,?)';
// $sql = 'insert into users1 values(null,:name,:age)';
$stmt = $pdo->prepare($sql);
/*
问号参数绑定参数方法
*/
$stmt->bindParam(1,$name);
$stmt->bindParam(2,$age);
/*
命名参数绑定参数方法
*/
/*
$stmt->bindParam(':name',$name);
$stmt->bindParam(':age',$age);
*/
$name = '那盒';
$age = 303;
if($stmt->execute()) {
echo '执行成功';
}else {
echo '执行失败';
}
}catch(PDOException $e) {
echo $e->getMessage();
}
<?php
/*
pdo对预处理语句的支持 insert update delete
不使用bindParam()方法,使用简便的方法。数组
*/
try {
$dsn = 'mysql:dbname=xsphp;host=localhost';
$user = 'root';
$pwd = 'root';
$opt = array(PDO::MYSQL_ATTR_INIT_COMMAND=>'set names gbk',PDO::ATTR_PERSISTENT=>true,PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION);
$pdo = new PDO($dsn,$user,$pwd,$opt);
}catch(PDOException $e) {
echo '数据库连接出错,'.$e->getMessage();
exit;
}
try {
// $sql = 'insert into users1 values(null,?,?)';
$sql = 'insert into users1 values(null,:name,:age)';
$stmt = $pdo->prepare($sql);
/*
问号参数,参数传递
if($stmt->execute(array('看看',60))) {
echo '执行成功';
}else {
echo '执行失败';
}
*/
/*
命名参数,参数传递.需要传递一个关联数组
*/
if($stmt->execute(array(':name'=>'李四',':age'=>60))) {
echo '执行成功';
}else {
echo '执行失败';
}
}catch(PDOException $e) {
echo $e->getMessage();
}
<?php
/*
pdo对预处理语句的支持 select
使用fetch()方法
*/
try {
$dsn = 'mysql:dbname=xsphp;host=localhost';
$user = 'root';
$pwd = 'root';
$opt = array(PDO::ATTR_PERSISTENT=>true,PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,PDO::MYSQL_ATTR_INIT_COMMAND=>'set names gbk');
$pdo = new PDO($dsn,$user,$pwd,$opt);
}catch(PDOException $e) {
echo $e->getMessage();
exit;
}
try{
$sql = 'select * from users1';
$stmt = $pdo->query($sql);
/*
PDO::FETCH_ASSOC: 从结果集中获取以列名为索引的关联数组
PDO::FETCH_NUM :从结果集中获取一个以列在行中的数值偏移为索引的值的数值
PDO::FETCH_BOTH (default): 这个是默认值,包含上面两种数组
PDO::FETCH_BOUND: 使用fetch()返回true,并将获取的列值赋给在bindParam()方法中指定的相应变量
*/
while($row = $stmt->fetch(PDO::FETCH_NUM)) {
foreach($row as $value) {
echo $value.' ';
}
echo '<br/>';
}
}catch(PDOException $e) {
echo $e->getMessage();
exit;
}
<?php
/*
pdo对预处理语句的支持 select
使用fetchAll()方法
fetchAll方法与fetch方法类似,但是该方法只需要调用一次就可以获取结果集中所有的行,并赋给
返回的二维数组。
*/
try {
$dsn = 'mysql:dbname=xsphp;host=localhost';
$user = 'root';
$pwd = 'root';
$opt = array(PDO::ATTR_PERSISTENT=>true,PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,PDO::MYSQL_ATTR_INIT_COMMAND=>'set names gbk');
$pdo = new PDO($dsn,$user,$pwd,$opt);
}catch(PDOException $e) {
echo $e->getMessage();
exit;
}
try{
$sql = 'select * from users1';
$stmt = $pdo->prepare($sql);
$stmt->execute();
$result = $stmt->fetchALL(PDO::FETCH_ASSOC);
/*
foreach($result as $row) {
foreach($row as $data) {
echo $data.'--';
}
echo '<br/>';
}
*/
foreach($result as $row) {
echo $row['id'].' '.$row['name'].' '.$row['age'].'<br/>';
}
}catch(PDOException $e) {
echo $e->getMessage();
exit;
}
/*
如果多次使用fetch()或fetchAll()。这时就可以使用pdostatement对象中的setFetchMode()方法。
例子:
$pdo->setFetchMode(PDO::FETCH_ASSOC);
*/
<?php
/*
pdo对预处理语句的支持 select
使用bindColumn()方法
该方法可以将一个列和一个指定的变量名绑定。
必须在fetch()方法的参数设置为PDO::FETCH_BOTH.
经测试也可以不用设定
*/
try {
$dsn = 'mysql:dbname=xsphp;host=localhost';
$user = 'root';
$pwd = 'root';
$opt = array(PDO::ATTR_PERSISTENT=>true,PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,PDO::MYSQL_ATTR_INIT_COMMAND=>'set names gbk');
$pdo = new PDO($dsn,$user,$pwd,$opt);
}catch(PDOException $e) {
echo $e->getMessage();
exit;
}
try{
$sql = 'select id,name,age from users1';
$stmt = $pdo->prepare($sql);
$stmt->execute();
$stmt->bindColumn(1,$id);
$stmt->bindColumn(2,$name);
$stmt->bindColumn(3,$age);
while($stmt->fetch()) {
echo $id.' '.$name.' '.$age.'<br/>';
}
}catch(PDOException $e) {
echo $e->getMessage();
exit;
}