4

我有一个页面,它对 api 进行 jquery 调用以接收多个维基百科 url。然后我从 url 中提取文章名称(即sciencehttp://en.wikipedia.org/science等中获取),为每个添加单引号 ('),将它们串在一起,最后将它们发送到一个 php 页面,该页面进行 mysqlselect * 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. 进行 api 调用并获取多个 Wikipedia url,
  2. 从每个 url 获取文章名称,
  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, "\'")+"'";

但它没有用。有任何想法吗?

蒂亚!

4

2 回答 2

1

您不应该在客户端清理 SQL 查询,而应在服务器端清理。

如果您的服务器收到的请求是由您的 javascript 代码生成的,则它们可能会被正确转义,但是您无法控制(并且永远不会控制)如何从客户端发送请求。

例如:我可以在浏览器地址栏中显式键入一个 url,其中包含我认为合适的引号。

在 php 方面,您可以使用 mysql_escape_string :

<?
    $sanitized = array();
    foreach( $wikiPages as $page ){
        $sanitized[] = mysql_escape_string($page);
    }
    $values = "'".implode("','", $sanitized)."'";
于 2013-03-07T13:10:05.560 回答
0

因为它的 HTML 内容你应该能够替换'with的实例&quot;。然后它会在浏览器中正确显示,但在对需要执行相同替换的内容执行搜索时,您必须保持清醒(例如,“希克定律”作为搜索词将在WHERE子句语句中变为“希克定律” )。

PHP 可能具有用于转义 HTML 的内置功能,因此我建议您在自己处理之前先查找它。

于 2013-03-07T13:03:06.850 回答