2013-03-07 5 views
3

У меня есть страница, которая вызывает jquery-вызов api для получения нескольких URL-адресов википедии. Затем я получаю имена статей из URL-адреса (т. Е. Получаю science от http://en.wikipedia.org/science и т. Д.), Добавляйте одинарные кавычки (') к каждому из них, стройте их вместе и, наконец, отправляйте их на страницу php, что вызывает вызов mysql select * from MyTable where title in('name1','name2','name3','name4'). Проблема возникает, когда название статьи уже содержит в себе одну цитату (т. Е. Закон Хика), поскольку она разбивает одинарные кавычки where in. Вот код, я использую:Как избежать одиночных кавычек в этом сценарии?

$.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. сделать вызов апи и получить несколько адресов Википедии,
  2. получить название статьи из каждого URL,
  3. добавить их в urls1 строку при замене символов подчеркивания пробелами
  4. отправьте строку urls1 через ajax на страницу 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

[The Great эскапизма (Или: Что нужно знать, чтобы работать с текстом в тексте)] (HTTP: // kunststube.net/escapism /) – deceze

+1

Почему вы пытаетесь убежать с помощью JS? вам следует скрыться в PHP – JamesHalsall

+1

Вы передаете половину инструкции SQL через URL-адрес? это звучит ужасно, подвержено ошибкам и просто неправильно. Отправьте json обратно на PHP, используйте json_encode/json_decode и обработайте экранирующую сторону сервера (например, используя параметризованные запросы) – Mahn

ответ

0

Из-за его содержимого HTML вы можете заменить экземпляры ' на &quot;. Затем он будет корректно отображаться в браузере, но вы должны оставаться осведомленным при выполнении поиска в отношении содержимого, которое вам нужно будет выполнить для той же подстановки (например, «закон Хика» в качестве поискового термина станет «Hick " s law» в предложении WHERE заявление).

PHP, вероятно, имеет встроенный механизм для экранирования HTML, поэтому я рекомендую его найти, прежде чем обращаться с этим самостоятельно.

1

Вы не должны дезактивировать SQL-запросы на стороне клиента, а на стороне сервера.

Запросы, полученные вашим сервером, могут быть правильно экранированы, если они были созданы кодом javascript, но у вас нет контроля (и никогда не будет) по тому, как запрос отправляется от клиента.

Например: я могу явно ввести URL-адрес в адресной строке браузера, содержащий столько котировок, сколько бы я счел нужным.

На стороне PHP, вы можете использовать mysql_escape_string:

<? 
    $sanitized = array(); 
    foreach($wikiPages as $page){ 
     $sanitized[] = mysql_escape_string($page); 
    } 
    $values = "'".implode("','", $sanitized)."'"; 
Смежные вопросы