gpt4 book ai didi

php - mysqli_real_escape_string 使用环境

转载 作者:行者123 更新时间:2023-11-29 05:38:25 30 4
gpt4 key购买 nike

我在 php 中使用 mysqli 扩展来连接数据库。我有一个如此简单的问题。使用 mysqli 而不是 mysql 更好吗?为什么有必要使用 mysqli_real_escape_string ?这个功能到底在做什么?谢谢...

最佳答案

我将举一个不使用 SQL 的小例子。假设您有以下 PHP 代码:

<?php
echo 'Hello, world!';

现在你想用 O'Hara 替换 world:

<?php
echo 'Hello, O'Hara!'; // Parse error: syntax error, unexpected T_STRING, expecting ',' or ';'

是的,当然,那不是有效的 PHP。您需要转义单引号,因为它被解释为文字引号而不是字符串定界符:

<?php
echo 'Hello, O\'Hara!';

您在编写 SQL 查询时遇到了完全相同的问题。如果您将随机输入注入(inject)您的代码,它迟早会崩溃。您需要对输入进行编码,以便将其作为文字输入处理,而不是损坏的代码。

你怎么做到的?好吧,MySQL 就像 PHP 一样接受 \'(尽管这只是巧合:其他数据库引擎使用其他转义方法)。所以最愚蠢的解决方案是在此处和此处添加反斜杠:

SELECT id FROM user WHERE name='O\'Hara';

当然,对所有需要转义的可能字符进行硬编码(您可能会忘记其中的一些字符)需要大量工作,因此您可以使用一个函数来完成这项工作: mysql_real_escape_string()mysqli_real_escape_string()

问题是:这够好吗?好吧,它有点管用,但它会导致难以维护的恼人代码:

$sql = "UPDATE user SET name='" . mysql_real_escape_string($name) . "' WHERE id='" . mysql_real_escape_string($id) . "'";

...而且您仍然需要用单引号将完整值括起来...这并不总是强制性的(想想数字)...真是一团糟。有人不能发明更好的东西吗?好消息是:他们做到了!它被称为准备好的语句:

// Just an example, I invented the syntax
$sql = 'UPDATE user SET name=:name WHERE id=:id';
$params = array(
'name' => "O'Brian",
'id' => 31416,
);
$MyDbConnection->execute($sql, $params);

现实生活中:

  • MySQLi 有 prepare() 方法来完成这个。 Find some examples there .
  • 旧版 MySQL 扩展……什么都没有:它根本不支持准备好的语句!如果您使用此扩展程序,您将受困于烦人的自行添加引号和字符串连接方法。

我希望这能解释整个问题。

关于php - mysqli_real_escape_string 使用环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8741585/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com