php5.6 mysql_affected_rows():_雪痕*:PHP基础之与MySQL那些事

//引入工具类

require_once 'SqlTool.class.php';

header("Content-type:text/html;charset=utf-8");

if (isset($_POST['type'])){

$type=$_POST['type'];

}else{

echo "查询失败
";

echo "回到主页面";

}

if ($type=="search1") {

if (isset($_POST[yingyu])) {

$en_word = $_POST[yingyu];

} else {

echo "请输入";

echo "回到主页面";

}

$sql = "select chword from words where enword='" . $en_word . "' limit 0,1";

//查询,调用sql工具类

$SqlTool = new SqlTool();

$res = $SqlTool->execute_dql($sql);

if ($row = mysql_fetch_assoc($res)) {

echo $en_word . "对应的中文为" . $row['chword'];

} else {

echo "查询没有这个词条.
";

echo "回到主页面";

}

//释放资源

mysql_free_result($res);

}else if($type == "search2") {

if (isset($_POST[hanyu])) {

$ch_word = $_POST[hanyu];

} else {

echo "请输入";

echo "回到主页面";

}

$sql = "select enword from words where chword like '%" . $ch_word . "%'";

//查询,调用sql工具类

$SqlTool = new SqlTool();

$res = $SqlTool->execute_dql($sql);

if (mysql_num_rows($res) != 0) {

while ($row = mysql_fetch_assoc($res)) {

echo "
".$ch_word . "对应的英文为" . $row['enword'];

}

} else {

echo "查询没有这个词条.
";

echo "回到主页面";

}

//释放资源

mysql_free_result($res);

}

?>

现在来测试一下吧,首先打开前端页面,如下图:

ee210beeee88c37a297a8669c5f3402e.png

接下来输入boy进行查询,结果如下,查询成功:

c6cbcfc934ba9b1c4b0f998e58ae4bd4.png

因为是案例,所以直接将前端传过来的参数没有做任何处理直接拼接到SQL语句中,这样是非常危险的!!,存在SQL注入攻击,现在我来演示一下,在输入框中输入:

boy' and updatexml(1,concat(0x7e,(select user()),0x7e),1)#

结果如下图直接报出使用者!!

791f10999c15bcff1a569884819b603a.png

所以在开发功能时,要秉持“外部参数皆不可信原则”进行开发。

MYSQLI扩展

其实mysqli扩展是mysql扩展的加强版,因为历史原因,有一些老程序员擅长面向过程写法,所以PHP设计者为mysqli设计了两套方案,一套面向对象,一套面向过程,甚至一个聊本里可以混着用,不过那样很怪,下面的案例都是采用面向对象的那套方案。

案例

做一个小功能吧,向数据库中插入数据。先设计一下SQL表,语句如下:

create database day1;

use day1;

create table user1 (

id int(6) unsigned auto_increment primary key,

name varchar(20) not null,

password varchar(256) not null,

email varchar(80) not null,

age int(128) not null

);

?

INSERT INTO user1(name,password,email,age) VALUES('Lucia','13568','12345@.com',30);

因为一会儿要插入数据,所以先插入一条,构造好后,打开数据库,查询,发现没有问题

db7099b3780de4fa6313dbe473e0dfb6.png

接下来构造mysqli工具类代码如下:

class SqlTest{

private $mysqli;

private $host="localhost";

private $user="root";

private $pass="XFAICL1314";

private $db="day1";

//初始话

public function __construct(){

$this->mysqli=new mysqli($this->host,$this->user,$this->pass,$this->db);

if ($this->mysqli->connect_error){

echo "连接失败";

}

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

}

//进行select

public function execute_dql($sql){

$res=$this->mysqli->query($sql) or die($this->mysqli->error);

return $res;

}

//进行update,insert,delete

public function execute_dml($sql){

$res=$this->mysqli->query($sql) or die($this->mysqli->error);

if (!$res){

return 0;

}else{

if ($this->mysqli->affected_rows>0){

return 1;//成功

}else{

return 2;//没有行数收影响

}

}

}

}

?>

下面就是前端页面了,这里我用表单向后端提交数据,代码如下:

添加联系人

div{

background-color: aqua;

width: 1250px;

height: 500px;

}

div{

text-align: center;

}

姓名:

密码:

email:

年龄:

效果如下图:

2fa250627f9882e3bfed068555ba9441.png

然后就是后端的逻辑设计了,代码如下:

//引入工具类

require_once 'SqlTest.class.php';

//创建实例

$SqlTest=new SqlTest();

$sql="insert into user1 (name,password,email,age) values ('$_POST[user]',md5('$_POST[password]'),'$_POST[email]','$_POST[age]')";

$res=$SqlTest->execute_dml($sql);

if ($res==1){

echo "添加成功";

}else{

if ($res==0){

echo '添加失败';

}else{

echo "行数没有变化";

}

}

?>

现在测试一下,我们在表单页面输入 小明,12345678,123@qq.com,25 数据,如下图:

50d99cbf3a2d132070f890d3e8df4d7e.png

然后提交表单,看看有没有插入到数据库中。

我们发现成功插入到数据库中如下:

1d3f2cb9eb30e110685848f8a9988860.png

关于mysqli扩展就说到这里。

MySQL批量执行SQL语句

上面简单介绍了MySQL扩展和MySQLI扩展,接下来说一说批量执行sql语句。

先提一个需求,如果我们像数据库批量添加用户,如果按照之前的办法一条一条的发送sql语句来处理,这样很占用资源,并且效率低。所以采用批量执行sql语句的方式。接下来用两个案例来讲解,因为增加,修改,删除操作返回的是布尔值,而查询操作返回的是结果集,所以分来来处理比较好。

批量执行dml语句

因为dml返回的是布尔值,所以处理起来也比较好处理。先创建表,顺便插入一条数据如下:

create database test;

use test;

create table users(

id int(8) unsigned auto_increment primary key,

name varchar(128) not null,

password varchar(256) not null);

insert into users(name,password) values('test','13579');

下面就是批量执行dml操作的代码:

$mysqli=new mysqli("localhost","root","XFAICL1314","test");

if ($mysqli->connect_error){

echo "连接失败";

}

$sqli="insert into users(name,password) values ('小利',md5('13568'));";

//批量执行dml操作时,注意上一级句的;和下一句的.两个符号

$sqli.="insert into users(name,password) values ('小利',md5('13568'));";

$sqli.="insert into users(name,password) values ('小利和小峰',md5('13568'))";

$b=$mysqli->multi_query($sqli);

if (!$b){

echo "插入失败";

}else{

echo "ok!";

}

$mysqli->close();

?>

然后访问页面,返回ok,说明插入到数据库了,现在打开数据库查看,果然插入进去了,如下图:

58ba59617a851e7df24f23c0889693a7.png

批量执行dql操作

批量执行dql操作的作用是一次性取回多个结果集,下面看案例代码:

header("Content-type:text/html;charset=utf-8");

$mysqli=new mysqli("localhost","root","XFAICL1314","test");

if ($mysqli->connect_error){

echo "连接失败";

}

$sqli="select * from users;";

$sqli.="select * from lsp";

//因为multi_query这个函数比较傻,不会去判断有没有下一个结果集,所以最后再用more_results函数检查一下。

if ($mysqli->multi_query($sqli)){

do{ //从mysqli中取出第一个结果集

$result=$mysqli->store_result();

//显示mysqli $res对象

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

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

echo "--$val";

}

echo "
";

}

$result->free();

//判断有没有下一个结果集,如果没有退出循环

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

break;

}

echo "
*************新得结果集
";

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

}

?>

结果如下图:

52de0e14f8330dbcf1aa8aa39bc4fc6e.png

关于MySQL的批量执行sql语句就说到这里。

MySQL事务控制

上面简单介绍了MySQL扩展库,MySQLI扩展库,批量执行SQL语句,接下来说一说MySQL事务控制。

数据库配置

说MySQL事务控制之前,先查看并修改数据库引擎,查看引擎的命令如下:

show engines

494673c51c225e925f5240808e01d2d8.png

我们发现,只有InnoDB是支持事务的,所以先查看一下现在得数据库引擎:

c4218b91ee930d1a0621cc40548b9ea1.png

发现是MyISAM,我们将它修改为InnoDB,打开配置文件my.ini,将“default-storage-engine=MYISAM”改为你想设定的,然后重启即可。修改成功后,然后下一步就是代码实现。

案例

我们为什么需要事务控制呢?想一想,如果这是一个转账得场景,是不是需要同时控制住,必须我减金额得同时你加金额,任何一个出错都得转账失败。也就是说要保持一致。这也是要进行事务控制得必要性。下面看案例代码:

header("Content-type:text/html;charset=utf-8");

$mysqli=new mysqli("localhost","root","XFAICL1314","test");

if ($mysqli->connect_error){

echo "连接失败";

}

//将提交设置为假,因为事物一旦提交就没有机会回滚

$mysqli->autocommit(false);

$sql1="update person set money=money-3 where id=1";

//这里第二条语句我故意写错表名

$sql2="update persons set money=money+3 where id=2";

$b1=$mysqli->query($sql1);

$b2=$mysqli->query($sql2);

if (!$b1 || !$b2){

echo "修改失败,回滚".$mysqli->error;

$mysqli->rollback();

}else{

echo "修改成功!";

$mysqli->commit();

}

$mysqli->close();

?>

当我们提交页面后,查询数据库,发现数据没有变化,说明回滚有效果,事务控制起了效果,事务控制就说到这里。以上就是本篇文章的全部内容啦,如有错误,请斧正。bk

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值