2011-10-14 38 views
0

我有很多文本要插入到使用PHP的MySQL表中。部分文字是這樣的例子:在PHP中,在插入到MySQL表之前,如何在我的字符串中轉義單引號?

Yes, this is 'great'! 

爲了填補這一成的SQL語句,我需要逃避'

我使用額日格替換$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 [...]

這是什麼原因造成的?我可能犯了一些錯誤,但無法找到它!

謝謝你的任何幫助。

+0

我正在使用'mb_ereg_replace'。它看起來像,這不是廢棄:http://www.php.net/manual/en/function.mb-ereg-replace.php問題是,不存在多字節版本的'preg_replace',像'mb_preg_replace()'。所以它看起來像'mb_ereg_replace'是使用正則表達式搜索/替換使用多字節(UTF-8)字符串的唯一方式!? –

+1

是的,您可以使用'preg_replace' - 您可以使用'u'開關在'preg_xx'函數中啓用UTF-8。有關更多信息,請參閱http://www.regular-expressions.info/php.html。 – Spudley

+0

哦,謝謝!如果在php.net的preg_replace文檔頁面上有任何提示,那將會很有幫助謝謝! :-) –

回答

2

使用mysql_real_escape_string來逃避你的字符串。

$text = mysql_real_escape_string($text); 

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

+0

當然,他沒有指定他正在使用哪個SQL ... – Spudley

+0

噢,就是這樣!這很容易,但這個功能對我來說絕對是新的!謝謝!! –

+0

由於您在PHP方面相對較新,因此強烈建議您瞭解一些較新的方法。嘗試並避免使用'mysql_'函數,因爲它們已被棄用(意味着它們正在消失,並且由於某些非常好的原因很快就不會工作)。你可以用'mysqli_'做同樣的事情。這些也接受準備好的陳述,並且是一個不錯的和容易的過渡:)見下面的例子,這將解決你的問題和其他一些問題。 – nomistic

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(); 

Basicallly,由它去之前綁定的參數,它只是接受任何字符串創建它,而且也沒有必要逃避任何東西的方式。

以下是使用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; 
相關問題