链接Mysql的api mysqli和pdo

HP 5 及以上版本建议使用以下方式连接 MySQL :

  • MySQLi extension ("i" 意为 improved)
  • PDO (PHP Data Objects)

PDO 应用在 12 种不同数据库中, MySQLi 只针对 MySQL 数据库。

如果你的项目需要在多种数据库中切换,建议使用 PDO 

两者都是面向对象, 但 MySQLi 还提供了 API 接口

两者都支持预处理语句。 预处理语句可以防止 SQL 注入,对于 web 项目的安全性是非常重要的 

连接mysql实例

,我们会使用以下三种方式来演示 PHP 操作 MySQL:

  • MySQLi (面向对象)
  • MySQLi (面向过程)
  • PDO

mysqi的面向过程

如下包含连接数据库、创建数据库、创建表、插入一条数据、插入多条数据

<?php
//面向过程连接数据库
$conn = mysqli_connect('localhost','root','root');
//判断是否连接成功
if(!$conn){die('连接数据库失败'.mysqli_connect_error());
}else{echo '连接成功';//创建数据库mytest$sql = 'create database mytest';if(mysqli_query($conn,$sql)){echo '执行成功'.$sql;}else{echo '执行失败'.mysqli_error($conn);}//选择数据库并且创建表执行插入语句if(mysqli_query($conn,'use mytest')){echo '切换数据库成功';$sql = "create table mytest(id int auto_increment primary  key,name varchar(14) not null) ";//如创建表成功if(mysqli_query($conn,$sql)){echo '创建成功'.$sql;}else{echo '创建失败'.mysqli_error($conn);}//插入多条数据   插入一条数据时候后面不需要分号$sql="insert into mytest (name) values ('webcyh');";$sql.="insert into mytest (name) values ('hony');";//如果只是插入一条数据这里可以改为普通查询函数mysqli_query()if(mysqli_multi_query($conn,$sql)){echo '插入成功'.$sql;}else{echo '插入失败'.mysqli_error($conn);}}//关闭数据库连接mysqli_close($conn);
}

语句预处理

预处理语句对于防止 MySQL 注入是非常有用的

预处理语句用于执行多个相同的 SQL 语句,并且执行效率更高

预处理语句的工作原理如下:

  1. 预处理:创建 SQL 语句模板并发送到数据库。预留的值使用参数 "?" 标记 。例如:

    INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)
  2. 数据库解析,编译,对SQL语句模板执行查询优化,并存储结果不输出。

  3. 执行:最后,将应用绑定的值传递给参数("?" 标记),数据库执行语句。应用可以多次执行语句,如果参数的值不一样。

相比于直接执行SQL语句,预处理语句有两个主要优点:

  • 预处理语句大大减少了分析时间,只做了一次查询(虽然语句多次执行)。

  • 绑定参数减少了服务器带宽,你只需要发送查询的参数,而不是整个语句。

  • 预处理语句针对SQL注入是非常有用的,因为参数值发送后使用不同的协议,保证了数据的合法性

 

mysqli查询语句遇到问题

原因分析:

消息说明MYSQL数据库认为是这一个错误的命令执行顺序。原因在于MYSQL的存储过程执行完成后除了返回实际结果集还会返回存储过程执行的转态

,而上面的代码仅处理了第一个结果集,第二个结果集并没有被释放掉

建议使用mysqli_query()插入数据 每条语句只插入一条数据

解决后的代码:

<?php
//面向过程连接数据库
$conn = mysqli_connect('localhost','root','root');
//判断是否连接成功
if(!$conn){die('连接数据库失败'.mysqli_connect_error());
}else{echo '连接成功';//创建数据库mytest$sql = 'create database mytest';if(mysqli_query($conn,$sql)){echo '执行成功'.$sql;}else{echo '执行失败'.mysqli_error($conn);}//选择数据库并且创建表执行插入语句if(mysqli_query($conn,'use mytest')){echo '切换数据库成功';$sql = "create table mytest(id int auto_increment primary  key,name varchar(14) not null) ";//如创建表成功if(mysqli_query($conn,$sql)){echo '创建成功'.$sql;}else{echo '创建失败'.mysqli_error($conn);}//插入多条数据$sql="insert into mytest (name) values ('webcyh');";$sql.="insert into mytest (name) values ('hony');";
mysqli_autocommit($conn,FALSE);if (mysqli_multi_query($conn,$sql)){do {if ($result = mysqli_store_result()) {while ($row = result_fetch_row($rst)) {echo $row[0];}}} while (mysqli_next_result($conn));}mysqli_commit($conn);$sql='select name from mytest';$rst=mysqli_query($conn,$sql);var_dump($rst);//判断是否有结果if(mysqli_num_rows($rst)>0){echo '查询结果如下';while($row=mysqli_fetch_assoc($rst)){echo '姓名'.$row["name"];}}else{echo '没有结果'.mysqli_error($conn);}//查询数据并且输出
    }//关闭数据库连接mysqli_close($conn);
}

输出结果:

 mysqli面向对象方式连接mysql数据库

<?php
//mysqli面向对象使用mysql实例 如果你使用其他端口(默认为3306),为数据库参数添加空字符串,如: new mysqli("localhost", "username", "password", "", port)
$conn = new  mysqli('localhost','root','root');
//判断是否连接成功
if($conn->connect_error){echo '连接失败'.$conn->connect_error;//或者mysqli_connect_error();
}else{
//切换数据库$sql='use mytest';if($conn->query($sql) == TRUE){echo '切换成功';//插入数据使用语句预处理操作$stml=$conn->prepare("insert  into test(name) values(?)");//绑定参数$stml->bind_param("s",$name);$name='webcyh';$stml->execute();echo  '插入成功';$stml->close();//查询数据$sql='select * from test';$rst=$conn->query($sql);if($rst->num_rows>0){while($row = $rst->fetch_assoc()){echo $row['name'];}}}else{echo '切换失败'.$conn->error;}}//关闭数据库
$conn->close();

 

 

 

 

"INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)"

在 SQL 语句中,我们使用了问号 (?),在此我们可以将问号替换为整型,字符串,双精度浮点型和布尔值。

$stmt->bind_param("sss", $firstname, $lastname, $email);

该函数绑定了 SQL 的参数,且告诉数据库参数的值。 "sss" 参数列处理其余参数的数据类型。s 字符告诉数据库该参数为字符串。

参数有以下四种类型:

  • i - integer(整型)
  • d - double(双精度浮点型)
  • s - string(字符串)
  • b - BLOB(binary large object:二进制大对象)

 

转载于:https://www.cnblogs.com/webcyh/p/11281028.html

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

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

相关文章

Vue项目中自动将px转换为rem

一、配置与安装步骤&#xff1a; 1、在 Vue 项目的 src 文件夹下创建一个 config 文件夹&#xff1a; 2、在 config 文件夹中创建 rem.js&#xff1a; 3、将以下代码复制到 rem.js 中&#xff1a; // 基准大小 const baseSize 32 // 设置 rem 函数 function setRem () {// 当前…

MySQL8.0.19下载安装及配置详细步骤

下载&#xff1a; 软件下载地址&#xff1a;https://www.mysql.com/downloads/ 进入主页后下滑见 然后点击下图的MySQL Community Server 进入之后&#xff0c;点击Download进行下载 进入Download之后&#xff0c;点击No thanks, just start my download&#xff08;无需注…

解决[ERROR] [MY-013276] [Server] Failed to set datadir to ‘F:\Mysql\mysql-8.0.19-winx64\data\‘ (OS er

解决[ERROR] [MY-013276] [Server] Failed to set datadir to ‘F:\Mysql\mysql-8.0.19-winx64\data’ (OS errno: 2 - No such file or directory)报错问题 输入&#xff1a;mysqld --initialize --usermysql --console 如下图&#xff1a; 然后输入mysqld -install&#xff…

DataTable操作相关实例

代码 publicDataSet GetChildDepartmentsByUserId(Guid userId) { DataSet ds newDataSet(); try{ OrgChartDB.OrgChart_PermissionDataTable pdt permissionTableAdapter.GetDataByUserId(userId); for(inti 0; …

修改mysql密码时遇见ERROR 1064 (42000) You have an error in your SQL syntax; check the manual that correspo

修改mysql密码时遇见ERROR 1064 (42000) You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘password(‘123456’)’ at line 1报错 如下图&#xff1a; 这个句子翻译过来的意思是…

JavaScript基础内容

1.1 JavaScript基础概念&#xff1a; JavaScript (ECMAScript) &#xff1a;JavaScript 是脚本语言。JavaScript和ECMAScript通常被人用来表达相同的含义&#xff0c;但是JavaScript并不是这么一点含义&#xff0c;它是由ECMAScript 核心. DOM 文档对象模型. BOM 浏览器对象模型…

如何利用navicat可视化软件添加与新建mysql数据库

新建 https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注&#xff01; 欢迎关注微信公众号&#xff1a;宝藏女孩的成长日记 如有转载&#xff0c;请注明出处&#xff08;如不注明&#xff0c;盗者必究&#xff09; 打开navicat,如下图&#xff1a; 点击连接 名称可以…

mysql -- 死锁

死锁&#xff08;Deadlock&#xff09; 什么是死锁 所谓死锁&#xff1a;是指两个或两个以上的进程在执行过程中&#xff0c;因争夺资源而造成的一种互相等待的现象&#xff0c;若无外力作用&#xff0c;它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁&#xf…

在windows下的cmd中如何进入与退出mysql

在windows下的cmd中如何进入与退出mysql https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注&#xff01; 欢迎关注微信公众号&#xff1a;宝藏女孩的成长日记 如有转载&#xff0c;请注明出处&#xff08;如不注明&#xff0c;盗者必究&#xff09; 进入&#xff1a;…

在shell中全局变量与局部变量的区别及其举例

主要区别&#xff1a; 1.作用域不同&#xff1a;全局变量的作用域为整个程序&#xff0c;它的声明在后面的各个部分都可以发生作用&#xff0c;而局部变量仅仅为定义的某个函数。且局部变量只能在局部进行使用。 2.优先级不同&#xff1a;局部变量优先于全局变量。 3.生命周期…

黑盒测试概念简述,黑盒测试优缺点、黑盒用例设计方法简单介绍及黑盒测试方法使用总结

黑色测试黑盒测试概念&#xff1a;黑盒的优缺点介绍&#xff1a;黑盒测试用例设计方法简单介绍&#xff1a;黑盒测试方法使用总结&#xff1a;黑盒测试概念&#xff1a; 又称功能测试或数据驱动测试&#xff0c;是用来检测每个功能是否正常使用。黑盒测试主要意味着测试要在软…

超文本css样式换行

之前有关于LODOP中纯文本换行的相关博文&#xff1a;Lodop纯文本英文-等符号自动换行问题纯文本的遇到不拆分的单词的时候&#xff0c;可以通过LODOP 语句设置允许标点溢出&#xff0c;且英文单词拆开。超文本需要通过css样式控制&#xff0c;相关博文&#xff1a;Lodop打印控件…

详述白盒测试逻辑覆盖法的语句覆盖及其缺点

语句覆盖的定义&#xff1a; 语句覆盖就是设计若干个测试用例&#xff0c;使被测试程序中的每条可执行语句至少执行一次。比如说我们测试用例里面有10个语句&#xff0c;那么这10个语句都要被测试到。 https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注&#xff01;…

HDU - 6183 Color it 2017广西邀请赛(线段树)

题目链接 题意&#xff1a; 有四种操作 0操作 清空所有点 1操作 在&#xff08;x,y&#xff09;处插入一个带颜色的点 2 操作统计(1~x)(y1~y2&#xff09;这个范围的不同的颜色数 3 结束 思路&#xff1a; 颜色数只有51个 我们可以建51颗线段树 因为每次查询都是1~x范围的 所以…

详述白盒测试的逻辑覆盖法的判定覆盖及其优缺点

https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注&#xff01; 欢迎关注微信公众号&#xff1a;宝藏女孩的成长日记 如有转载&#xff0c;请注明出处&#xff08;如不注明&#xff0c;盗者必究&#xff09; 详述白盒测试的逻辑覆盖法的判定覆盖及其优缺点&#xff1…

详述白盒测试的逻辑覆盖的条件覆盖及其优缺点

条件覆盖详述白盒测试的逻辑覆盖的条件覆盖及其优缺点&#xff1a;条件覆盖的定义&#xff1a;与判定覆盖的区别&#xff1a;条件覆盖率&#xff1a;测试实例&#xff1a;代码&#xff1a;优缺点&#xff1a;详述白盒测试的逻辑覆盖的条件覆盖及其优缺点&#xff1a; https://b…

详述白盒测试的逻辑覆盖法的条件判定覆盖及其优缺点

条件判定覆盖的定义&#xff1a; 设计足够多的测试用例&#xff0c;使被测程序中每个判定的每个条件的所有可能取值&#xff08;真假&#xff09;至少执行一次&#xff0c;并且每个判定的所有可能&#xff08;真假&#xff09;分支也至少执行一次 。通俗来讲&#xff0c;就是条…

利用可视化软件navicat对mysql进行语句查询的使用(增删改查)

https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注&#xff01; 欢迎关注微信公众号&#xff1a;宝藏女孩的成长日记 如有转载&#xff0c;请注明出处&#xff08;如不注明&#xff0c;盗者必究&#xff09; 增&#xff1a;insert 语法&#xff1a;INSERT [INTO] 表…

C# 3.0入门系列(三)

从本节开始&#xff0c;笔者将会和大家一起开始体验dlinq了。前面我们准备了数据库&#xff0c;也对数据库之间的关系做了初步的了解。有了数据库之后&#xff0c;数据和对象是一个什么样的关系呢&#xff1f;从dlinq的设计来看&#xff0c;它主要是为了解决data!objects 的问题…

(Navicat for MySQL)利用可视化软件navicat操作mysql,创建一个表举例(基础)

https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注&#xff01; 欢迎关注微信公众号&#xff1a;宝藏女孩的成长日记 如有转载&#xff0c;请注明出处&#xff08;如不注明&#xff0c;盗者必究&#xff09; 步骤&#xff1a; 首先我们打开navicat:先点击下图中的表…