如何在此方案中转义单引号?

时间:2013-03-07 12:58:19

标签: php jquery mysql sql regex

我有一个页面,它对一个api进行jquery调用,以接收多个维基百科网址。然后我 从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. 拨打api电话并获取多个维基百科网址
  2. 从每个网址获取文章名称
  3. urls1字符串添加到urls1字符串,同时用空格替换下划线
  4. 通过ajax将"SELECT * FROM MyTable WHERE title in".$_GET['s']字符串发送到pr.php页面。
  5. 在pr.php中,我执行以下操作:mysql_real_escape_string($_GET['s'])
  6. 我尝试过where in,但这不起作用。

    我现在正试图逃避文章名称中的任何单引号,因此var thisurl=(i==0) ? "'"+item.url.substring(item.url.lastIndexOf('/') + 1).replace(/'/g, "\'")+"'":",'"+item.url.substring(item.url.lastIndexOf('/') + 1).replace(/'/g, "\'")+"'"; 不会中断,但它不起作用。我尝试将上面改为

    {{1}}

    但它没有用。有什么想法吗?

    TIA!

2 个答案:

答案 0 :(得分:1)

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

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

例如:我可以在浏览器地址栏中显式输入一个网址,其中包含我认为合适的报价。

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

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

答案 1 :(得分:0)

因为它的HTML内容,您应该能够用'替换&quot;的实例。然后它将在浏览器中正确显示,但是当您执行搜索时需要执行相同替换所需的内容时,您必须保持认知(例如,“希克定律”作为搜索词将成为{Hick's law in the {{ 1}}子句声明)。

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