PHP基础之与MySQL那些事
前言
这篇文章会对PHP的MySQL扩展库,MySQLI的扩展库,SQL批量执行,事务控制等等进行一些简单的讲解。
MySQL扩展
PHP中MySQL扩展,虽然因为安全的原因,在PHP5.6及往上不在支持MySQL扩展库,但是还是要学习的,通过编写案例的方式来讲解。
案例
先说下操作数据库的大体思路吧,就是先获取连接-》选择数据库-》设置操作编码-》发送sql指令-》对返回的结果进行处理-》释放资源,断开连接。案例是一个在线词典查询。下面是创建表的sql语句:
create database worddb
create table words(
id int primary key auto_increment,
enword varchar(32) not null,
chword varchar(256) not null
);
insert into words(enword,chword) values ('boy','男孩')
insert into words(enword,chword) values ('school','学校')
因为是练习,所以就插入了两条数据。接下来就是编写SQL工具类,代码如下:
<?php
class SqlTool{
private $conn;
private $host="localhost";
private $user="root";
private $password="XFAICL1314";
private $db="worddb";
//初始化
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");
}
//完成select
function execute_dql($sql){
$res=mysql_query($sql) or die(mysql_error());
return $res;
}
//完成insert,update,delete
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;
}
}
}
}
?>
之后就是前端页面的编写了,代码如下,有点丑:
<html>
<head>
<title>在线词典</title>
<meta http-equiv="content-type" charset="UTF-8">
</head>
<body>
<center><h1>字典</h1></center>
<h2>查询英文</h2>
<form action="wordprocess.php" method="post">
请输入英文:<input type="text" name="yingyu">
<!--为了区分两个表单,这里选择用隐藏域的方式-->
<input type="hidden" value="search1" name="type">
<input type="submit" value="提交">
</form>
<h2>查询中文</h2>
<form action="wordprocess.php" method="post">
请输入中文:<input type="text" name="hanyu">
<!--为了区分两个表单,这里选择用隐藏域的方式-->
<input type="hidden" value="search2" name="type">
<input type="submit" value="提交">
</form>
</body>
</html>
接下来就是后端逻辑代码了,如下:
<?php
//引入工具类
require_once 'SqlTool.class.php';
header("Content-type:text/html;charset=utf-8");
if (isset($_POST['type'])){
$type=$_POST['type'];
}else{
echo "查询失败<br>";
echo "<a href='wordVeiw.php'>回到主页面</a>";
}
if ($type=="search1") {
if (isset($_POST[yingyu])) {
$en_word = $_POST[yingyu];
} else {
echo "请输入";
echo "<a href='wordVeiw.php'>回到主页面</a>";
}
$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 "查询没有这个词条.<br>";
echo "<a href='wordVeiw.php'>回到主页面</a>";
}
//释放资源
mysql_free_result($res);
}else if($type == "search2") {
if (isset($_POST[hanyu])) {
$ch_word = $_POST[hanyu];
} else {
echo "请输入";
echo "<a href='wordVeiw.php'>回到主页面</a>";
}
$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 "<br>".$ch_word . "对应的英文为" . $row['enword'];
}
} else {
echo "查询没有这个词条.<br>";
echo "<a href='wordVeiw.php'>回到主页面</a>";
}
//释放资源
mysql_free_result($res);
}
?>
现在来测试一下吧,首先打开前端页面,如下图:
接下来输入boy进行查询,结果如下,查询成功:
因为是案例,所以直接将前端传过来的参数没有做任何处理直接拼接到SQL语句中,这样是非常危险的!!,存在SQL注入攻击,现在我来演示一下,在输入框中输入:
boy' and updatexml(1,concat(0x7e,(select user()),0x7e),1)#
结果如下图直接报出使用者!!
所以在开发功能时,要秉持“外部参数皆不可信原则”进行开发。
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);
因为一会儿要插入数据,所以先插入一条,构造好后,打开数据库,查询,发现没有问题
接下来构造mysqli工具类代码如下:
<?php
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;//没有行数收影响
}
}
}
}
?>
下面就是前端页面了,这里我用表单向后端提交数据,代码如下:
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8"/>
<center><title>添加联系人</title></center>
<style type="text/css">
div{
background-color: aqua;
width: 1250px;
height: 500px;
}
div{
text-align: center;
}
</style>
</head>
<body>
<div>
<div>
<form action="addprocess.php" method="post">
<br><br><br><br><br>
姓名:<input type="text" name="user"><br><br>
密码:<input type="password" name="password"><br><br>
email:<input type="text" name="email"><br><br>
年龄:<input type="text" name="age"><br><br>
<input type="submit" value="提交" style="height: 36px;width: 60px;background-color: blue;color: azure;border: 0px">
<input type="reset" value="重置" style="height: 36px;width: 60px;background-color: blue;color: azure;border: 0px">
</form>
</div>
</div>
</body>
</html>
效果如下图:
然后就是后端的逻辑设计了,代码如下:
<?php
//引入工具类
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 数据,如下图:
然后提交表单,看看有没有插入到数据库中。
我们发现成功插入到数据库中如下:
关于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操作的代码:
<?php
$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,说明插入到数据库了,现在打开数据库查看,果然插入进去了,如下图:
批量执行dql操作
批量执行dql操作的作用是一次性取回多个结果集,下面看案例代码:
<?php
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 "<br>";
}
$result->free();
//判断有没有下一个结果集,如果没有退出循环
if (!$mysqli->more_results()){
break;
}
echo "<br>*************新得结果集<br/>";
} while ($mysqli->next_result());
}
?>
结果如下图:
关于MySQL的批量执行sql语句就说到这里。
MySQL事务控制
上面简单介绍了MySQL扩展库,MySQLI扩展库,批量执行SQL语句,接下来说一说MySQL事务控制。
数据库配置
说MySQL事务控制之前,先查看并修改数据库引擎,查看引擎的命令如下:
show engines
我们发现,只有InnoDB是支持事务的,所以先查看一下现在得数据库引擎:
发现是MyISAM,我们将它修改为InnoDB,打开配置文件my.ini,将“default-storage-engine=MYISAM”改为你想设定的,然后重启即可。修改成功后,然后下一步就是代码实现。
案例
我们为什么需要事务控制呢?想一想,如果这是一个转账得场景,是不是需要同时控制住,必须我减金额得同时你加金额,任何一个出错都得转账失败。也就是说要保持一致。这也是要进行事务控制得必要性。下面看案例代码:
<?php
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();
?>
当我们提交页面后,查询数据库,发现数据没有变化,说明回滚有效果,事务控制起了效果,事务控制就说到这里。以上就是本篇文章的全部内容啦,如有错误,请斧正。
PHP基础之与MySQL那些事的更多相关文章
- MySQL基础配置之mysql的默认字符编码的设置(my.ini设置字符编码) - 转载
MySQL基础配置之mysql的默认字符编码的设置(my.ini设置字符编码) MySQL的默认编码是Latin1,不支持中文,那么如何修改MySQL的默认编码呢,下面以设置UTF-8为例来说明. 需 ...
- MySQL基础配置之mysql的默认字符编码的设置(my.ini设置字符编码)
MySQL基础配置之mysql的默认字符编码的设置(my.ini设置字符编码) MySQL的默认编码是Latin1,不支持中文,那么如何修改MySQL的默认编码呢,下面以设置UTF-8为例来说明. 需 ...
- mysql那些事之索引篇
mysql那些事之索引篇 上一篇博客已经简单从广的方面介绍了一下mysql整体架构以及物理结构的内容. 本篇博客的内容是mysql的索引,索引无论是在面试还是我们日常工作中都是非常的重要一环. 索引是 ...
- ava基础MySQL存储过程 Java基础 JDBC连接MySQL数据库
1.MySQL存储过程 1.1.什么是存储过程 带有逻辑的sql语句:带有流程控制语句(if while)等等 的sql语句 1.2.存储过程的特点 1)执行效率非常快,存储过程是数据库的服 ...
- 零基础如何自学MySQL数据库?
作者:姜健链接:https://www.zhihu.com/question/34840297/answer/67536521来源:知乎著作权归作者所有,转载请联系作者获得授权. 本人是个活生生的例子 ...
- Asp.Net Core 项目搭建 基础配置 和MySql 的使用
一.开发环境准备 1.安装Visual Studio 2015,我这里安装的是专业版. 2.安装.NET Core SDK相关 需要安装 Visual Studio 2015 update3和NET ...
- 数据库基础理解学习-Mysql
1. 简介 数据库,现代化的数据存储存储手段,是一种特殊的文件,其中存储着需要的数据. 特点: 持久化存储 读写速度极高 保证数据的有效性 对程序支持性非常好,容易扩展 2. Mysql (1)具有数 ...
- MySQL基础普及《MySQL管理之道:性能调优、高可用与监控》
最近工作的内容涉及MySQL运维内容,陆陆续续读了几本相关的书,其中一本是<MySQL管理之道:性能调优.高可用与监控>. 内容涵盖性能调优(包括sql优化等).备份.高可用,以及读写分离 ...
- Mysql基础(三):MySQL基础数据类型、完整性约束、sql_mode模式
目录 2.MySQL基础数据类型.完整性约束.sql_mode模式 1. MySQL常用数据类型 2. 完整性约束 3. MySQL的sql_mode模式说明以及设置 2.MySQL基础数据类型.完整 ...
随机推荐
- 第2章 HTML中的JavaScript
目录 1. script标签 1.1 标签位置 1.2 defer推迟执行脚本 1.3 async异步执行脚本 1.4 动态加载脚本 2. noscript标签 1. script标签 <scr ...
- Go语言从入门到放弃(设置 go get 为国内源)
前言 Go语言学到 Gin 框架了, 其实每天学习是比较辛苦的事情, 坚持下去! 在使用 Go 过程中发现, 最无奈的是Go的一些模块下不下来, 即便挂了V, 油管2k不卡的那种, 依旧是 time ...
- Goland 设置代码格式化
前言 之前一直喜欢 VsCode 的代码自动格式化和其他的一些功能 今天了解到原来 Goland 也有这些功能, 想想也对, 毕竟这么大 正文 Goland设置代码格式化 进入设置,按需选择要使用的, ...
- 2021升级版微服务教程6—Ribbon使用+原理+整合Nacos权重+实战优化 一篇搞定
2021升级版SpringCloud教程从入门到实战精通「H版&alibaba&链路追踪&日志&事务&锁」 教程全目录「含视频」:https://gitee.c ...
- 剑指offer 面试题10.2:青蛙变态跳台阶
题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级--它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 编程思想 因为n级台阶,第一步有n种跳法:跳1级.跳2级.到跳n级跳1级,剩下 ...
- Python运维自动化psutil 模块详解(超级详细)
psutil 模块 参考官方文档:https://pypi.org/project/psutil/ 一.psutil简介 psutil是一个开源且跨平台(http://code.google.com/ ...
- Kubernetes K8S之kube-prometheus概述与部署
Kubernetes K8S之kube-prometheus概述与部署 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master CentOS7. ...
- 【ASM】查看ASM磁盘组剩余容量和总容量
col total_size for a10; col free_size for a20; select name,total_mb/1024 || 'G' as total_size , free ...
- [工作札记]03: 微软Winform窗体中ListView、DataGridView等控件的Bug,会导致程序编译失败,影响范围:到最新的.net4.7.2都有
工作中,我们发现了微软.net WinForm的一个Bug,会导致窗体设计器自动生成的代码失效,这个Bug从.net4.5到最新的.net4.7.2都存在,一直没有解决.最初是我在教学工作中发现的,后 ...
- SAPCAR使用说明
1.首先看一下SAPCAR的功能usage:create a new archive:SAPCAR -c[vir][f archive] [-P] [-C directory] [-A filen ...