【PHP快速上手(十三)】

目录

  • PHP快速上手(十三)
    • PHP 预处理语句和读取数据
      • PHP 预处理语句
        • 使用 MySQLi 中的预处理语句
        • 使用 PDO 中的预处理语句
        • 示例:插入多条数据
      • PHP 读取数据
        • 使用 MySQLi 面向过程读取数据
        • 使用 MySQLi 面向对象读取数据
        • 使用 PDO 读取数据

PHP快速上手(十三)

PHP 预处理语句和读取数据

PHP 预处理语句

预处理语句是一种在执行 SQL 查询之前预先编译 SQL 查询并将参数绑定到查询中的占位符的方法。这可以防止 SQL 注入攻击,并提高查询的性能,特别是当多次执行相同的查询时。在 PHP 中,可以使用 MySQLi 或 PDO 来执行预处理语句。下面详细介绍如何在 PHP 中使用 MySQLi 和 PDO 中的预处理语句。

使用 MySQLi 中的预处理语句

1. 准备预处理语句
使用 prepare() 方法准备预处理语句,并在 SQL 查询中使用占位符 ? 或命名占位符 :name 来代替实际的参数。

$sql = "INSERT INTO users (name, email) VALUES (?, ?)";
$stmt = $conn->prepare($sql);

2. 绑定参数
使用 bind_param() 方法将参数绑定到预处理语句中的占位符。

$name = "John Doe";
$email = "john@example.com";
$stmt->bind_param("ss", $name, $email);

在上面的示例中,“ss” 表示两个参数都是字符串类型。如果有更多参数,可以添加对应的类型标识符。

3. 执行预处理语句
通过调用 execute() 方法来执行预处理语句。

$stmt->execute();
使用 PDO 中的预处理语句

1. 准备预处理语句
使用 prepare() 方法准备预处理语句,并在 SQL 查询中使用占位符 ? 或命名占位符 :name 来代替实际的参数。

$sql = "INSERT INTO users (name, email) VALUES (:name, :email)";
$stmt = $conn->prepare($sql);

2. 绑定参数
可以使用 bindParam() 或 bindValue() 方法将参数绑定到预处理语句中的占位符。

$name = "John Doe";
$email = "john@example.com";
$stmt->bindParam(':name', $name, PDO::PARAM_STR);
$stmt->bindParam(':email', $email, PDO::PARAM_STR);

在上面的示例中,PDO::PARAM_STR 表示参数是字符串类型。如果有其他类型的参数,可以根据需要选择不同的参数类型。

3. 执行预处理语句
通过调用 execute() 方法来执行预处理语句。

$stmt->execute();
示例:插入多条数据

下面是一个示例,演示如何使用MySQLi 的预处理语句插入多条数据:

$sql = "INSERT INTO users (name, email) VALUES (?, ?)";
$stmt = $conn->prepare($sql);if ($stmt) {$users = [["John Doe", "john@example.com"],["Jane Doe", "jane@example.com"],["Alice Smith", "alice@example.com"]];foreach ($users as $user) {$stmt->bind_param("ss", $user[0], $user[1]);$stmt->execute();}echo "Records inserted successfully";$stmt->close();
} else {echo "Error preparing statement";
}

在上面的示例中,首先准备了一个插入语句的预处理语句,然后使用循环遍历要插入的数据,并将每个数据绑定到预处理语句中的占位符,最后执行预处理语句。

总结
预处理语句是一种在执行 SQL 查询之前预先编译 SQL 查询并将参数绑定到查询中的占位符的方法。在 PHP 中,可以使用 MySQLi 或 PDO 来执行预处理语句,这样可以防止 SQL 注入攻击,并提高查询的性能。

PHP 读取数据

当使用 MySQLi 和 PDO 读取数据时,你可以选择使用面向过程的编程风格(MySQLi 面向过程),或者面向对象的编程风格(MySQLi 面向对象和PDO)。以下是两种风格的示例以及它们的详细解释:

使用 MySQLi 面向过程读取数据

1. 连接到数据库

$servername = "localhost";
$username = "root";
$password = "";
$dbname = "test";$conn = mysqli_connect($servername, $username, $password, $dbname);if (!$conn) {die("Connection failed: " . mysqli_connect_error());
}

2. 执行查询并获取结果集

$sql = "SELECT id, name, email FROM users";
$result = mysqli_query($conn, $sql);if (mysqli_num_rows($result) > 0) {while ($row = mysqli_fetch_assoc($result)) {echo "id: " . $row["id"] . " - Name: " . $row["name"] . " - Email: " . $row["email"] . "<br>";}
} else {echo "0 results";
}
  1. 关闭连接
mysqli_close($conn);
使用 MySQLi 面向对象读取数据

1. 连接到数据库

$servername = "localhost";
$username = "root";
$password = "";
$dbname = "test";$conn = new mysqli($servername, $username, $password, $dbname);if ($conn->connect_error) {die("Connection failed: " . $conn->connect_error);
}

2. 执行查询并获取结果集

$sql = "SELECT id, name, email FROM users";
$result = $conn->query($sql);if ($result->num_rows > 0) {while ($row = $result->fetch_assoc()) {echo "id: " . $row["id"] . " - Name: " . $row["name"] . " - Email: " . $row["email"] . "<br>";}
} else {echo "0 results";
}

3. 关闭连接

$conn->close();
使用 PDO 读取数据

1. 连接到数据库

$dsn = "mysql:host=localhost;dbname=test";
$username = "root";
$password = "";try {$conn = new PDO($dsn, $username, $password);$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {echo "Connection failed: " . $e->getMessage();
}

2. 执行查询并获取结果集

$sql = "SELECT id, name, email FROM users";
$stmt = $conn->query($sql);if ($stmt->rowCount() > 0) {while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {echo "id: " . $row["id"] . " - Name: " . $row["name"] . " - Email: " . $row["email"] . "<br>";}
} else {echo "0 results";
}

3. 关闭连接

Copy code
$conn = null;

总结
以上是使用 MySQLi 和 PDO 两种方式读取数据的示例。无论选择哪种方式,都需要先连接到数据库,然后执行查询并处理结果集,最后关闭连接。MySQLi 和 PDO 在功能上基本相似,但 PDO 更灵活,并支持更多种类的数据库,因此在选择时可以根据个人偏好和项目需求来决定。

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

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

相关文章

NtripShare2024年第一季度主要技术进展

迷迷糊糊又是一个月没有写点什么&#xff0c;近期想清楚NtripShare在2024的要做什么事情&#xff0c;暂且将NtripShare要做的主要事情为搭建由软件与硬件之间的技术桥梁。 在过去的几年时间里NtripShare对硬件方面一直是规避的态度&#xff0c;今年开始要做一点软硬件搭界的技…

python | webassets,一个超强的 Python 库!

本文来源公众号“python”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;webassets&#xff0c;一个超强的 Python 库&#xff01; 大家好&#xff0c;今天为大家分享一个超强的 Python 库 - webassets。 Github地址&#xff1a…

探索Java设计模式:模板方法模式

探索Java设计模式&#xff1a;深入理解与实践模板方法模式 模板方法模式&#xff08;Template Method Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一个算法的框架&#xff0c;并允许子类在不改变算法整体结构的情况下重定义某些步骤。在Java编程中&#xff…

mmcv bug记录

图像分类任务要用到mmcv框架&#xff0c;记录遇到的问题 1. Can‘t import build_from_cfg from mmcv. 解决命令&#xff1a;pip install openmim && mim install mmcv-full 2. python分布式训练 解决方案&#xff1a; 租用多张A40卡&#xff0c;执行下述命令&…

跨站攻击CSRF实验

1.low等级 先利用Burp抓包 将get响应的url地址复制&#xff0c;发到网页上&#xff08;Low等级到这完成&#xff09; Medium&#xff1a; 再将抓到的包发到Repeater上,对请求中的Referer进行修改&#xff0c;修改成和url一样的地址&#xff0c;修改成功。 在这里修改后发送 然…

团队协作:如何利用 Gitee 实现多人合作项目的版本控制

文章目录 前言一、名词解释1、Git是什么&#xff1f;2、Gitee、GitHub和GitLab 二、操作步骤1.安装Git2.创建Gitee仓库3.用vscode连接仓库4. 克隆远程仓库 总结 前言 在软件开发中&#xff0c;有效地管理代码是至关重要的。Gitee 是一个功能强大的代码托管平台&#xff0c;提供…

使用clickhouse-backup迁移数据

作者&#xff1a;俊达 1 说明 上一篇文章中&#xff0c;我们介绍了clickhouse-backup工具。除了备份恢复&#xff0c;我们也可以使用该工具来迁移数据。 这篇文章中&#xff0c;我们提供一个使用clickhouse-backup做集群迁移的方案。 2 前置条件 1、源端和目标端网络联通&a…

LeetCode刷题实战5:最长回文子串

题目内容 给你一个字符串 s&#xff0c;找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同&#xff0c;则该字符串称为回文字符串。 示例 1&#xff1a; 输入&#xff1a;s "babad" 输出&#xff1a;"bab" 解释&#xff1a;"aba"…

k8s 控制器StatefulSet原理解析

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Kubernetes航线图&#xff1a;从船长到K8s掌舵者》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、前言 1、k8s概述 2、有状态服务和无状态服务…

von Mises-Fisher Distribution (代码解析)

torch.distribution 中包含了很多概率分布的实现&#xff0c;本文首先通过均匀分布来说明 Distribution 的具体用法, 然后再解释 von Mises-Fisher 分布的实现, 其公式推导见 von Mises-Fisher Distribution. 1. torch.distribution.Distribution 以下是 Uniform 的源码: cl…

C++语言·类和对象(下)

1. 初始化列表 我们回忆上节写的MyQueue类&#xff0c;其中有两个栈类和一个int类型&#xff0c;栈类因为其特殊性&#xff0c;要开空间&#xff0c;所以我们必须手搓Stack类的构造函数。但是正常来说MyQueue自动生成的构造函数会调用自定义类型的默认构造函数&#xff0c;也就…

Python 一个简化地址解析的利器 addressrec

目录 为什么选择AddressRec&#xff1f; 安装AddressRec 使用AddressRec 实际应用案例 结论 在处理地理数据时&#xff0c;地址解析是一个关键步骤&#xff0c;它涉及到将地址字符串转换为标准化的格式或地理坐标。addressrec是一个Python库&#xff0c;它为开发者和数据分…

基于SpringBoot+Vue的体检管理系统 免费获取源码

项目源码获取方式放在文章末尾处 项目技术 数据库&#xff1a;Mysql5.7/8.0 数据表&#xff1a;12张 开发语言&#xff1a;Java(jdk1.8) 开发工具&#xff1a;idea 前端技术&#xff1a;vue html 后端技术&#xff1a;SpringBoot 功能简介 (有文档) 项目获取关键字&…

浏览器渲染流程中的 9 个面试点

记得 08 年以前&#xff0c;打开网页的时候一个页面卡死整个浏览器凉凉。 这是因为当时浏览器是单进程架构&#xff0c;一个页面或者插件卡死&#xff0c;整个浏览器都会崩溃&#xff0c;非常影响用户体验。 经过了一代代工程师的设计&#xff0c;现代浏览器改成了多进程架构&…

异常检测 | SVDD支持向量数据描述异常数据检测(Matlab)

异常检测 | SVDD支持向量数据描述异常数据检测&#xff08;Matlab&#xff09; 目录 异常检测 | SVDD支持向量数据描述异常数据检测&#xff08;Matlab&#xff09;效果一览基本介绍程序设计参考资料 效果一览 基本介绍 用于一类或二元分类的 SVDD 模型 多种核函数&#xff08;…

医学临床预测模型发展新趋势-并联式

医学临床预测模型发展新姿势-并联式 现有的预测模型是对单个结局指标进行分类或者回归&#xff0c;得出最终的结论&#xff0c;而辅助医生进行临床决策。众所周知&#xff0c;临床决策过程中&#xff0c;医生通常会考虑多个结局指标来做出最终的决策&#xff1b;临床研究中也通…

网络编程初步

协议&#xff1a; 一组规则 分层模型结构&#xff1a; OSI七层模型&#xff1a;物、数、网、传、会、表、应 TCP/IP 4层模型&#xff1a;网&#xff08;链路层/网络接口层)、网、传、应 应用层&#xff1a;http、 ftp、 nfs、 ssh、 telneto o .传输层:TCP、UDP 网络层&…

【干货精品分享】Elasticsearch 6.7 Should 子语句的失效

在ES 使用多条件 查询&#xff0c;并且是多个条件只需要满足部分条件的时候&#xff0c;我们通常会使用到ES的should查询 GET /trademark_query_index/_search {"query":{"bool" : {"must":[{"match" : {"origin": {"…

229 基于matlab的网络入侵检测问题

基于matlab的网络入侵检测问题&#xff0c;主要使用有监督的Kohonen神经网络。有监督Kohonen神经网络的网络结构为38-36-5&#xff0c;网络训练结果受权值影响相当大。在算法初期&#xff0c;本文引入杂草算法对Kohonen网络进行权值寻优。文件包括&#xff1a;入侵数据(data.ma…

网站备案期间怎么关闭首页显示无法访问-文章及其它页面正常访问

自从做了开发者之后才发现每个人博主的需求都是不同的&#xff0c;的的确确颠覆了我的观点&#xff0c;无论是页面布局还是SEO相关的设置&#xff0c;可能是因为站点属性不同所以需求不同&#xff0c;慢慢的就会在主题加入一些自定接口来满足不同人的需求&#xff0c;有人需要P…