2012-12-11 74 views
-5

我有一個奇怪的問題。PHP mysql_real_escape_string沒有按預期工作

我有一個表有一個標題字段。
我使用mysql_real_escape_string將值插入此標題字段。使用單引號插入工作正常。
我做一個選擇使用標題where子句中提交如下

SELECT * FROM table WHERE title=mysql_real_escape_string(Girish's Photo); 

該查詢返回空結果,甚至當我吉里什插入的圖片設置其他一些地方。

----編輯把這個使用一些代碼

$photo_title=mysql_real_escape_string($_POST[photo_title]);<br/> 
$sql = "INSERT INTO photos values($id,'$photo_title');<br/> 

從我已插入吉里什的照片到PHOTO_TITLE的形式。它運行良好。
... .. ..

然後在PHP

$title="Girish's Photo"; 
$sql = "SELECT photo_id,photo_title FROM photos WHERE photo_title ='" . mysql_real_escape_string($title)."'" ; 

但這查詢返回結果爲空其他一些地方。

使用phpMyAdmin,如果我嘗試運行上述查詢..結果爲空。如果我瀏覽表格,我會看到值Girish的照片
現在,如果我在phpMyAdmin上運行查詢,將where子句替換爲where photo_title ='Girish \''Photo'我正在獲取該記錄。

+5

mysql_real_escape_string是一個PHP函數 –

+3

你的問題是有線的?這真的很奇怪。 –

+0

如上所述。要在php腳本中使用它,你可以使用$ query =「select * from table where title ='」。mysql_real_escape_string(「Girish's Photo」)。「'」; – Kickstart

回答

0

我最近已經有類似的問題,我用htmlentites()代替mysql_real_escape_string()解決檢查出來的the manualw3 schools

編輯:這是一個有效的答案,因爲他是在第一時間錯誤的環境中使用mysql_real_escape_string() 。如果你看了這個問題,他正在逃避FILENAME,因此他沒有注射風險。如果你要downvote至少說爲什麼..

+0

無論他逃跑什麼都不重要,它重要的是他逃避的背景。對於SQL上下文,您總是使用SQL函數進行轉義。見http://kunststube.net/escapism。 – deceze

+0

touche,謝謝你的鏈接 –

1

mysql_real_escape_string()是一個PHP函數,應使用如下:

"SELECT * FROM table WHERE title='".mysql_real_escape_string("Girish's Photo")."'"; 

然而,這是不好的做法。

3
$data = "Girish's Photo"; 

    $query = "SELECT * FROM table WHERE title='".mysql_real_escape_string($data)."'"; 
0

好了,你會想用PDO所有查詢。主要由於以下原因:

  1. mysql_ *已被棄用。
  2. SQL注入不安全。
  3. PDO能夠訪問大量數據庫引擎,使其更加靈活,無需更改API。

請看看這篇文章,看看如何使用PDO發佈SELECT。

Parameterized SELECT queries via PDO?

+1

PDO是不安全的SQL注入**如果使用不當**。如果使用正確的話,mysql_API對於SQL注入是完全安全的。 – deceze

+0

他沒有注射風險,這是一個已經存在於數據庫中的文件名,他只是在報價方面有問題。 –

+0

@deceze,你可以編輯**我的答案,並告訴我如何使用* mysql_ * API來防止SQL注入?此外,不會指出第一個基本上是不使用該API的最主要原因? –

0

在數據庫中的值應該包含反斜槓。這就是爲什麼你的查詢不符合Girish's Photo不符合Girish\'s Photo。聽起來像你是magic quotes的受害者。閱讀the manual並擺脫它們。