在PHP中,如何在插入MySQL表之前转义字符串中的单引号?

时间:2011-10-14 11:11:25

标签: php mysql regex replace

我有很多文本要使用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 [...]

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

感谢您提供任何帮助。

2 个答案:

答案 0 :(得分:2)

使用mysql_real_escape_string来逃避字符串。

$text = mysql_real_escape_string($text);

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

答案 1 :(得分: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;