一、增、删、查
<?php
//PDO连接MSSQL例子,注意一个驱动和一个扩展,这里使的是mssql13.0的一个驱动,使用18.0时报错
// $dsn='sqlsvr:MSSQL';
// 服务器名称
$serverName = "127.0.0.1";
// 数据库名称(可选),不传取的是默认的master库
$database = "test01";
//sql server数据库用户
$uid = "";
//sql server数据库用户密码
$pwd = "";
//拼接连接字符串,pdo_sqlsvr的dsn以sqlsrv:为前缀
$dsn="sqlsrv:server=$serverName ; Database = $database";
// 创建PDO对象
$PDO = new PDO($dsn,$uid,$pwd);
// $conn = new PDO('sqlsrv:Server=(local)', '', '');
// $conn->query($statement);
// 拼装查询sql,不用处理中文编码问题
$query="select * from t1 where name='中国'";
//query()函数执行语句,返回一个PDOStatement 对象。
$stmt = $PDO->query( $query );
// PDOStatement 对象调用 fetch() 函数在结果集中获取行。返回组果是数据
while ( $row = $stmt->fetch() ){
if(is_array($row)){
// 调用print_r方法输出结果
print_r( $row );
}
}
//拼装插入语句,同样不用处理中文编码问题。
$id=mt_rand();
$insert="insert into t1(id,name,qty,orderid)values($id,'中国人',50,1002)";
//$PDO对象执行exec()返回受影响的行数。
$count=$PDO->exec($insert);
if($count>0){
echo "新增完成";
}else{
echo "新增失败";
}
//$PDO->prepare($insert)方法预处理语句,?占位符插入数据,并 捕获 INSERT 语句的结果 用 OUTPUT 子句 输出最后插入的ID值
// https://docs.microsoft.com/zh-cn/sql/t-sql/statements/insert-transact-sql?view=sql-server-ver15
$insert="insert into t1(id,name,qty,orderid) OUTPUT INSERTED.id values(?,?,?,?)";
//创建$stmt pdostatement对象,prepare()预处理函数返回
$stmt=$PDO->prepare($insert);
$id=mt_rand();
//$stmt pdostatement对象,执行Execute(arr())填入数组变量以填充占位符的值,方法返回的是bool。
$stmt->execute(array($id,'预处理语句',100,1001));
// 用if有没有执行成功。
if ($stmt){
// 遍历结果集把output子句的结果返回
while ($lastid=$stmt->fetch()) {
// 把数组转生json字符串,然后输出,json_encode()有一个需要注意的地方,All string data must be UTF-8 encoded
$rs=json_encode($lastid);
echo $rs;
}
}
二、SQL语句错误捕获
<?php
// 捕获sql语句的错误。使用PDO对象ATTR_ERRMODE不同模式。
$serverName="127.0.0.1";
$db="test01";
$User="";
$PassWord="";
$dsn="sqlsrv:Server=$serverName;Database=$db";
$PDO = new PDO($dsn,$User,$PassWord);
/*
*PDO对象调用setAttribute(PDO::ATTR_ERRMODE[属性_错误模式],PDO::ERRMODE_SILENT[值])方法,
*设置错误模式为【静默模式】,手动检查代码处理异常
*
*设置错误模式为【警告模式】,手动检查代码处理异常
*
*设置错误模式为【异常模式】,手动检查代码处理异常,默认是异常模式
*/
// $PDO->setAttribute(pdo::ATTR_ERRMODE, pdo::ERRMODE_SILENT);
// $PDO->setAttribute(pdo::ATTR_ERRMODE, pdo::ERRMODE_WARNING);
$PDO->setAttribute(pdo::ATTR_ERRMODE, pdo::ERRMODE_EXCEPTION);
/*
* 拼接sql
*/
$sql="select * from test2";
/*
* PDO对象调用prepare()方法,生成预处理对象;
*/
$stmt=$PDO->prepare($sql);
/*
* 预处理对象,调用execute()方法,执行语句;
*/
try{
$stmt->execute();
}
catch (PDOException $e){
echo $e->getMessage();
}
/*
* 预处理对象,调用errorcode()方法,获取错误码代码;
*/
$errCode=$stmt->errorCode();
/*
* 如果错误代码不为空,调用errorinfo()获取错误信息;
*/
// if($errCode<>""){
// echo $stmt->errorInfo()[2];
// }
echo $errCode;
/*
* 三个模式的个人总结:
* pdo::ERRMODE_SILENT 静默模式 在调用execute()方法时不主动给错误信息,不会中断代码执行,后面的代码继续执行。
*
* pdo::ERRMODE_WARNING 警告模式 在调用execute()方法返回错误信息,代码继续行下执行。
*
* pdo::ERRMODE_EXCEPTION 异常模式 在调用execute()方法时抛出异常对象 PDOException,并中断代码执行,使用try{}catch(){}代码块捕获并处理异常
*/
三、PDO事务处理
<?php
/*
* PDO事务处理
*/
/*
* 创建PDO对象部分代码
*/
$serverName='127.0.0.1';
$dbName='Test0';
$dbUser='';
$dbPws='';
$dsn="sqlsrv:Server=$serverName;Database=$dbName";
/*
* 使用try{}catch(){}代码块包裹PDO对象执行,如果发生异常捕获PDOException对象,返回异常信息,并调用rollback()方法回滚事务。
*/
try {
$pdo = new PDO($dsn,$dbUser,$dbPws);
/*
* 拼装SQL语句,生成预处理对象;
*/
$id=mt_rand();
$insert="insert into t1(id,name,qty,orderid)values($id,'中国人',50,1002)";
$stmt1=$pdo->prepare($insert);
$id=mt_rand();
$insert="insert into t3(id,name,qty,orderid)values($id,'中国人',50,1002)";
$stmt2=$pdo->prepare($insert);
/*
* 调用方法开启事务 beginTransaction(),
*/
$pdo->beginTransaction();
/*
* 预处理对象调用execute()方法执行语句;
*/
$stmt1->execute();
$stmt2->execute();
/*
* PDO对象调用commit()提交事务
*/
$pdo->commit();
} catch (PDOException $e) {
/*
* 如出现异常,捕获异常对象,输异常信息,PDO对象调用rollBack()方法回滚事务
*/
echo $e->getMessage();
$pdo->rollBack();
}