admin 发表于 2023-2-16 18:54:45

PHP MySQL 预处理语句

<div id="article_content" class="article_content clearfix">
      <link rel="stylesheet" href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/editerView/kdoc_html_views-1a98987dfd.css">
      <link rel="stylesheet" href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/editerView/ck_htmledit_views-6e43165c0a.css">
                <div id="content_views" class="htmledit_views">
                  <h2>预处理语句及绑定参数</h2>
<p>预处理语句用于执行多个相同的 SQL 语句&#xff0c;并且执行效率更高。</p>
<p>预处理语句的工作原理如下&#xff1a;</p>
<ol><li> <p>预处理&#xff1a;创建 SQL 语句模板并发送到数据库。预留的值使用参数 &#34;?&#34; 标记 。例如&#xff1a;</p> <pre>INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)</pre> </li><li> <p>数据库解析&#xff0c;编译&#xff0c;对SQL语句模板执行查询优化&#xff0c;并存储结果不输出。</p> </li><li> <p>执行&#xff1a;最后&#xff0c;将应用绑定的值传递给参数&#xff08;&#34;?&#34; 标记&#xff09;&#xff0c;数据库执行语句。应用可以多次执行语句&#xff0c;如果参数的值不一样。</p> </li></ol>
<p>相比于直接执行SQL语句&#xff0c;预处理语句有两个主要优点&#xff1a;</p>
<ul><li> <p>预处理语句大大减少了分析时间&#xff0c;只做了一次查询&#xff08;虽然语句多次执行&#xff09;。</p> </li><li> <p>绑定参数减少了服务器带宽&#xff0c;你只需要发送查询的参数&#xff0c;而不是整个语句。</p> </li><li> <p>预处理语句针对SQL注入是非常有用的&#xff0c;因为参数值发送后使用不同的协议&#xff0c;保证了数据的合法性。</p> </li></ul>
<hr>
<h2>MySQLi 预处理语句</h2>
<p>以下实例在 MySQLi 中使用了预处理语句&#xff0c;并绑定了相应的参数:</p>
<h2>实例 (MySQLi 使用预处理语句)</h2>
<p><?php $servername &#61; &#34;localhost&#34;; $username &#61; &#34;username&#34;; $password &#61; &#34;password&#34;; $dbname &#61; &#34;myDB&#34;; // 创建连接 $conn &#61; new mysqli($servername, $username, $password, $dbname); // 检测连接 if ($conn->connect_error) { die(&#34;连接失败: &#34; . $conn->connect_error); } // 预处理及绑定 $stmt &#61; $conn->prepare(&#34;INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)&#34;); $stmt->bind_param(&#34;sss&#34;, $firstname, $lastname, $email); // 设置参数并执行 $firstname &#61; &#34;John&#34;; $lastname &#61; &#34;Doe&#34;; $email &#61; &#34;john&#64;example.com&#34;; $stmt->execute(); $firstname &#61; &#34;Mary&#34;; $lastname &#61; &#34;Moe&#34;; $email &#61; &#34;mary&#64;example.com&#34;; $stmt->execute(); $firstname &#61; &#34;Julie&#34;; $lastname &#61; &#34;Dooley&#34;; $email &#61; &#34;julie&#64;example.com&#34;; $stmt->execute(); echo &#34;新记录插入成功&#34;; $stmt->close(); $conn->close(); ?></p>
<p></p>
<p>解析以下实例的每行代码:</p>
<p>&#34;INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)&#34;</p>
<p>在 SQL 语句中&#xff0c;我们使用了问号 (?)&#xff0c;在此我们可以将问号替换为整型&#xff0c;字符串&#xff0c;双精度浮点型和布尔值。</p>
<p>接下来&#xff0c;让我们来看下 bind_param() 函数&#xff1a;</p>
<p>$stmt->bind_param(&#34;sss&#34;, $firstname, $lastname, $email);</p>
<p>该函数绑定了 SQL 的参数&#xff0c;且告诉数据库参数的值。 &#34;sss&#34; 参数列处理其余参数的数据类型。s 字符告诉数据库该参数为字符串。</p>
<p>参数有以下四种类型:</p>
<ul><li>i - integer&#xff08;整型&#xff09;</li><li>d - double&#xff08;双精度浮点型&#xff09;</li><li>s - string&#xff08;字符串&#xff09;</li><li>b - BLOB&#xff08;binary large object:二进制大对象&#xff09;</li></ul>
<p>每个参数都需要指定类型。</p>
<p>通过告诉数据库参数的数据类型&#xff0c;可以降低 SQL 注入的风险。</p>
<table><tbody><tr><th> <p style="text-align:center;"></p> </th><td><strong>注意&#xff1a;</strong> 如果你想插入其他数据&#xff08;用户输入&#xff09;&#xff0c;对数据的验证是非常重要的。</td></tr></tbody></table>
<p></p>
<hr>
<h2>PDO 中的预处理语句</h2>
<p>以下实例我们在 PDO 中使用了预处理语句并绑定参数:</p>
<h2>实例 (PDO 使用预处理语句)</h2>
<p><?php $servername &#61; &#34;localhost&#34;; $username &#61; &#34;username&#34;; $password &#61; &#34;password&#34;; $dbname &#61; &#34;myDBPDO&#34;; try { $conn &#61; new PDO(&#34;mysql:host&#61;$servername;dbname&#61;$dbname&#34;, $username, $password); // 设置 PDO 错误模式为异常 $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 预处理 SQL 并绑定参数 $stmt &#61; $conn->prepare(&#34;INSERT INTO MyGuests (firstname, lastname, email) VALUES (:firstname, :lastname, :email)&#34;); $stmt->bindParam(':firstname', $firstname); $stmt->bindParam(':lastname', $lastname); $stmt->bindParam(':email', $email); // 插入行 $firstname &#61; &#34;John&#34;; $lastname &#61; &#34;Doe&#34;; $email &#61; &#34;john&#64;example.com&#34;; $stmt->execute(); // 插入其他行 $firstname &#61; &#34;Mary&#34;; $lastname &#61; &#34;Moe&#34;; $email &#61; &#34;mary&#64;example.com&#34;; $stmt->execute(); // 插入其他行 $firstname &#61; &#34;Julie&#34;; $lastname &#61; &#34;Dooley&#34;; $email &#61; &#34;julie&#64;example.com&#34;; $stmt->execute(); echo &#34;新记录插入成功&#34;; } catch(PDOException $e) { echo &#34;Error: &#34; . $e->getMessage(); } $conn &#61; null; ?></p>
<p> </p>
                </div>
      </div>
      <div id="treeSkill"></div>
页: [1]
查看完整版本: PHP MySQL 预处理语句