簡體   English   中英

在PHP中,如何在插入MySQL表之前轉義字符串中的單引號?

[英]In PHP, how can I escape single quotes in my string before inserting into a MySQL table?

我有很多文本可以使用PHP插入MySQL表中。 文本的一部分類似於以下示例:

Yes, this is 'great'!

要將其填充到SQL語句中,我需要對'進行轉義。

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

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

現在,我發現還有另一種文本樣式,必須在其中保存如下內容:

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 [...]

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

謝謝您的幫助。

使用mysql_real_escape_string轉義您的字符串。

$text = mysql_real_escape_string($text);

更好的是使用PDO和參數化查詢。

有一種更好的方法,您無需擔心再次逃脫字符串的麻煩。 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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM