【问题标题】:In PHP, how can I escape single quotes in my string before inserting into a MySQL table?在 PHP 中,如何在插入 MySQL 表之前转义字符串中的单引号?
【发布时间】:2011-12-07 16:22:30
【问题描述】:

我有很多文本要使用 PHP 插入到 MySQL 表中。部分文字看起来像这个例子:

Yes, this is 'great'!

要将其填充到 SQL 语句中,我需要转义 '

我正在使用 ereg-replace $text=mb_ereg_replace("'","\\'", $text); 来完成以下工作:

$sql="insert into mytable (msg) values ('".$text."')";

现在我发现还有另一种文本样式,我必须将这样的内容保存到 MySQL:

As you can see the \' world\' is a "disc"!

所以我尝试像这样添加更多 mb_ereg_replace:

$text=mb_ereg_replace("'","\\'", $text);
$text=mb_ereg_replace("\\","\\\\", $text);

但这不起作用,我只是收到错误消息:PHP Warning: mb_ereg_replace(): mbregex compile err: end pattern at escape in [...]

这是什么原因造成的?我可能犯了一些错误,但找不到它!

感谢您的任何帮助。

【问题讨论】:

  • 我正在使用mb_ereg_replace。看起来,这并没有被弃用:php.net/manual/en/function.mb-ereg-replace.php 问题是,不存在preg_replace 的多字节版本,如mb_preg_replace()。所以看起来mb_ereg_replace 是在正则表达式上使用多字节(UTF-8)字符串进行搜索/替换的唯一方法!?
  • 是的,您可以使用preg_replace -- 您可以使用u 开关在preg_xx 函数中启用UTF-8。请参阅regular-expressions.info/php.html 了解更多信息。
  • 哦,谢谢!如果 php.net 的 preg_replace 文档页面有任何提示,那将很有帮助,谢谢! :-)
  • 你是对的;这是我能想到的 PHP 文档不是很好的一个领域。它们通常都很好。

标签: php mysql regex replace


【解决方案1】:

有一个更好的方法,您再也不用担心您的字符串会再次转义。在mysqliPDO 中使用准备好的语句都将使大型查询(具有多行的查询)运行得更快,它们是安全的,您不必担心(大多数类型的)SQL 注入并且它们很容易学习。字符串将按原样被接受到您的数据库中,而不会破坏您的代码。

这是mysqli 的示例:

$conn = new mysqli($servername, $username, $password, $dbname);

$stmt = $conn->prepare("INSERT INTO table (columnname) VALUES (?)");
$stmt->bind_param("s", $text);
$stmt->execute();
$stmt->close();

基本上,通过在进入之前绑定参数,它只接受你创建它的任何字符串,并且不需要转义任何东西。'

使用 PDO 也是如此。这基本上做同样的事情,但具有使用多种不同数据库类型(例如 Oracle 或 PostgreSQL)的优势,并且由于关联的类,它还可以进行一些漂亮的修改。

    try {
        $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
        // set the PDO error mode to exception
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        $stmt = $conn->prepare("INSERT INTO table (columname)
        VALUES (:text)");
        $stmt->bindParam(':text', $text);
        $stmt->execute();
    catch(PDOException $e)
        {
        echo "Oops, didn't work: " . $e->getMessage();
        }
    $conn = null;

【讨论】:

    【解决方案2】:

    使用mysql_real_escape_string 转义您的字符串。

    $text = mysql_real_escape_string($text);
    

    或者更好的是,使用 PDO 和参数化查询。

    【讨论】:

    • 哦,是的,就是这样!这很简单,但是这个功能对我来说绝对是新的!谢谢!!
    • 由于您对 PHP 比较陌生,强烈建议您了解一些较新的方法。尽量避免使用 mysql_ 函数,因为它们已被弃用(这意味着它们将消失,并且由于某些非常好的原因,它们很快将完全不起作用)。你可以用mysqli_ 做同样的事情。这些也接受准备好的语句,并且是一个很好且简单的过渡。 :) 请参阅下面的示例,它既可以解决您的问题,也可以解决很多其他问题。
    猜你喜欢
    • 2023-04-02
    • 2011-02-10
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多