首页博客网络编程
使用 PHP PDO 和 MySQLi 准备语句:差异和示例
摘要 MySQLi 扩展和 PDO 都支持预处理语句。 此功能可降低应用程序对 SQL 注入的敏感度,并加快分析速度。 提前设置参数时,使用的带宽更少:您无需发送整个查询(剩下的就是指定值)。

更快地执行任务的方法之一是使用 PHP 准备语句。它们是用于发送查询或将数据上传到 SQL 数据库的模板。我们将讨论这些预准备语句以及 PHP 数据对象 (PHP PDO),它们提供了一个轻量级接口,专为访问数据库而设计。

使用 PDO 或 MySQLi,预准备语句提供了额外的安全层,因为值与查询分开发送到服务器。因此,组合的两个部分不会同时受到影响。

内容

PDO PHP 和 MySQLi:主要提示

  • PHP 预准备语句对 SQL 注入非常有用,并减少了解析时间。

  • 预设参数通过仅发送特定值而不是整个查询来减少所需的带宽。

  • PHP PDO和MySQLi都支持预准备语句。

准备好的参数如何工作

PHP 预准备语句分两个明确的阶段工作:

  • 准备:创建SQL语句模板并发送到数据库服务器进行解析。服务器完成此过程后,将检查语法、执行查询优化并存储语句。

  • 执行:稍后,您将参数值发送到服务器,服务器将获取它存储的模板。然后,服务器使用它收到的值创建一个语句。之后,执行该语句。

PHP PDO vs MySQLi:用法解释

当使用PHP准备语句时,无论你选择通过MySQLi扩展还是PHP PDO连接到数据库都不会有太大的区别。这两种连接类型都支持预准备语句,尽管编写脚本的方式存在一些差异。

MySQLi

请看下面的例子。请注意,它使用绑定参数和 PHP 准备语句向 MySQLi 发送查询:

复制

<?php
  $host = 'host';
  $user = 'user';
  $pass = 'pass';
  $db =  'db';  // Create connection
  $conn = new mysqli($host, $user, $pass, $db);  // Check connection
  if ($conn->connect_error) {    die("Failed to connect: " . $conn->connect_error); 
  }  // bind and prepare
  $stmt = $conn->prepare("INSERT INTO users (name, surname, email) VALUES (?, ?, ?)");
  $stmt->bind_param("sss", $name, $surname, $email);  // set parameters and execute
  $name = "John";
  $surname = "Doe";
  $email = "john@example.com";
  $stmt->execute();

  $name = "Mary";
  $surname = "Moe";
  $email = "mary@example.com";
  $stmt->execute();

  $name = "Julie";
  $surname = "Dooley";
  $email = "julie@example.com";
  $stmt->execute();  
  echo "Uploaded.";
  $stmt->close();  
  $conn->close();?>

让我们仔细看看上面示例中的这一特定行:

"INSERT INTO users (name, surname, email) VALUES (?, ?, ?)"

此语句中的问号 () 表示我们要上传的变量。?

接下来,让我们看看函数:bind_param()

$stmt->bind_param("sss", $name, $surname, $email);

  • 上面的函数将我们要使用的参数绑定到我们要发送的查询中,并通知数据库有关它们的信息。

  • 该部件指定可以分配给参数的数据类型。sss

  • s旨在定义特定参数只不过是一个字符串。

有四种可能的参数类型,每种都可以用一个特定的字母表示:

  • 整数 (i)

  • 双 (d)

  • 字符串 (s)

  • 斑点 (b)

为每个参数指定参数,因为确定数据库应预期的数据类型可将 SQL 注入的风险降至最低。

注意:如果我们想插入来自外部来源的任何数据(如用户输入),那么对数据进行清理和验证至关重要。

PHPpdo PDO是

下面的示例显示了如何为 PHP PDO 准备语句编写脚本:

复制

<?php
  $host = 'host';
  $user = 'user';
  $pass = 'pass';
  $db = 'db';  try {
    $conn = new PDO("mysql:host=$host;dbname=$db", $user, $pass);    // set error mode to exception
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);    //bind parameters and prepare sql
    $stmt = $conn->prepare("INSERT INTO users (name, surname, email) VALUES (:name, :surname, :email)");
    $stmt->bindParam(':name', $name);
    $stmt->bindParam(':surname', $surname);
    $stmt->bindParam(':email', $email); 
    // insert a row
    $name = "John";
    $surname = "Doe";
    $email = "john@example.com";
    $stmt->execute();    // insert another row
    $name = "Mary";
    $surname = "Moe";
    $email = "mary@example.com";
    $stmt->execute();    // insert another row
    $name = "Julie";
    $surname = "Dooley"; 	
    $email = "julie@example.com";
    $stmt->execute();    echo "New records created successfully";
  } catch(PDOException $e) {    echo "Error: " . $e->getMessage();
  }
  $conn = null;  
?>

PHP PDO和MySQLi:摘要

  • MySQLi 扩展和 PDO 都支持预处理语句。

  • 此功能可降低应用程序对 SQL 注入的敏感度,并加快分析速度。

  • 提前设置参数时,使用的带宽更少:您无需发送整个查询(剩下的就是指定值)。


声明提示:若要转载请务必保留原文链接,申明来源,谢谢合作!

本文链接:https://www.gaoxuejun173.top/blog/173

广告位

本文配乐
来说两句吧

该文章已禁止评论

最新评论

广告位