php技术和开源cms使用
php/mysql/oracle:使用pdo连接和操作数据库
PDOStatement对象
(1)pdo连接mysql
//数据库配置信息 $dsn = "mysql:host=127.0.0.1;port=3306;dbname=db;charset=utf8"; $username="root"; $password="123456"; //创建pdo类对象 $pdo=new PDO($dsn,$username,$passoword); var_dummp($pdo);// 返回一个PDO对象 object(PDO)#1 (0){}
(2)PDO对象常用方法
$sql="insert into ..."; $rows=$pdo->exec($sql);// exec执行一条 SQL 语句,并返回受影响的行数 $lastid=$pdo->lastInsertId();//返回最后插入行的ID // ============= $sql="select * from table"; $stmt=$pdo->query($sql);//返回PDOstatement对象 //================ $pdo->setAttribute(PDO:ATTR_DEFAULT_FETCH_MODE,PDO:FETCH_ASSOC);//设置属性 这里是设置返回关联数组 // 循环结果集数据 fetch()方法 while($arr=$stmt->fetch(PDO::FETCHASSOC)){ print_r($arr); } //fetchAll()方法 返回一个包含结果集中所有行的数组 $data=$stmt->fetchAll(PDO::FETCH_ASSOC);// FETCH_ASSOC/FETCH_BOTH/FETCH_NUM //rowCount()方法 返回受上一个 SQL 语句影响的行数 $count=$stmt->rowCount();
(3)错误处理
三种错误模式
静默模式(Silent):错误发生后,不会主动报错,是默认的模式;
$stmt=$pdo->query($sql); echo $pdo->errorCode();//错误编号 var_dump($pdo->errorInfo());//错误信息警告模式(Warning):错误发生后,通过PHP标准来报告错误;直接显示错误信息,不太安全。
$pdo->setAttribute(PDO: :ATTR ERRMODE,PDO::ERRMODE_WARNING);//setAttribute指定为Warning模式异常模式(Exception):错误发生后,抛出异常,需要捕捉和处理;
$pdo->setAttribute(PDO::ATTR ERRMODE,PDO::ERRMODE EXCEPTION); try{//执行查询的SOL语句,执行成功返回结果集对象(PDostatement类) $sql="****"; $stmt= $pdo->query($sql); }catch(Exception $error){ //输出异常信息 echo"错误编号:".$error->getCode(); echo"<br>错误行号:".$error->getLine(); echo "<br>错误文件:".$error->getFile(); echo"<br>错误信息:".$error->getMessage(); }(4)PDO预处理
$sql1="INSERT INTO student(name,salary,bonus,city)VALUES(:name,:salary,:bonus,:city)";//使用(:value)作为占位符方式 $stmt1= $pdo->prepare($sql1); $stmt1->bindValue(':name','五四张');//绑定值 (bindValue可以绑定常量,bindParam不能绑定常量) stmt1->bindValue(':salary',8000); $stmt1->bindValue(':bonus',900); $stmt1->bindValue(':city','山东省'); $stmt1->execute(); //=================================== $sql2="INSERT INTO student(name,salary,bonus,city)VALUES(?,?,?,?)";//使用(:?)作为占位符方式 $stmt2= $pdo->prepare($sql2); $stmt2->bindValue(1,'五四张'); stmt2->bindValue(2,8000); $stmt2->bindValue(3,900); $stmt2->bindValue(4,'山东省'); $stmt2->execute();
一份示例代码:
//连接oracle数据库 public static function getOracle(){ $dsn = 'oci:dbname=//主机ip:端口/服务名;charset=字符集'; $user = '用户名'; $pass = '密码'; $pdo = new PDO($dsn,$user,$pass); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //设置为异常错误模式 $pdo->setAttribute(PDO::ATTR_CASE,PDO::CASE_UPPER); return $pdo; } //================================================== //连接mysql数据库 public static function getHR_DB(){ $dsn = 'mysql:host=主机ip;dbname=库名'; $user = '用户名'; $pass = '密码'; $pdo = new PDO($dsn,$user,$pass); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdo->setAttribute(PDO::ATTR_CASE,PDO::CASE_UPPER); $pdo->exec("SET NAMES GBK");//设置字符集 return $pdo; }
更多示例
$pdo = new PDO('sqlite:/path/db/users.db'); $stmt = $pdo->prepare('SELECT name FROM users WHERE id = :id'); $id = filter_input(INPUT_GET, 'id', FILTER_SANITIZE_NUMBER_INT); // <-- 过滤传入数据(请参考 PHP 过滤器), 对于INSERT、UPDATE等操作尤为重要。 $stmt->bindParam(':id', $id, PDO::PARAM_INT); // <-- 通过PDO自动过滤SQL $stmt->execute();