在这种情况下如何转义单引号? [复制]

Posted

技术标签:

【中文标题】在这种情况下如何转义单引号? [复制]【英文标题】: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

总结一下,步骤如下:

    进行 api 调用并获取多个 Wikipedia url, 从每个网址获取文章名称, 将它们添加到urls1 字符串中,同时用空格替换下划线 通过 ajax 将urls1 字符串发送到 pr.php 页面。 在 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!

【问题讨论】:

The Great Escapism (Or: What You Need To Know To Work With Text Within Text) 你为什么要使用 JS 来逃避?你应该在 PHP 中转义 您通过 URL 传递了一半的 SQL 语句?这听起来很糟糕,容易出错,而且完全是错误的。将 json 发送回 PHP,使用 json_encode/json_decode,并处理转义服务器端(例如,通过使用参数化查询) @deceze 我在那里尝试了解决方案,但没有奏效。我在问题中添加了更多信息。 我是否正确理解您的问题是,当您从客户端发送带有撇号的数据时,您的服务器端 SQL 查询会中断?然后你需要学会在服务器上正确地转义 SQL 查询。这不是客户的工作。 【参考方案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 的内置功能,所以我建议在自己处理之前先查找它。

【讨论】:

以上是关于在这种情况下如何转义单引号? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Oracle中的单引号怎么转义

使用/解析远程变量时如何正确转义单引号? [复制]

如何在oracle中插入含有半角单引号'的字符串

单引号内双引号内转义单引号[重复]

JavaScript 函数参数中的单引号转义

jshtml中的单引号双引号及其转义使用