标签:
三套方案 mysql mysqli pdo
1、mysql扩展库 效率不怎么高的数据库
2、mysqli扩展库
3、pdo 可以操作任何一种数据库
mysql扩展库和mysqli的扩展库,扩展库就是操作数据库的一个集合
mysql数据库是用于存放数据的
可以查看php可以使用的扩展库 phpinfo();
创建新表
CREATE table user(
id int primary key auto_increment,
name varchar(32) not NULL,
PASSWORD VARCHAR(64) not NULL,
emial VARCHAR(128) not NULL,
age TINYINT UNSIGNED not NULL
)
预先加载数据
mysql中密码的处理,对一个明文加密成一个密文,而且这个过程是不可逆的。由密文推不出明文。
INSERT INTO user(name,password,emial,age) values(‘zs’,MD5(‘123456’),’1051743154@qq.com’,12)其中md5这个函数就是实现对密码的加密
解决数据库不能插入中文
INSERT INTO user(name,password,emial,age) values(‘赵文娟’,MD5(‘123432326’),’1051743154@qq.com’,12)
中文在数据库就不能正常的显示
新建数据库的时候一定要选择正确的编码格式
php利用扩展库操作mysql
1、获取连接
die(“连接失败”.mysql_error);
}
2、选择数据库
mysql_select_db(“senjintang”);
3、设置操作编码
mysql_query(“set names utf8”); 出现中文乱码的时候可以尝试使用
4、向数据库发送指令sql(ddl数据定义语言 创建表 dml数据操作语言 dql数据查询语句select dtl数据事物语句 rollback commit)
mysql_fetch_assoc(
mysql_fetch_object(
但是这资格函数使用完以后,都必须释放资源
6、释放资源,关闭连接
mysql_free_result($res); //释放结果集
mysql_close(); //关闭连接 不是必须的,会在脚本执行完以后自动关闭
mysqli_error() 可以打印连接的错误
注意:在对数据库执行dml(非select的数据库查询以后),一定不要再进行释放资源,也就是 mysql_free_result(
实现对数据库的插入操作
//server的名称 数据库的用户名和密码
$connection=mysql_connect("127.0.0.1","root","");
if(!$connection){
die("连接失败".mysql_error);
}
mysql_select_db("senjintang");
mysql_query("set names utf8");
$sql="insert into user(name,password,emial,age) values (‘小敏‘,md5(‘123‘),‘xiaoming‘,34)";
//如果是dml操作,调用这个函数以后返回的是一个布尔值
$res=mysql_query($sql,$connection);
$affected_number=mysql_affected_rows($connection);
if(!$res){
die("操作失败".mysql_error());
}
if($affected_number>0){
echo "对数据库的影响为$affected_number";
}else{
echo "操作没成功";
}
mysql_close($connection);
实现对数据库删除数据的操作
//server的名称 数据库的用户名和密码
$connection=mysql_connect("127.0.0.1","root","");
if(!$connection){
die("连接失败".mysql_error);
}
mysql_select_db("senjintang");
mysql_query("set names utf8");
$sql="delete from user where id=5";
//如果是dml操作,调用这个函数以后返回的是一个布尔值
$res=mysql_query($sql,$connection);
$affected_number=mysql_affected_rows($connection);
if(!$res){
die("操作失败".mysql_error());
}
if($affected_number>0){
echo "对数据库的影响为$affected_number";
}else{
echo "操作没成功";
}
mysql_close($connection);
对数据库的更新操作
//server的名称 数据库的用户名和密码
$connection=mysql_connect("127.0.0.1","root","");
if(!$connection){
die("连接失败".mysql_error);
}
mysql_select_db("senjintang");
mysql_query("set names utf8");
$sql="update user set age=100 where id=4";
//如果是dml操作,调用这个函数以后返回的是一个布尔值
$res=mysql_query($sql,$connection);
$affected_number=mysql_affected_rows($connection);
if(!$res){
die("操作失败".mysql_error());
}
if($affected_number>0){
echo "对数据库的影响为$affected_number";
}else{
echo "操作没成功";
}
mysql_close($connection);
上面可见代码的复用性不高,所以将对数据库的操作封装成一个工具类。
mysqltool.php
<?php
class SqlTool{
private $conn;
private $host="127.0.0.1";
private $user="root";
private $password="";
private $db="senjintang";
function SqlTool(){
$this->conn=mysql_connect($this->host,$this->user,$this->password);
if(!($this->conn)){
die("连接数据库发生错误".mysql_error());
}
mysql_select_db($this->db,$this->conn);
mysql_query("set names utf8");
}
//完成slect
public function execute_dql($sql){
//失败的时候就退出了
$res=mysql_query($sql) or die(mysqli_error());
return $res;
}
//完成dml
public function execute_dml($sql){
$b=mysql_query($sql,$this->conn);
if(!$b){
return 0; //表示失败
}else{
if(mysql_affected_rows($this->conn)>0){
return 1;//表示成功
}
else{
return 2; //表示没有对数据库影响
}
}
}
}
?>
相当于上面的mysql的扩展库的一个增强版
mysql和mysqli的比较
1、稳定性、安全性、效率有所提高
2、mysqli提供了面向对象的编程思想。
mysqli有两套编程风格
面向对象
1、创建mysqli对象
$mysqli=new MySQLi("127.0.0.1","root","","senjintang");
//按章是否ok
if($mysqli->connect_error){
die("连接失败".$mysqli->connect_error);
}
else{
echo "连接成功";
}
2、操作数据库
$sql="select * from user";
$res=$mysqli->query($sql);
3、处理结果
while($row=$res->fetch_row()){
foreach($row as $key=>$val){
echo $val;
}
echo "<br/>";
}
4、关闭资源
//关闭资源 这一个步骤是必须的
$res->free();
//断开连接
$mysqli->close();
使用面向对象的方式,实现利用扩展库对数据库的操作
<?php
//防止乱码
header("Content-type:text-html;charset=utf-8");
$mysqli=new MySQLi("127.0.0.1","root","","senjintang");
//按章是否ok
if($mysqli->connect_error){
die("连接失败".$mysqli->connect_error);
}
else{
echo "连接成功";
}
$mysqli->query("set names utf8");
$sql="select * from user";
$res=$mysqli->query($sql);
//返回的是一个对象 mysqliResult
echo "<br/>";
var_dump($res);
echo "<br/>";
//fetch_row这是mysqliResult的一个方法
while($row=$res->fetch_row()){
foreach($row as $key=>$val){
echo $val;
}
echo "<br/>";
}
//关闭资源 这一个步骤是必须的
$res->free();
//断开连接
$mysqli->close();
//对于这种面向对象的方式,
?>
注意:防乱码
//防止乱码
header(“Content-type:text-html;charset=utf-8”);
可以保证往数据库里边插入正确的汉字
$mysqli->query(“set names utf8”);
mysql中sql语句的特别说明:
如果操作的字段类型是字符串类型的则要求我们要使用”包括,
如果操作的字段是数值型的,则可以用”包括,也可以不使用
<?php
class SqlHelper{
private $mysqli;
//将来这些配置文件都会写在一个文件中
private static $host="localhost";
private static $user="root";
private static $password="";
private static $db="senjintang";
public function __construct(){
//完成初始化的操作
$this->mysqli=new MySQLi(self::$host,self::$user,self::$password,self::$db);
if($this->mysqli->connect_error){
die("连接失败").$this->mysqli->connect_error;
}
//设置访问数据库的字符集
//这句话的作用是保证php是以utf8的方式来操作mysql数据库
$this->mysqli->query("set names utf8");
}
public function execute_dql($sql){
$res=$this->mysqli->query($sql) or die("操作dql".$this->mysqli->error);
return $res;
}
public function execute_dml($sql){
$res=$this->mysqli->query($sql) or die("操作dql".$this->mysqli->error);
if(!$res){
return 0; //表示失败
}
else if($this->mysqli->affected_rows>0){
return 1; //表示成功执行
}
else{
return 2; //表示没有收影响的行数
}
}
}
?>
mysql可以批量执行sql语句
1、批量执行dml语句
基本语法:
批量添加、更新、删除
<?php
include ‘includes/header.html‘;
$mysqli=new MySQLi("localhost","root","","senjintang");
if($mysqli->connect_error){
die("连接错误".$mysqli->connect_error);
}
$mysqli->query("set names utf8");
$sqls=" insert into user (name,password,emial,age) values(‘松江‘,md5(‘aaa‘),‘1051743154@qqq.com‘,21);";
$sqls.="insert into user (name,password,emial,age) values(‘卢俊义‘,md5(‘aaa‘),‘1051743154@qqq.com‘,21);";
$sqls.="insert into user (name,password,emial,age) values(‘赵文娟‘,md5(‘aaa‘),‘1051743154@qqq.com‘,21);";
$b=$mysqli->multi_query($sqls);
if(!$b){
echo "执行失败".$mysqli->error;
}
else{
echo "执行成功";
}
?>
这里的$sqls可以是增加、更新、删除这三种语句,但是最好不要使用select语句,接下来就是批量的执行dql语句
2、批量执行dql语句
批量执行select语句、可以一次性的返回多个结果集
<?php
include ‘includes/header.html‘;
$mysqli=new MySQLi("localhost","root","","senjintang");
if($mysqli->connect_error){
die("连接错误".$mysqli->connect_error);
}
$mysqli->query("set names utf8");
//这里的sqls可以是多个sql语句但是必须用;隔开
$sqls=" select * from user;";
$sqls.="select * from users;";
//如果就会取出至少一个结果集
if($res=$mysqli->multi_query($sqls)){
do{
//从mysqli连接取出第一个结果集 也就是结果集的第一行
$result=$mysqli->store_result();
//显示mysqli result对象
while($row=$result->fetch_row()){
foreach($row as $key=>$val)
{
echo "$key.$val<br/>";
}
echo "<br/>";
}
$result->free();
if(!$mysqli->more_results()){
break;
}
echo "新的结果集<br/>";
}while($mysqli->next_result());
$mysqli->close();
};
?>
应用场景:有一张银行账号表,id balance一段php程序来实现转账
1号账户10 元转到2号账户
<?php
include ‘includes/header.html‘;
$mysqli=new MySQLi("localhost","root","","senjintang");
if($mysqli->connect_error){
die("连接错误".$mysqli->connect_error);
}
$sql1="update account set balance=balance-2 where id=1";
$sql2="update account set balance=balance+2 where id=2";
$b1=$mysqli->query($sql1);
$b2=$mysqli->query($sql2);
if(!$b1||!$b2){
echo "转账失败".$mysqli->error;
}else{
echo "转账成功";
}
?>
这种情况貌似是正确的,但是现在假设一种情况,假设我们执行了第一个query以后,第二个query没有执行,这时我们需要有一种方法来控制两个query必须同时成功执行或者同时失败,
事务:用于保证数据的一致性,它由一组相关的dml语句组合成,该组的dml语句要么全部成功,要么全部失败。
1、将提交设为false
2、其中一句失败,执行回滚。两句都没有错误,实现提交
实现代码
<?php
include ‘includes/header.html‘;
$mysqli=new MySQLi("localhost","root","","senjintang");
if($mysqli->connect_error){
die("连接错误".$mysqli->connect_error);
}
$mysqli->autocommit(false);
$sql1="update account set balance=balance-2 where id=1";
$sql2="update account set balance=balance+2 where id=2";
$b1=$mysqli->query($sql1);
$b2=$mysqli->query($sql2);
if(!$b1||!$b2){
echo "转账失败".$mysqli->error;
//其中有一个语句没有执行成功,执行回滚操作
$mysqli->rollback();
}else{
echo "转账成功";
//两句都成功执行实现提交操作
$mysqli->commit(); //一旦提交就没有机会再回滚
}
?>
在mysql的控制台中,也可以使用事务:
1、开启一个事务 : start transaction
2、做保存点 : savepoint
3、操作 : delete insert update
4.1没有问题做提交操作 commit
4.2有问题做回滚操作 rollback to savepoint
事务的特点:
1、原子性 一个事务不可以分割
2、一致性
3、隔离性
4、持久性 一旦提交,变化永久存在于数据库中
预处理:代表的是一种处理数据的技术 mysqli_stmt
需要向mysql数据库添加100个用户
1、使用for循环,循环100次,向数据库中添加100个用户
2、使用批量插入,用.连接100条sql语句,但是只执行一次sql,使用
3、使用预编译技术,该方案还可以防止sql注入攻击
补充一个关于sql语句原理的知识点:
减少连接的次数可以提高效率、减少编译的时间来提高效率,提出预编译的思想。把sql语句预先编译好,后面只需程序发送数据即可。、
步骤:
1、创建mysqli对象
2、创建预编译对象
实现代码:
<?php
//1、创建连接
$mysqli=new MySQLi("localhost","root","","senjintang");
//创建预编译对象
$sql="insert into user (name,password,emial,age) values (?,?,?,?)";
$mysqli_stmt=$mysqli->prepare($sql) or die($mysqli->error);
//设置参数
$name="小倩";
$password="xiaoqian";
$emial="1051743154@qq.com";
$age=20;
//参数绑定 给?赋值 这里类型和顺序都要对应
//sssi表示字符串、字符串、字符串、整形类型
$mysqli_stmt->bind_param("sssi",$name,$password,$emial,$age);
//执行
$b=$mysqli_stmt->execute();
//其中一个不成功,会直接执行下一个
if(!$b){
die("操作失败21".$mysqli->error);
}
else{
echo "操作成功12";
}
//释放资源 因为这里只是dml所以只需关闭
$mysqli->close();
?>
代码实现
<?php
//1、创建连接
$mysqli=new MySQLi("localhost","root","","senjintang");
if($mysqli->connect_error){
die($mysqli->connect_error);
}
//2、创建预编译对象
$sql="select id,name,emial from user where id>?";
$mysqli_stmt=$mysqli->prepare($sql) or die($mysqli->error);
//设置参数
$id=5;
//参数绑定 给?赋值 这里类型和顺序都要对应
//sssi表示字符串、字符串、字符串、整形类型
$mysqli_stmt->bind_param("i",$id);
//绑定结果集
$mysqli_stmt->bind_result($id,$name,$emial);
//取出绑定的结果集
$mysqli_stmt->execute();
while($mysqli_stmt->fetch()){
echo "<br/>--$id--$name--$emial";
}
//释放资源 1、释放资源 2、关闭预编译语句 3、关闭连接
$mysqli_stmt->free_result();
$mysqli_stmt->close();
$mysqli->close();
?>
标签:
原文地址:http://blog.csdn.net/qq_26746521/article/details/51864127