我有一个页面,它对一个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
。
回顾一下,步骤如下:
urls1
字符串添加到urls1
字符串,同时用空格替换下划线"SELECT * FROM MyTable WHERE title in".$_GET['s']
字符串发送到pr.php页面。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, "\'")+"'";
不会中断,但它不起作用。我尝试将上面改为
{{1}}
但它没有用。有什么想法吗?
TIA!
答案 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内容,您应该能够用'
替换"
的实例。然后它将在浏览器中正确显示,但是当您执行搜索时需要执行相同替换所需的内容时,您必须保持认知(例如,“希克定律”作为搜索词将成为{Hick's law in the {{ 1}}子句声明)。
PHP可能有内置的转义HTML,因此我建议您在自己处理之前先查找它。