php和数据库的接口,php数据库接口

三套方案 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、获取连接

connection=mysqlconnect(“127.0.0.1”,”root”,”“);if(!connection){

die(“连接失败”.mysql_error);

}

2、选择数据库

mysql_select_db(“senjintang”);

3、设置操作编码

mysql_query(“set names utf8”); 出现中文乱码的时候可以尝试使用

4、向数据库发送指令sql(ddl数据定义语言 创建表 dml数据操作语言 dql数据查询语句select dtl数据事物语句 rollback commit)

res=mysqlquery(sql,connection);5、接受返回的结果并处理while(row=mysql_fetch_row(res))echo“$row[0]??$row[1]–$row[2]??$row[3]–$row[4]”;mysqlfetchrow(res) 返回一个索引数组

mysql_fetch_assoc(res)返回一个关联数组mysqlfetcharray(res) 返回索引数组和关联数组两套

mysql_fetch_object(res)把一行数据当作一个对象mysqlfetchrow(res)返回的是结果集的下一行,会一次取出结果集中的下一行

但是这资格函数使用完以后,都必须释放资源

6、释放资源,关闭连接

mysql_free_result($res); //释放结果集

mysql_close(); //关闭连接 不是必须的,会在脚本执行完以后自动关闭

mysqli_error() 可以打印连接的错误

注意:在对数据库执行dml(非select的数据库查询以后),一定不要再进行释放资源,也就是 mysql_free_result(res);因为当前的res是一个布尔值。所以:对数据的操作严格的区分有无结果集的的返回。

对mysql数据库进行crud操作 使用的是mysql_

实现对数据库的插入操作

//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

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; //表示没有对数据库影响

}

}

}

}

?>

使用mysqli(improvement)来操作数据库

相当于上面的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 "

";

}

4、关闭资源

//关闭资源 这一个步骤是必须的

$res->free();

//断开连接

$mysqli->close();

使用面向对象的方式,实现利用扩展库对数据库的操作

connect_error){

die("连接失败".$mysqli->connect_error);

}

else{

echo "连接成功";

}

$mysqli->query("set names utf8");

$sql="select * from user";

$res=$mysqli->query($sql);

//返回的是一个对象 mysqliResult

echo "

";

var_dump($res);

echo "

";

//fetch_row这是mysqliResult的一个方法

while($row=$res->fetch_row()){

foreach($row as $key=>$val){

echo $val;

}

echo "

";

}

//关闭资源 这一个步骤是必须的

$res->free();

//断开连接

$mysqli->close();

//对于这种面向对象的方式,

?>

注意:防乱码

//防止乱码

header(“Content-type:text-html;charset=utf-8”);

可以保证往数据库里边插入正确的汉字

$mysqli->query(“set names utf8”);

mysql中sql语句的特别说明:

如果操作的字段类型是字符串类型的则要求我们要使用”包括,

如果操作的字段是数值型的,则可以用”包括,也可以不使用

分装mysqli的操作,实现对数据库的crud

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; //表示没有收影响的行数

}

}

}

?>

mysqli的增强

mysql可以批量执行sql语句

1、批量执行dml语句

基本语法:

sqls="sql1;sql2…..”;mysqli::multiquery(sqls);

批量添加、更新、删除

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语句、可以一次性的返回多个结果集

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

";

}

echo "

";

}

$result->free();

if(!$mysqli->more_results()){

break;

}

echo "新的结果集

";

}while($mysqli->next_result());

$mysqli->close();

};

?>

mysql的事务处理

应用场景:有一张银行账号表,id balance一段php程序来实现转账

1号账户10 元转到2号账户

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、其中一句失败,执行回滚。两句都没有错误,实现提交

实现代码

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的扩展库增强之处 预处理技术

预处理:代表的是一种处理数据的技术 mysqli_stmt

需要向mysql数据库添加100个用户

1、使用for循环,循环100次,向数据库中添加100个用户

2、使用批量插入,用.连接100条sql语句,但是只执行一次sql,使用mysqli?>mutilquery(sql1);

3、使用预编译技术,该方案还可以防止sql注入攻击

补充一个关于sql语句原理的知识点:

减少连接的次数可以提高效率、减少编译的时间来提高效率,提出预编译的思想。把sql语句预先编译好,后面只需程序发送数据即可。、

步骤:

1、创建mysqli对象

2、创建预编译对象

实现代码:

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();

?>

从数据库查询所有id>5的用户,同时id可能会发生变化

代码实现

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 "

--$id--$name--$emial";

}

//释放资源 1、释放资源 2、关闭预编译语句 3、关闭连接

$mysqli_stmt->free_result();

$mysqli_stmt->close();

$mysqli->close();

?>

注入攻击

预编译可以自行放置注入攻击,

万能密码:

select * from user where name=”12” and password=’aa’ or 1=’1’;

输入的密码为aa’ or 1=’1这样就会把所有的用户都查询到

mysqli扩展库的其他函数:

编写一函数,接受一个表名,然后把表头和数据显示在页面

代码实现

connect_error);

}

$sql="select * from $table_name";

$res=$mysqli->query($sql);

echo "共有".$res->num_rows."行212";

echo "共有".$res->field_count."列213";

//关闭资源

$res->free();

$mysqli->close();

}

showTable("user");

?>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572764.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

saltstack之混合匹配

需要-C参数: salt -C ## 使用grains属性来匹配 [roothadoop0 pillar]# salt -C Gos:Ubuntu test.ping uadoop1:True ## 使用Minion ID的正则表达式来匹配 [roothadoop0 pillar]# salt -C Euadoop\d test.ping uadoop2:True uadoop3:True uadoop1:True ## 使用gr…

java自定义 filter,HBase自定义Filter

必需要提前说明下:不建议使用自定义的Filter。所有的Filter都是在服务端生效:就是说需要将自定义的Filter封装为jar,上传到HBase的类路径下,并重启HBase使之生效。对于生产环境的HBase来说,重启通常是不能接受的。Filt…

Mybatis学习总结(二)——Mapper代理开发

一、概要 1、原始DAO开发中存在的问题:(1)DAO实现方法体中存在很多过程性代码。(2)调用SqlSession的方法(select/insert/update)需要指定Statement的id,存在硬编码,不利于代码维护。 2、Mapper动态代理方法…

mac wordpress php7,Mac 下基于 wordpress 搭建个人博客系统

一、前言这里说的是自己从 wordpress 源码开始搭建一个个人博客系统。当然,很多云端已经直接提供了在线安装的方式,这个就不在本文的讨论范围之内了。二、关于 wordpresswordpress是一款个人博客系统,并逐步演化成一款内容管理系统软件&#…

TypeError: db.addUser is not a function : @(shell):1:1 ——mongoDB创建新用户名密码的方法...

不多说,旧版本使用 db.addUser("root","root") 新版本使用这句会出现这个错误提示 TypeError: db.addUser is not a function : (shell):1:1 新版本用的是 db.createUser({user: "test",pwd: "test",roles: [ { role: &quo…

php多人访问抽奖倒计时一致,Javascript和PHP倒计时器为每个人显示相同的计时器...

我有生成倒计时器所需的脚本,该计时器有一个启动和恢复按钮.我试图做的是在一个控制另一页上的计时器的页面上有启动,停止和重置按钮.因此,如果用户X访问page.html,他们将看到一个0的计时器.Admin X访问admin.html,他们看到计时器为0,但他们也有一个启动,停止和重置按钮.当管理…

将list中的元素按照属性分类成树状的map

技术交流群&#xff1a; 233513714public LinkedHashMap<String, List<TPhoneModel>> queryPhoneList(List<TPhoneModel> list) {LinkedHashMap<String, List<TPhoneModel>> map new LinkedHashMap<>();for (TPhoneModel li : list) {  …

java能传地址吗,详解java的值传递、地址传递、引用传递

一直来觉得对值传递和地址传递了解的很清楚&#xff0c;刚才在开源中国上看到一篇帖子介绍了java中的值传递和地址传递&#xff0c;看完后感受颇深。下边总结下以便更容易理解。按照以前的理解&#xff0c;java中基本数据类型是值传递&#xff0c;对象是地址(引用)传递。给大家…

SpringMVC实现PUT请求上传文件

在JQuery中&#xff0c;我们可以进行REST ful中delete和put的请求&#xff0c;但是在java EE标准中&#xff0c;默认只有在POST请求的时候&#xff0c;servlet 才会通过getparameter()方法取得请求体中的相应的请求参数的数据。而PUT&#xff0c;delete请求的请求体中数据则默认…

jQuery多库共存问题解决方法

一、问题概述: 1、随着jQuery的流行,采用jQuery和$符为命名空间的js库越来越多,当然jQuery的$符也是参照的Prototype库的,所以当多个库同时以$符或者jQuery为命名空间时,那么此时,就会产生冲突。 2、由于jQuery的更新速度过快,所以插件更不上,导致不同版本的jQuery对插件支持的…

java开发技术有什么意义,零基础学Java开发技术有哪些优势和好处?

零基础学Java开发技术有哪些优势和好处&#xff1f;Java开发技术有下列优势&#xff1a;Java编程语言简单、面向对象集中于对象及其接口、分布式处理TCP/IP协议、鲁棒性、安全性、体系结构中立性、可移植性、解释执行、高性能、多线程以及动态性等。零基础学Java开发技术的优势…

[TC SRM 685 div1 lev1] MultiplicationTable2

转载&#xff1a; https://www.linkedin.com/pulse/topcoder-685-multiplicationtable2-yingwu-zhu Note: 生成封闭集合方式。 ProblemFox Ciel is creating a new binary operation.The operation will be denoted $ and it will be defined on the finite set S {0, 1, 2, .…

php树菜单转化为一维菜单,php树型菜单 - iturtle的个人空间 - OSCHINA - 中文开源技术交流社区...

通过处理array,添加level,is_leaf属性实现 树型菜单公共类通过处理array,添加level,is_leaf属性实现 树型菜单/*树形分类添加节点属性*$data, 要处理的节点数组*$pid,父类ID*$prefix, 字段前缀 如chh_pid*$tree array()**/function getTree($data, $pid,$prefix,$tree) {for…

C#-WebForm-★★★JQuery知识——基础知识、选择器、事件★★★

JQuery 与 JS 之间的转换 将JQuery转换为JS —— get(0)  例如&#xff1a;alert( $("#d1").get(0).offsetwidth ); 将JS 转换为JQuery —— $(" ")  例如&#xff1a;$("#d1").click(function(){}); 1、什么是JQuery&#xff1f;   它就是…

Java编号姓名元宝数密码,通过my Eclipse控制台向数据库(SQL2008)中查找、删除、插入信息...

通过my Eclipse控制台向数据库(SQL2008)中查找、删除、插入信息如果编译程序有什么错误还望大家多多指正代码执行所需数据库、架包及java源文件已上传至文件 文件名 SQl_JDBC.zip用my Eclipse控制台操作数据库之前(SQL 2008)之前 应先引入一个架包(sqljdbc4.jar) 在架包导入之后…

matlab 空矩阵耗时,性能 – 更快的方式通过空矩阵乘法初始化数组? (Matlab)

这很奇怪&#xff0c;我看到f更快&#xff0c;而g比你看到的慢。但是他们对我来说都是一样的。也许不同版本的MATLAB&#xff1f;>> g () zeros(1000, 0) * zeros(0, 1000);>> f () zeros(1000)f ()zeros(1000)>> timeit(f)ans 8.5019e-04>> timeit(…

事件对象及其属性

$(function(){$(input).bind(click,function(e){alert(e); //获取对象//event对象的属性alert(e.type);alert(e.target);alert(e.currentTarget);//得到监听元素的DOM&#xff0c;target是点的那个的DOM});$(input).bind(mouseover,function(e){alert(e.relatedTarget);});$(in…

百度网盘php文件怎么打开,如何通过网页版百度网盘下载大文件

最近老张需要在百度网盘下载一个较大的文件&#xff0c;结果他要我必须下载客户端才行&#xff0c;此背景下&#xff0c;在网站找了各种办法&#xff0c;什么模拟手机&#xff0c;F12查看下载链接都不行&#xff0c;最后找到了可行的办法。步骤如下&#xff1a;一&#xff1a;如…

matlab对信号加噪代码,Matlab给信号加噪声

在信号处理中经常需要把噪声叠加到信号上去&#xff0c;在叠加噪声时往往需要满足一定的信噪比&#xff0c;这样产生二个问题&#xff0c;其一噪声是否按指定的信噪比叠加&#xff0c;其二怎么样检验带噪信号中信噪比满足指定的信噪比。在MATLAB中可以用randn产生均值为0方差为…

洛谷 1057——台阶问题(递推与递归二分)

题目描述 有N级的台阶&#xff0c;你一开始在底部&#xff0c;每次可以向上迈最多K级台阶&#xff08;最少1级&#xff09;&#xff0c;问到达第N级台阶有多少种不同方式。 输入输出格式 输入格式&#xff1a; 输入文件的仅包含两个正整数N&#xff0c;K。 输出格式&#xff1…