原文: PHP5: mysqli 插入, 查询, 更新和删除 Insert Update Delete Using mysqli (CRUD)
1. PHP 连接 MySQL
__construct ([ string $host [, string $username [, string $passwd [, string $dbname [, int $port [, string $socket ]]]]]] )
要建立与MySQL的连接可以通过其构造方法实例化mysqli类,例如下面的代码:
<?php $db_host = "localhost"; //连接的服务器地址 $db_user = "root"; //连接数据库的用户名 $db_psw = "root"; //连接数据库的密码 $db_name = "ikeepstudying"; //连接的数据库名称 // 创建连接 $conn = new mysqli($db_host,$db_user,$db_psw,$db_name); // 检测连接 if ($conn->connect_error) { die("连接失败: " . $conn->connect_error); // 或者使用 // die('Error : ('. $conn->connect_errno .') '. $conn->connect_error); } echo "连接成功"; ?>
mysqli还提供了一个连接MySQL的成员方法connect()。当实例化构造方法为空的mysqli类时,用mysqli对象调用connect()方法同样可连接MySQL,例如,下面的代码:
<?php $db_host = "localhost"; //连接的服务器地址 $db_user = "root"; //连接数据库的用户名 $db_psw = "root"; //连接数据库的密码 $db_name = "ikeepstudying"; //连接的数据库名称 $conn = new mysqli(); $conn->connect($db_host,$db_user,$db_psw,$db_name); // 检测连接 if ($conn->connect_error) { die("连接失败: " . $conn->connect_error); // 或者使用 // die('Error : ('. $conn->connect_errno .') '. $conn->connect_error); } echo "连接成功"; ?>
关闭与MySQL服务器的连接通过mysqli对象调用close()方法即可,例如:
$conn->close();
mysqli_connect ([ string $host [, string $username [, string $passwd [, string $dbname [, int $port [, string $socket ]]]]]] )
mysqli_connect()函数的用法与mysql扩展中的mysql_connect()函数用法十分相似,下面是mysqli_connect()函数的用法示例:
<?php $servername = "localhost"; $username = "username"; $password = "password"; $database = "ikeepstudying"; // 创建连接 $conn = mysqli_connect($servername, $username, $password, $database); // 检测连接 if (!$conn) { die("Connection failed: " . mysqli_connect_error()); } echo "连接成功"; ?>
关闭与MySQL服务器的连接使用mysqli_close()函数,例如:
mysqli_close();
2. PHP MySQL 插入数据
在创建完数据库和表后,我们可以向表中添加数据。
以下为一些语法规则:
- PHP 中 SQL 查询语句必须使用引号
- 在 SQL 查询语句中的字符串值必须加引号
- 数值的值不需要引号
- NULL 值不需要引号
INSERT INTO 语句通常用于向 MySQL 表添加新的记录:
INSERT INTO table_name (column1, column2, column3,...) VALUES (value1, value2, value3,...)
以下实例向 "MyGuests" 表添加了新的记录:
<?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "ikeepstudying"; // 创建连接 $conn = new mysqli($servername, $username, $password, $dbname); // 检测连接 if ($conn->connect_error) { die("连接失败: " . $conn->connect_error); } $sql = "INSERT INTO MyGuests (firstname, lastname, email) VALUES ('John', 'Doe', 'john@example.com')"; if ($conn->query($sql) === TRUE) { echo "新记录插入成功"; } else { echo "Error: " . $sql . "<br>" . $conn->error; } $conn->close(); ?>
插入多条记录:
<?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "ikeepstudying"; // 创建链接 $conn = new mysqli($servername, $username, $password, $dbname); // 检查链接 if ($conn->connect_error) { die("连接失败: " . $conn->connect_error); } $sql = "INSERT INTO MyGuests (firstname, lastname, email) VALUES ('John', 'Doe', 'john@example.com');"; $sql .= "INSERT INTO MyGuests (firstname, lastname, email) VALUES ('Mary', 'Moe', 'mary@example.com');"; $sql .= "INSERT INTO MyGuests (firstname, lastname, email) VALUES ('Julie', 'Dooley', 'julie@example.com')"; if ($conn->multi_query($sql) === TRUE) { echo "新记录插入成功"; } else { echo "Error: " . $sql . "<br>" . $conn->error; } $conn->close(); ?>
请注意,每个SQL语句必须用分号隔开。
2.面向过程
<?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "ikeepstudying"; // 创建连接 $conn = mysqli_connect($servername, $username, $password, $dbname); // 检测连接 if (!$conn) { die("Connection failed: " . mysqli_connect_error()); } $sql = "INSERT INTO MyGuests (firstname, lastname, email) VALUES ('John', 'Doe', 'john@example.com')"; if (mysqli_query($conn, $sql)) { echo "新记录插入成功"; } else { echo "Error: " . $sql . "<br>" . mysqli_error($conn); } mysqli_close($conn); ?>
插入多条记录:
<?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "ikeepstudying"; // 创建链接 $conn = mysqli_connect($servername, $username, $password, $dbname); // 检查链接 if (!$conn) { die("连接失败: " . mysqli_connect_error()); } $sql = "INSERT INTO MyGuests (firstname, lastname, email) VALUES ('John', 'Doe', 'john@example.com');"; $sql .= "INSERT INTO MyGuests (firstname, lastname, email) VALUES ('Mary', 'Moe', 'mary@example.com');"; $sql .= "INSERT INTO MyGuests (firstname, lastname, email) VALUES ('Julie', 'Dooley', 'julie@example.com')"; if (mysqli_multi_query($conn, $sql)) { echo "新记录插入成功"; } else { echo "Error: " . $sql . "<br>" . mysqli_error($conn); } mysqli_close($conn); ?>
php5和新增了获取最新插入值的ID的函数:mysqli_insert_id($conn),和之前的mysql_insert_id()类似。
都是用在insert语句之后获取最新的自动id号,要注意的是mysqli_insert_id(),括号里面的一定要是数据库连接而不是执行结果$result。
程序实例:
$conn = new mysqli("127.0.0.1","root","","ikeepstudying") or die("数据库连接超时!"); $sql = "insert into my_table (name,url) values('ikeepstudying','http://justcode.ikeepstudying.com')"; $result = $conn->query($sql) or die("失败"); echo mysqli_insert_id($conn); //输出刚刚插入数据的ID,注意:括号里面的要是$conn而不是$result
3. PHP MySQL 预处理语句
预处理语句对于防止 MySQL 注入是非常有用的。使用预准备语句可提高重复使用语句的性能,在PHP中,使用prepare()方法来进行预准备语句查询,使用execute()方法来执行预准备语句。PHP有两种预准备语句:一种是绑定结果,另一种是绑定参数。
预处理语句, 绑定参数及绑定结果
预处理语句用于执行多个相同的 SQL 语句,并且执行效率更高。
预处理语句的工作原理如下:
- 预处理:创建 SQL 语句模板并发送到数据库。预留的值使用参数 "?" 标记 。例如:
INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)
- 数据库解析,编译,对SQL语句模板执行查询优化,并存储结果不输出。
- 执行:最后,将应用绑定的值传递给参数("?" 标记),数据库执行语句。应用可以多次执行语句,如果参数的值不一样。
相比于直接执行SQL语句,预处理语句有两个主要优点:
- 预处理语句大大减少了分析时间,只做了一次查询(虽然语句多次执行)。
- 绑定参数减少了服务器带宽,你只需要发送查询的参数,而不是整个语句。
- 预处理语句针对SQL注入是非常有用的,因为参数值发送后使用不同的协议,保证了数据的合法性。
MySQLi 预处理语句及绑定参数
bool bind_param ( string $types , mixed &$var1 [, mixed &$... ] )
以下实例在 MySQLi 中使用了预处理语句,并绑定了相应的参数:
<?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "ikeepstudying"; // 创建连接 $conn = new mysqli($servername, $username, $password, $dbname); // 检测连接 if ($conn->connect_error) { die("连接失败: " . $conn->connect_error); } // 预处理及绑定 $stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)"); $stmt->bind_param("sss", $firstname, $lastname, $email); // 设置参数并执行 $firstname = "John"; $lastname = "Doe"; $email = "john@example.com"; $stmt->execute(); $firstname = "Mary"; $lastname = "Moe"; $email = "mary@example.com"; $stmt->execute(); $firstname = "Julie"; $lastname = "Dooley"; $email = "julie@example.com"; $stmt->execute(); echo "新记录插入成功"; $stmt->close(); $conn->close(); ?>
"INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)"
在 SQL 语句中,我们使用了问号 (?),在此我们可以将问号替换为整型,字符串,双精度浮点型和布尔值。
接下来,让我们来看下 bind_param() 函数:
$stmt->bind_param("sss", $firstname, $lastname, $email);
该函数绑定了 SQL 的参数,且告诉数据库参数的值。 "sss" 参数列处理其余参数的数据类型。s 字符告诉数据库该参数为字符串。
字符种类
|
代表的数据类型
|
i
|
integer
|
d
|
double
|
s
|
string
|
b
|
blob
|
通过告诉数据库参数的数据类型,可以降低 SQL 注入的风险。
注意: 如果你想插入其他数据(用户输入),对数据的验证是非常重要的。
MySQLi 预处理语句及绑定结果
所谓绑定结果就是把PHP脚本中的自定义变量绑定到结果集中的相应字段上,这些变量就代表着所查询的记录,绑定结果的示例代码如下:
<?php $mysqli = new mysqli("localhost","root","root","ikeepstudying"); //实例化mysqli $query = "select * from MyGuests"; $result = $mysqli->prepare($query); //进行预准备语句查询 $result->execute(); //执行预准备语句 $result->bind_result($id,$firstname,$lastname,$email); //绑定结果 while ($result->fetch()) { echo $id; echo $firstname; echo $lastname; echo $email; } $result->close(); //关闭预准备语句 ?>
在绑定结果的时候,脚本中的变量要与结果集中的字段一一对应,绑定完以后,通过fetch()方法将绑定在结果集中的变量一一取出来,最后将预准备语句和数据库连接分别关闭。
MySQLi 同时绑定参数和绑定结果
在一个脚本中还可以同时绑定参数和绑定结果,示例代码如下:
<?php $conn = new mysqli("localhost","root","root","ikeepstudying"); //实例化mysqli $query = "select * from MyGuests where id < ?"; $result = $conn->prepare($query); $result->bind_param("i",$id); //绑定参数 $id=4; $result->execute(); $result->bind_result($id,$number,$name,$age); //绑定结果 while ($result->fetch()) { echo $id; echo $firstname; echo $lastname; echo $email; } $result->close(); $conn->close(); ?>
4. PHP MySQL 读取数据, 删除及更新
SELECT 语句用于从数据表中读取数据:
SELECT column_name(s) FROM table_name
mixed query ( string $query [, int $resultmode ] )
1.面向对象
<?php $mysqli = new mysqli("localhost","root","root","ikeepstudying"); //实例化mysqli $query = "select * from MyGuests"; $result = $mysqli->query($query); if ($result) { if($result->num_rows>0){ //判断结果集中行的数目是否大于0 while($row = $result->fetch_array() ){ //循环输出结果集中的记录 echo ($row[0])."<br>"; echo ($row[1])."<br>"; echo ($row[2])."<br>"; echo ($row[3])."<br>"; echo "<hr>"; } } }else { echo "查询失败"; } $result->free(); $mysqli->close(); ?>在上面代码中,num_rows为结果集的一个属性,返回结果集中行的数目。方法fetch_array()将结果集中的记录放入一个数组中并将其返回。最后使用free()方法将结果集中的内存释放,使用close()方法将数据库连接关闭。
对于删除记录(delete)、保存记录(insert)和修改记录(update)的操作,也是使用query()方法来执行的,下面是删除记录的例子:
<?php $mysqli = new mysqli("localhost","root","root","ikeepstudying"); //实例化mysqli $query = "delete from MyGuests where id=2"; $result = $mysqli->query($query); if ($result){ echo "删除操作执行成功"; }else { echo "删除操作执行失败"; } $mysqli->close(); ?>
完整实例:
<?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "ikeepstudying"; // 创建连接 $conn = new mysqli($servername, $username, $password, $dbname); // 检测连接 if ($conn->connect_error) { die("连接失败: " . $conn->connect_error); } $sql = "SELECT id, firstname, lastname FROM MyGuests"; $result = $conn->query($sql); if ($result->num_rows > 0) { // 输出每行数据 while($row = $result->fetch_assoc()) { echo "<br> id: ". $row["id"]. " - Name: ". $row["firstname"]. " " . $row["lastname"]; } } else { echo "0 个结果"; } $conn->close(); ?>
更多实例:
INSERT
$stmt = $mysqli->prepare("INSERT INTO movies(filmName, filmDescription,filmImage,filmPrice,filmReview) VALUES (?, ?, ?, ?, ?)"); $stmt->bind_param('sssdi', $_POST['filmName'], $_POST['filmDescription'], $_POST['filmImage'], $_POST['filmPrice'], $_POST['filmReview']); $stmt->execute(); $stmt->close();
Getting Auto Increment Key Values with insert_id
$stmt = $mysqli->prepare("INSERT INTO movies(filmName, filmDescription,filmImage,filmPrice,filmReview) VALUES (?, ?, ?, ?, ?)"); $stmt->bind_param('sssdi', $_POST['filmName'], $_POST['filmDescription'], $_POST['filmImage'], $_POST['filmPrice'], $_POST['filmReview']); $stmt->execute(); $newId = $stmt->insert_id; $stmt->close();
UPDATE
$stmt = $mysqli->prepare("UPDATE movies SET filmName = ?, filmDescription = ?, filmImage = ?, filmPrice = ?, filmReview = ? WHERE filmID = ?"); $stmt->bind_param('sssdii', $_POST['filmName'], $_POST['filmDescription'], $_POST['filmImage'], $_POST['filmPrice'], $_POST['filmReview'], $_POST['filmID']); $stmt->execute(); $stmt->close();
DELETE
$stmt = $mysqli->prepare("DELETE FROM movies WHERE filmID = ?"); $stmt->bind_param('i', $_POST['filmID']); $stmt->execute(); $stmt->close();
2.面向过程
<?php $con = mysqli_connect("localhost","username","password","ikeepstudying"); // 检测连接 if (mysqli_connect_errno()) { echo "连接失败: " . mysqli_connect_error(); } $result = mysqli_query($con,"SELECT * FROM Persons WHERE FirstName='Peter'"); while($row = mysqli_fetch_array($result)) { echo $row['FirstName'] . " " . $row['LastName']; echo "<br>"; } ?>
5. mysqli 读取数据库的几种方式
mysqli有四种读取数据库数据的方式:mysqli_fetch_array(), mysqli_fetch_object(), mysqli_fetch_accoc(), mysqli_fetch_row()。
区别是:
- mysqli_fetch_array(),同时返回关系型数组和计数型数组2种,读取数据的时候我们可以用比如:$result[1] 或者是$result["username"]。
- mysqli_fetch_accoc(),返回关系型数组,读取数据的时候我们可以用比如:$result["username"]。
- mysqli_fetch_row(),返回计数型数组,读取数据的时候我们可以用比如:$result[0]。
- mysqli_fetch_object(),返回一个对象,读取数据的时候我们可以用比如:$result->username的方式读取数据。
6. mysqli 一些函数的对比 ( 面向对象 vs 面向过程 )
1. mysqli 连接数据库:
$db = new mysqli(host,user,password,database);
这是对象导向的连接方法,还有一种过程导向的连接方法。前者返回一个对象,后者返回一个资源。
$db = mysqli_connect(host,user,password,database);
2.mysqli 连接出错函数:
$db->connect_error
or
mysqli_connect_error();
如果连接出错,该函数返回一个错误号,否则返回0;
3.选择数据库:
$db->select_db(dbname);
or
mysqli_select_db(db_resource,db_name);
4.mysqli 执行查询
$result = $db->query($query);
or
$result = mysqli_query($db,$query);
5.返回结果的行数:
$num_results = $result->num_rows;
or
$num_results = mysqli_num_rows($result);
6.取出每一行的结果(返回关系型数组):
$row = $result->fetch_assoc();
or
$row = mysqli_fetch_assoc($result);
7.取出每一行的结果(返回计数型数组):
$row = $result->fetch_row($result);
or
$row = mysqli_fetch_row($result);
8.取出每一行的结果(返回一个对象):
$row = $result->fetch_object();
or
$row = mysqli_fetch_object($result);
9.释放查询结果:
$result->free();
or
mysqli_free_result($result);
10.关闭数据库连接:
$db->close();
or
mysqli_close($db);
11.一条查询所影响的行数:
$db->affected_rows;
or
mysqli_affected_rows($result);
12.模式化SQL语句执行:
$query = “insert into books values(?, ?, ?, ?)”;
$stmt = $db->prepare($query);
$stmt->bind_param(“sssd”, $isbn, $author, $title, $price);
$stmt->execute();
echo $stmt->affected_rows.’ book inserted into database.’;
$stmt->close();
在过程化执行方式中,
$db->prepare()对应mysqli_stmt_prepare()函数;
$stmt->bind_param()对应mysqli_stmt_bind_param()函数;
$stmt->execute() 对应mysqli_stmt_execute()函数;
本文转自: PHP5: mysqli 插入, 查询, 更新和删除 Insert Update Delete Using mysqli (CRUD)
相关推荐
本教程聚焦于如何利用Bootstrap模态框(Modal)进行CRUD操作,结合PHP和MySQLi,实现对MySQL数据库中的行进行创建、读取、更新和删除。Bootstrap是一款流行的前端框架,提供了丰富的UI组件,模态框则是其一种常见...
它支持 SQL(结构化查询语言),允许开发者执行各种数据库操作,如创建、读取、更新和删除数据(CRUD)。在 PHP 中,可以使用像 mysqli 或 PDO(PHP Data Objects)这样的扩展来与 MySQL 数据库进行通信。 接下来,...
qtz40塔式起重机总体及塔身有限元分析法设计().zip
Elasticsearch是一个基于Lucene的搜索服务器
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
美国纽约HVAC(暖通空调)数据示例,谷歌地图数据包括:时间戳、名称、类别、地址、描述、开放网站、电话号码、开放时间、更新开放时间、评论计数、评级、主图像、评论、url、纬度、经度、地点id、国家等。 在地理位置服务(LBS)中,谷歌地图数据采集尤其受到关注,因为它提供了关于各种商业实体的详尽信息,这对于消费者和企业都有极大的价值。本篇文章将详细介绍美国纽约地区的HVAC(暖通空调)系统相关数据示例,此示例数据是通过谷歌地图抓取得到的,展示了此技术在商业和消费者领域的应用潜力。 无需外网,无需任何软件抓取谷歌地图数据:wmhuoke.com
2023-04-06-项目笔记-第四百五十五阶段-课前小分享_小分享1.坚持提交gitee 小分享2.作业中提交代码 小分享3.写代码注意代码风格 4.3.1变量的使用 4.4变量的作用域与生命周期 4.4.1局部变量的作用域 4.4.2全局变量的作用域 4.4.2.1全局变量的作用域_1 4.4.2.453局变量的作用域_453- 2025-04-01
1_实验三 扰码、卷积编码及交织.ppt
北京交通大学901软件工程导论必备知识点.pdf
内容概要:本文档总结了 MyBatis 的常见面试题,涵盖了 MyBatis 的基本概念、优缺点、适用场合、SQL 语句编写技巧、分页机制、主键生成、参数传递方式、动态 SQL、缓存机制、关联查询及接口绑定等内容。通过对这些问题的解答,帮助开发者深入理解 MyBatis 的工作原理及其在实际项目中的应用。文档不仅介绍了 MyBatis 的核心功能,还详细解释了其在不同场景下的具体实现方法,如通过 XML 或注解配置 SQL 语句、处理复杂查询、优化性能等。 适合人群:具备一定 Java 开发经验,尤其是对 MyBatis 有初步了解的研发人员,以及希望深入了解 MyBatis 框架原理和最佳实践的开发人员。 使用场景及目标:①理解 MyBatis 的核心概念和工作原理,如 SQL 映射、参数传递、结果映射等;②掌握 MyBatis 在实际项目中的应用技巧,包括 SQL 编写、分页、主键生成、关联查询等;③学习如何通过 XML 和注解配置 SQL 语句,优化 MyBatis 性能,解决实际开发中的问题。 其他说明:文档内容详尽,涵盖面广,适合用于面试准备和技术学习。建议读者在学习过程中结合实际项目进行练习,以更好地掌握 MyBatis 的使用方法和技巧。此外,文档还提供了丰富的示例代码和配置细节,帮助读者加深理解和应用。
《基于YOLOv8的智能电网设备锈蚀评估系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计
插头模具 CAD图纸.zip
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
《基于YOLOv8的智慧农业水肥一体化控制系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计
python爬虫;智能切换策略,反爬检测机制
台区终端电科院送检文档
e235d-main.zip
丁祖昱:疫情对中国房地产市场影响分析及未来展望
MCP快速入门实战,详细的实战教程
YD5141SYZ后压缩式垃圾车的上装箱体设计.zip