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