在这种情况下如何转义单引号? [复制]
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 内容,您应该能够将 '
的实例替换为 &quot;
。然后它会在浏览器中正确显示,但在对需要执行相同替换的内容执行搜索时,您必须保持清醒(例如,“希克定律”作为搜索词在@987654323 中将变为“希克定律” @ 子句声明)。
PHP 可能有一个用于转义 HTML 的内置功能,所以我建议在自己处理之前先查找它。
【讨论】:
以上是关于在这种情况下如何转义单引号? [复制]的主要内容,如果未能解决你的问题,请参考以下文章