2013-03-07 18 views
3

我有一個頁面,使aqui jquery調用接收多個維基百科網址。然後我從 從url中提取文章名稱(即從http://en.wikipedia.org/science等獲得science),爲每個單詞添加單引號('),將它們串在一起並最終將它們發送到一個php頁面,這會使得調用mysql select * from MyTable where title in('name1','name2','name3','name4')。當文章名稱中有單引號(即「希克定律」)時,就會出現問題,因爲它打破了單引號。下面是我使用的代碼:如何在此場景中轉義單引號?

$.getJSON('http://ajax.googleapis.com/ajax/services/search/web?q=keyword site:en.wikipedia.org&rsz=8&v=1.0&callback=?', 
       function (r) { 
       var urls1=""; 
       $.each(r.responseData.results, function(i, item) { 
       var thisurl = (i==0) ? "'" + item.url.substring(item.url.lastIndexOf('/') + 1) + "'" : ",'" + item.url.substring(item.url.lastIndexOf('/') + 1) + "'"; 
       urls1 += thisurl.replace(/_/g,'%20'); 

});}); 
$('#quotes').html($('<div>').load('pr.php?s='+urls1 +' #quotes', function() {} 

我加入了單引號的文章的名稱,以便該字符串應該是所有準備去mysql的where in

因此,要回顧一下,步驟如下:

  1. 調用API,並得到多個維基百科的網址,
  2. 從每個網址,以獲取文章的名字,
  3. 將它們添加到urls1串同時用空格替換下劃線
  4. 通過ajax發送urls1字符串到pr.php頁面。
  5. 在pr.php我做了以下內容:"SELECT * FROM MyTable WHERE title in".$_GET['s']

我想這樣做mysql_real_escape_string($_GET['s']),但沒有奏效。

我現在試圖轉義文章名稱內的任何單引號,因此where in不會中斷,但它不起作用。我試圖改變上述

var thisurl=(i==0) ? "'"+item.url.substring(item.url.lastIndexOf('/') + 1).replace(/'/g, "\'")+"'":",'"+item.url.substring(item.url.lastIndexOf('/') + 1).replace(/'/g, "\'")+"'"; 

但它沒有奏效。有任何想法嗎?

TIA!

+1

[大逃避現實(或:你需要知道的工作,文本中的文字)](HTTP:// kunststube。淨/逃避現實/) – deceze 2013-03-07 13:01:29

+1

你爲什麼試圖逃避使用JS?你應該用PHP轉義 – JamesHalsall 2013-03-07 13:01:41

+1

你通過一個URL傳遞了一半的SQL語句嗎?聽起來很糟糕,容易出錯,而且顯然是錯誤的。發送json返回到PHP,使用json_encode/json_decode,並處理轉義的服務器端(例如通過使用參數化查詢) – Mahn 2013-03-07 13:05:36

回答

0

由於它的HTML內容,您應該能夠用&quot;替換'的實例。然後,它將在瀏覽器中正確顯示,但在對內容執行搜索時,您必須保持認知,您將需要執行相同的替換(例如,「希克定律」作爲搜索詞將成爲WHERE條款中的「Hick " s law」聲明)。

PHP可能有一個內置的轉義HTML,所以我建議你在處理這個之前自己去尋找。

1

您不應該在客戶端,而是在服務器端清理SQL查詢。

如果您的服務器收到的請求是由您的JavaScript代碼生成的,則您的服務器收到的請求可能會被正確地轉義,但是您無法控制(並且永遠不會)如何從客戶端發送請求。

例如:我可以在我的瀏覽器地址欄中顯式地鍵入一個包含儘可能多的引號的url,因爲我認爲合適。

在PHP端,你可以使用函數mysql_escape_string:

<? 
    $sanitized = array(); 
    foreach($wikiPages as $page){ 
     $sanitized[] = mysql_escape_string($page); 
    } 
    $values = "'".implode("','", $sanitized)."'";