当前位置: 首页 > 后端技术 > PHP

PHP数据库操作

时间:2023-03-29 23:44:48 PHP

PHP两种形式的数据库操作使用PDO扩展类库(推荐)使用Mysqli扩展类库(这是Mysql类库的升级版,但不再推荐)哪三个类做PDO扩展包含PDOPDOStatementPDOExceptionPDO与Mysqli不同的是,PDO可以支持多个数据库,操作方法相同。Mysqli只支持Mysql数据库。如何使用PDO连接数据库?什么是DSN?如何关闭连接?通过newPDO()连接数据库,其中必须传入DSN数据源名try{$db=newPDO($dsn,$user,$password);}catch(PDOException$e){echo'连接失败:'。$e->getMessage();}DSN(数据源名称)告诉PDO使用哪个驱动连接数据库,每个数据库DSN不同MysqlDSNmysql:host=localhost;dbname=testoracleDSNoci:dbname=//localhost:232/mydb;charset=utf-8关闭连接:$db=null;如何设置PDO连接相关的选项?设置连接选项的两种方式1.newPDO()的第四个参数//必须使用该方法设置持久数据库连接,否则无效$opt=array(PDO::ATTR_PERSISTENT=>true,PDO::ATTR_TIMEOUT=>0,PDO::ATTR_AUTOCOMMIT=>true);try{$db=newPDO($dsn,$user,$password,$opt);}catch(PDOException$e){echo'连接失败:'.$e->getMessage();}2.使用PDO对象的setAttribute()方法try{$db=newPDO($dsn,$user,$password);$db->setAttribute(PDO::ATTR_TIMEOUT,3600);}catch(PDOException$e){echo'连接失败:'.$e->getMessage();}//如何结合getAttribute()方法设置PDO错误处理方式?三种错误处理模式是什么?1.PDO::ERRMODE_SILENT(默认,无提示,需要结合errorCode()和errorInfo())2.PDO::ERRMODE_WARNING(警告)3.PDO::ERRMODE_EXCEPTION(报告异常,推荐)一般用例try{$db=newPDO($dsn,$user,$password);$db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);}catch(PDOException$e){echo'Connectionfailed:'.$e->getMessage();}PDO执行SQL有哪些方法?exec()----不推荐,后面会解释exec()主要:执行无结果集的SQL语句增删改查,创建返回受影响的行数query()----不推荐,后面会解释query()主要:用结果集执行SQL语句查询,返回PDOStatement对象。对于某些SQL,它既不是操作也不是结果。prepare()可以使用以上任何一种方法----推荐,后面会有PDO事务如何实现的说明?操作的Mysql数据表必须是InnoDB关闭自动提交$db->setAttribute(PDO::ATTR_AUTOCOMMIT,0);打开事务$db->beginTransaction();手动提交$db->commit();事务回滚$db->rollBack();事务完成后,最好开启自动提交$db->setAttribute(PDO::ATTR_AUTOCOMMIT,1);什么是SQL注入?如何防止SQL注入?SQL注入其实就是用户输入的数据带有攻击成分,所以用户输入的信息是不可靠的。由于以上原因,exec()和query()方法之前并不常用。不安全,但是只要不使用用户数据产生的SQL,可以通过exec()和query()使用preparedstatements来防止SQL注入编译后,不执行$stmt=$db->prepare('insertintouser(name,pwd,age)values(?,?,?)');//绑定参数(?)$stmt->bindParam(1,$name);$stmt->bindParam(2,$pwd);$stmt->bindParam(3,$age);$name='wwww';$pwd='12112';$年龄=18;//执行存储在数据库中的Statements$stmt->execute();$name='bb';$pwd='ad22121';$年龄=20;//执行存储在数据库中的语句$stmt->execute();}catch(PDOException$e){echo$e->getMessage();exit();}简化模式:try{//把这条语句放到数据库上,编译后等待,不执行$stmt=$db->prepare('insertintouser(name,pwd,age)values(?,,?)');//执行存储在数据库中的语句$stmt->execute(array('wwww','12112',18));}catch(PDOException$e){echo$e->getMessage();exit();}准备好的语句中有哪两种占位符?有什么注意事项?两种占位符:命名占位符和问号占位符问号占位符就是上面的命名占位符,如下,建议使用命名控制符执行$stmt=$db->prepare('插入使用r(姓名,密码,年龄)值(:姓名,:密码,:年龄)');//绑定参数(?)$stmt->bindParam(1,$name);$stmt->bindParam(2,$pwd);$stmt->bindParam(3,$age);$name='wwww';$pwd='12112';$年龄=18;//执行存储在数据库中的语句$stmt->execute();$name='bb';$pwd='ad22121';$年龄=20;//执行存储在数据库中的语句$stmt->execute();}catch(PDOException$e){echo$e->getMessage();exit();}注意事项参数绑定不能应用于表名//Error$sth=$dbh->prepare('SELECTname,colour,caloriesFROM?WHEREcaloriesprepare('SELECTname,color,caloriesFROMfruitWHEREcaloriesprepare('SELECTname,colour,caloriesFROMfruitWHERE?prepare('SELECT名称、颜色、来自水果的卡路里,其中卡路里setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);}catch(PDOException$e){echo'连接失败:'.$e->getMessage();}try{$stmt=$db->prepare('insertintouser(name,pwd,age)values(?,?,?)');$stmt->执行(数组('wtao','23232',14));$count=$stmt->rowCount();if($count===0){抛出新的PDOException();}$id=$db->lastInsertId();}catch(PDOException$e){echo'连接失败:'.$e->getMessage();}检查尝试{$db=newPDO($dsn,$name,$pwd);$db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);}catch(PDOException$e){echo'连接失败:'.$e->getMessage();}try{$stmt=$db->prepare('SELECTname,age,titleFROMfruitWHEREid执行(数组(14));while(list($name,$age,$title)=$stmt->fetch(PDO::FETCH_NUM)){}}catch(PDOException$e){echo'连接失败:'.$e->getMessage();}注意$stmt->execute()的返回值,如果是异常模式,则不需要处理返回值,只有在非异常处理模式下,你需要判断处理$db->准备();preparedstatements的准备是分开的,返回的PDOStatement对象也是分开的。如果一个函数需要执行多条SQL语句,请先准备多个PDOStatement对象,然后分别执行