【问题标题】:How can I escape single quotes in this scenario? [duplicate]在这种情况下如何转义单引号? [复制]
【发布时间】:2013-02-22 16:36:05
【问题描述】:

我有一个页面,它对 api 进行 jquery 调用以接收多个维基百科 url。我那时 从 url 中提取文章名称(即从 http://en.wikipedia.org/science 等中获取 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 调用并获取多个 Wikipedia url,
  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!

【问题讨论】:

  • 你为什么要使用 JS 来逃避?你应该在 PHP 中转义
  • 您通过 URL 传递了一半的 SQL 语句?这听起来很糟糕,容易出错,而且完全是错误的。将 json 发送回 PHP,使用 json_encode/json_decode,并处理转义服务器端(例如,通过使用参数化查询)
  • @deceze 我在那里尝试了解决方案,但没有奏效。我在问题中添加了更多信息。
  • 我是否正确理解您的问题是,当您从客户端发送带有撇号的数据时,您的服务器端 SQL 查询会中断?然后你需要学会在服务器上正确地转义 SQL 查询。这不是客户的工作。

标签: php jquery mysql sql regex


【解决方案1】:

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

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

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

在 php 端,你可以使用 mysql_escape_string :

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

【讨论】:

    【解决方案2】:

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

    PHP 可能有一个用于转义 HTML 的内置功能,所以我建议在自己处理之前先查找它。

    【讨论】:

      猜你喜欢
      • 2013-07-17
      • 1970-01-01
      • 1970-01-01
      • 2018-12-16
      • 2013-04-21
      • 2013-04-23
      • 2011-08-08
      • 2017-09-12
      • 1970-01-01
      相关资源
      最近更新 更多