php mysqli预处理

admin3个月前软件教程56

今天我们来聊一下关于 PHP mysqli 的预处理功能,预处理这个概念在很多编程语言里都有涉及,那么在 PHP 中,它到底是什么呢?

简单的说,预处理就是将 SQL 语句和参数分离,分别进行处理。其中 SQL 语句会在连接时进行编译处理,参数则会在执行时进行传递,这样就能够有效减少 SQL 注入的风险,并提高数据库操作的执行效率。

接下来我们来看看一个具体的使用示例吧。

<?php$mysqli = new mysqli("localhost", "user", "password", "mydatabase");/* 检查连接是否成功 */if ($mysqli->connect_errno) {printf("连接失败: %s\n", $mysqli->connect_error);exit();}/* 创建预处理语句 */$stmt = $mysqli->prepare("INSERT INTO users (name, age) VALUES (?, ?)");/* 绑定参数 */$stmt->bind_param("si", $name, $age);/* 设置参数 */$name = "Tom";$age = 21;/* 执行查询 */$stmt->execute();/* 关闭预处理语句 */$stmt->close();/* 关闭连接 */$mysqli->close();?>

在上面的代码中,我们首先连接到了数据库,然后创建了一个预处理语句,该语句是对 users 表进行添加操作的 SQL 语句,其中使用了两个占位符,分别表示 name 和 age 参数。

接着,我们使用 bind_param 方法将变量 $name 和 $age 绑定到了占位符上,这里的第一个参数指定了要绑定的参数类型,si 表示 $name 是一个字符串,$age 是一个整数,这是由于占位符可以是不同的类型,我们需要在绑定时指定正确的参数类型。

最后,我们将变量 $name 和 $age 设置为对应的值,然后执行预处理语句。

从上面的代码可以看出,预处理语句确实比普通的 SQL 语句更加灵活和安全。那么,接下来我们再来看一下 mysqli 预处理的其他一些特性吧。

首先是参数绑定,我们在上面的例子中已经看到了如何绑定参数了。对于 mysqli 预处理来说,参数类型可以是以下几种:

  • b - 二进制数据
  • d - 双精度浮点数
  • i - 整数
  • s - 字符串

然后是查询结果的绑定,mysqli 预处理还支持将查询结果绑定到变量上,示例代码如下:

<?php$mysqli = new mysqli("localhost", "user", "password", "mydatabase");/* 检查连接是否成功 */if ($mysqli->connect_errno) {printf("连接失败: %s\n", $mysqli->connect_error);exit();}/* 创建预处理语句 */$stmt = $mysqli->prepare("SELECT name, age FROM users WHERE id=?");/* 绑定参数 */$stmt->bind_param("i", $id);/* 设置参数 */$id = 10;/* 绑定查询结果 */$stmt->bind_result($name, $age);/* 执行查询 */$stmt->execute();/* 获取查询结果 */$stmt->fetch();/* 输出查询结果 */printf("%s is %d years old.", $name, $age);/* 关闭预处理语句 */$stmt->close();/* 关闭连接 */$mysqli->close();?>

在上面的例子中,我们绑定了查询结果到变量 $name 和 $age 上,并在最后输出了查询结果。这里需要注意的是,我们在绑定查询结果时使用了 bind_result 方法,它可以将查询结果绑定到指定的变量上,以供后续操作使用。

最后,我们再来看一下 mysqli 预处理的批量操作功能,示例代码如下:

<?php$mysqli = new mysqli("localhost", "user", "password", "mydatabase");/* 检查连接是否成功 */if ($mysqli->connect_errno) {printf("连接失败: %s\n", $mysqli->connect_error);exit();}/* 创建预处理语句 */$stmt = $mysqli->prepare("INSERT INTO users (name, age) VALUES (?, ?)");/* 绑定参数 */$stmt->bind_param("si", $name, $age);/* 设置参数 */$users = array(array("Tom", 21),array("Alice", 22),array("Bob", 23));/* 执行批量添加 */foreach ($users as $user) {/* 设置参数 */$name = $user[0];$age = $user[1];/* 执行查询 */$stmt->execute();}/* 关闭预处理语句 */$stmt->close();/* 关闭连接 */$mysqli->close();?>

在上面的例子中,我们将插入操作进行了批量处理,具体实现是使用了 foreach 循环来遍历要添加的用户列表,然后依次对每个用户执行预处理语句。这里需要注意,预处理语句只需要创建一次,然后多次使用即可。

通过以上示例,我们可以看到 mysqli 预处理的功能非常强大,它可以有效的防止 SQL 注入攻击,大大提高了数据库操作的执行效率,同时还支持参数绑定、查询结果绑定以及批量操作等多种功能。

免责声明:本文内容来自用户上传并发布,站点仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。请核实广告和内容真实性,谨慎使用。

相关文章

抖音永久封禁什么时候可以登录

抖音系统提示账号被永久封禁,不能够再登录使用。抖音账号被永久封禁是无法解封的,可以尝试通过申诉解封,不过机会非常渺茫。抖音账号被封禁的主要原因是:色情低俗、侮辱谩骂、垃圾广告、造谣传谣、侵犯版权、内容...

闲鱼发货点错无需寄件了

闲鱼发货点错无需寄件了无法修改,可以通过留言告知买家正确的快递信息。快递运输流程信息用快递单号在快递网站上查询就可以了。没有特殊情况应该很容易查到。只要是正常发出,没有快递公司丢失,内盗等特殊情况,买...

钉钉视频怎么静音

钉钉视频静音只需要在视频界面点击麦克风图标就可以实现静音效果了,但是只是自己静音。 钉钉(DingTalk)是阿里巴巴集团专为中国企业打造的免费沟通和协同的多端平台,提供PC版,Web版,Mac版和手...

钉钉中途换设备会影响观看时长吗

钉钉切换设备会影响观看时长,切换了设备,时长会从最后那个设备的观看时间算起。钉钉(DingTalk)是中国领先的智能移动办公平台,由阿里巴巴集团开发,于2015年1月份正式上线。该平台免费提供给所有中...

万能钥匙没有蓝色钥匙怎么连接

万能钥匙没有蓝色钥匙无法连接,万能钥匙只能连接带有蓝色钥匙的WIFI,没有蓝色钥匙说名该用户没有共享WIFI密码,是无法进行连接的。若该加密Wi-Fi热点已共享,则可以使用万能钥匙进行连接使用;若该加...

探探注销了匹配的人会解除吗

探探注销后,匹配的人会自动解除。探探注销后,自己也会从对方列表里消失,但是对方不会知道自己是否注销了账号。探探是一个基于大数据智能推荐、全新互动模式的社交App。探探根据用户的个人资料、位置、兴趣爱好...