1.pdo连接数据库(初始化):
$pdo=new PDO("mysql:host=localhost;dbname=库名","用户名","密码");
2.执行增删改:
$res=$pdo->exec("增删改的操作语句");
返回的是影响条数,如果没影响返回0
$id=$pdo->lastInsertId();
获取最后一条插入的id
3.执行查询
$obj=$pdo->query("select * from A");
遍历该$obj对象可获取数据
4.预处理
$pdoStm=$pdo->prepare($sql);
$res=$obj->execute(); //返回bool
$pdoStm->fetch(PDO::FETCH_ASSOC); //获取查询结果中的一行,要配合while
$pdoStm->fetchAll(PDO::FETCH_ASSOC); //获取所有数据,是个二维数组
$pdoStm->setFetchMode(PDO::FETCH_ASSOC); //设置获取数据的形式是关联数组
5.占位符的使用
a.
$sql="select * from user where name=:name and password=:password"; //占位符不用加引号
$pdoStm=$pdo->prepare($sql);
$pdo->execute([':name'=>xxx,':password'=>xxx]);
另一种形式的占位符
使用占位符可以解决sql注入的问题
$sql="select * from user where name=? and password=?";
$pdoStm=$pdo->prepare($sql);
$pdo->execute([xxx,xxx]);
b.使用bindParam()方法绑定参数到占位符
$sql="insert into user values (null,:name,:password);
$pdoStm=$pdo->prepare($sql);
$pdoStm->bindParam(":name",$name,PDO::PARAM_STR);
$pdoStm->bindParam(":password",$password,PDO::PARAM_STR);
$name="aaa";
$password="bb";
$pdoStm->execute();
//如果还想插入一条数据
$user="xxx";
$password="mm";
$pdoStm->execute();
使用?占位则$pdoStm->bindParam(1,$user);$pdoStm->bindParam(2,$password);
bindValue()用法和bindParam()一样,区别是后者是引用传值,传给占位符的值必须是变量不能是值
而bindValue()可以是值,它不是引用传值的机制
$pdoStm->bindParam(":name","zbp"); 是错的
6.错误信息
$pdo->errorInfo()
或者
$pdoStm->errorInfo()
返回的是一个索引数组,第一个元素是错误码,00000表示没有错误;第二个元素是错误信息
最后贴出来一个自定义的PDO类:
class PdoMysql
{
private static $config=[];//设置配置信息
private static $link=null;//保存链接标识符
private static $PDOStatement=null;//保存PDOStatement对象
private static $queryStr='';//保存最近一条sql语句
private static $error='';//保存错误信息
private static $lastInsertId=0;//保存最后一条插入的ID
private static $effectedRow=0;//保存增删改时,受影响条数
public function __construct($configPath,$dbConfig=""){
if(!class_exists("PDO")){
self::throw_exception("不支持PDO,请先开启");
}
if(!empty($configPath)){
require($configPath);
$dbConfig=[
"username"=>DB_USER,
"password"=>DB_PWD,
"dsn"=>DB_TYPE.":host=".DB_HOST.";dbname=".DB_NAME
];
}
self::$config=$dbConfig;
if(!self::$link){//单例模式
$configs=self::$config;
try{
self::$link=new PDO($configs['dsn'],$configs['username'],$configs['password']);
}catch(PDOException $e){
self::throw_exception($e->getMessage());
}
if(!self::$link){
self::throw_exception("PDO连接错误");
return false;
}
// self::$link->exec("set character_set_server=".DB_CHARSET);//这一句的含义是建表的时候,表是utf8还是gbk,一般在php中操作数据库时,表已经建好,所以没必要使用这句话
self::$link->exec("set names ".DB_CHARSET);//这句是写入数据的时候,写入的是utf8的数据还是gbk的
}
}
/*
*获取所有记录
*/
public static function getAll($sql=null){
if($sql){
self::query($sql);
$res=self::$PDOStatement->fetchAll(PDO::FETCH_ASSOC);
return $res;
}
self::throw_exception("sql语句为空");
return false;
}
/*
*获取一条记录
*/
public static function getRow($sql=''){
if($sql){
self::query($sql);
$res=self::$PDOStatement->fetch(PDO::FETCH_ASSOC);
return $res;
}
self::throw_exception("sql语句为空");
return false;
}
/*
*根据主键查询
*/
public static function findById($table,$id,$fields='*'){
$sql="select %s from %s where id=%d";
$sql=sprintf($sql,self::parseFields($fields),$table,$id);
return self::getRow($sql);
}
/*
*根据条件查询
*/
public static function find($table,$fields='*',$condition=['where'=>'','group'=>[],'having'=>'','order'=>'',"limit"=>[]]){
$sql='select '.self::parseFields($fields).' from '.$table;
if(!empty($condition['where'])){
$sql.=self::where($condition['where']);
}
if(!empty($condition['group'])){
$sql.=self::group($condition['group']);
}
if(!empty($condition['having'])){
$sql.=self::having($condition['having']);
}
if(!empty($condition['order'])){
$sql.=self::order($condition['order']);
}
if(!empty($condition['limit'])){
$sql.=self::limit($condition['limit']);
}
$res=self::getAll($sql);
return $res;
}
/*
*$data为键值对数组
*/
public static function add($table,$data=[]){
if(!$data){
self::throw_exception("传入数据不可为空");
return false;
}
foreach($data as $k=>$v){
$key[]='`'.$k.'`';
$value[]="'".$v."'";
}
$sql="insert into {$table} (".implode(",",$key).") values (".implode(",",$value).")";
$res=self::execute($sql);
return $res;
}
/*
*更新数据,要有条件:update 表明 set xxx='xxx',... where ...
*/
public static function update($table,$data=[],$where=''){
if(!$data){
self::throw_exception("传入数据不可为空");
return false;
}
$dataStr="";
foreach($data as $k=>$v){
$dataStr.="`".$k."`='".$v."',";
}
$dataStr=rtrim($dataStr,",");
$sql="update {$table} set ".$dataStr.self::where($where);
$res=self::execute($sql);
return $res;
}
/*
*删除数据,要有条件
*/
public static function delete($table,$where=''){
if(!$where){
self::throw_exception("删除数据必须有条件");
return false;
}
$sql="delete from {$table} ".self::where($where);
$res=self::execute($sql);
return $res;
}
/*
*获取插入的最后一条的id
*/
public static function getLastInsertId(){
return self::$lastInsertId;
}
/*
*获取总记录数
*/
public static function getRowNum($table){
$sql="select count(*) from {$table}";
$num=self::$PDOStatement->fetchColumn(0);
return $num;
}
/*
*用于完成查询操作
*/
public static function query($sql=''){
$link=self::$link;
//判断之前是否有结果集,如果有则释放一下结果集
if(!empty(self::$PDOStatement)){
self::free();
}
self::$queryStr=$sql;
self::$PDOStatement=$link->prepare(self::$queryStr);
$res=self::$PDOStatement->execute();
self::haveErrorThrowException();
return $res;
}
private static function parseFields($fields){
if(is_array($fields)){
foreach($fields as $k=>$v){
$fields[$k]="`".$v."`";
}
$fieldsStr=implode(',',$fields);
}else{
if(!$fields){
$fields="*";
}
$fieldsStr=$fields;
}
return $fieldsStr;
}
/*
*$where只允许是字符串
*/
private static function where($where=''){
$whereStr="";
if(is_string($where) && trim($where)){
$whereStr=" where ".$where;
}
return $whereStr;
}
/*
*$group可以是字符串或者数组
*/
private static function group($group=[]){
$groupStr="";
if(is_array($group) && count($group)){
$groupStr=" group by ";
foreach($group as $k=>$v){
$group[$k]="`".$v."`";
}
$groupStr.=implode(",",$group);
}elseif(is_string($group) && trim($group)){
$groupStr=" group by ".$group;
}
return $groupStr;
}
/*
*having只允许是字符串
*/
private static function having($having=''){
$havingStr="";
if(is_string($having) && trim($having)){
$havingStr=" having ".$having;
}
return $havingStr;
}
/*
*$order只允许是字符串
*/
private static function order($order=''){
$orderStr="";
if(is_string($order) && trim($order)){
$orderStr=" order by ".$order;
}
return $orderStr;
}
/*
*$limit可以是字符串或者数组
*/
private static function limit($limit=[]){
$limitStr="";
if(is_array($limit)){
$num=count($limit);
switch($num){
case 1:$limitStr=" limit ".$limit[0];break;
case 2:$limitStr=" limit ".$limit[0].",".$limit[1];break;
default:$limitStr="";
}
}elseif((is_string($limit) && trim($limit)) || is_numeric($limit)){
$limitStr=" limit ".$limit;
}
return $limitStr;
}
/*
*用于完成增删改操作
*/
public static function execute($sql=''){
$link=self::$link;
self::$queryStr=$sql;
if(self::$PDOStatement){//其实增删改和PDOStatement对象没什么关系,但保险起见还是删一下的好
self:free();
}
$res=$link->exec($sql);
self::haveErrorThrowException();
if($res!==false){
self::$lastInsertId=$link->lastInsertId();//如果执行的不是插入操作,则返回0
self::$effectedRow=$res;//受影响的条数
return $res;
}else{
return false;
}
}
private static function haveErrorThrowException(){
$obj=empty(self::$PDOStatement)?self::$link:self::$PDOStatement;
$arrError=$obj->errorInfo();
if($arrError[0]!='00000'){
self::$error='SQLSTATE '.$arrError[0].'; SQL Error '.$arrError[2].'
Error SQL : '.self::$queryStr;
self::throw_exception(self::$error);
return false;
}
}
/*
*释放结果集
*/
private static function free(){
self::$PDOStatement=null;
}
private static function throw_exception($errMsg){
echo "
.$errMsg.
"
}
}
?>
代码段 小部件