%在sql中创建语法错误LIKE搜索json_encode

时间:2016-03-11 11:40:22

标签: javascript php sql json sql-like

好的,所以我通常会搜索和搜索,直到找到解决方案,但我认为这是我的第一个任务。让我们希望它不是一个愚蠢的错误!这是我的第一篇文章...

下面的代码是一个修改过的商店定位器脚本,它一直正常,直到我在sql语句的LIKE部分添加%符号。当它不存在时,我可以从LIKE语句中获得精确的搜索结果,所以我知道所有其余的代码都没问题但是只要我添加%符号就会收到错误消息。

哪些人出了问题?!

<?php

header('Access-Control-Allow-Origin: *');

$con = mysqli_connect("$host","$user","$password","$db");
if (!$con) {
die('Could not connect: ' . mysqli_error($con));
}

mysqli_select_db($con,"sakila");

// Get parameters
$mlat = $_POST["lat"];
$mlng = $_POST["lng"];
$radius = $_POST["radius"];
$gamename = $_POST["gamename"];
$idGames2 = $_POST["idGames2"];
$matchtype2 = $_POST["matchtype2"]; 


// Search the rows in the markers table
//change 3959 to 6371 for distance in KM
$sql = sprintf("SELECT (ignore this there's lots of requested collumns), 
lat, lng, ( 3959 * acos( cos( radians('%s') ) * cos( radians( lat ) ) * cos( radians( lng ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( lat ) ) ) ) 
AS distance FROM games WHERE name LIKE '%lue' AND matchtype=$matchtype2 HAVING distance < '%s' ORDER BY distance LIMIT 0 , 20 ",
  mysqli_real_escape_string($con,$mlat),
  mysqli_real_escape_string($con,$mlng),
  mysqli_real_escape_string($con,$mlat),
  mysqli_real_escape_string($con,$radius));

$result = mysqli_query($con,$sql);
$rows = array();
while($r = mysqli_fetch_assoc($result)) {
    $rows[] = $r;
}
mysqli_close($con); 

echo json_encode($rows);
?>

LIKE语句应该选择我写过的名字&#39;%lue&#39;因为它有匹配的搜索结果,但它会引发错误。

希望这个简洁明了!任何帮助表示赞赏!!

1 个答案:

答案 0 :(得分:0)

首先,请立即删除这样的事情:

$matchtype2 = $_POST["matchtype2"];
sprintf("SELECT (ignore this there's lots of requested collumns), lat, lng, ( 3959 * acos( cos( radians('%s') ) * cos( radians( lat ) ) * cos( radians( lng ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( lat ) ) ) ) AS distance FROM games WHERE name LIKE '%lue' AND matchtype=$matchtype2 HAVING distance < '%s' ORDER BY distance LIMIT 0 , 20 ",

从外部源(例如$ _POST)注入直接变量是打开系统的方式,也称为...... SQL注入。

所以

你在那里使用sprintf,可能用你的值替换%s。这可能是一个好主意,但这意味着您不能再使用“%”了。 所以,你可以按照自己的意愿逃避它,或者不要使用sprintf。

我强烈建议您在准备好的语句中使用参数绑定,这对于参数和安全性都会有很大的帮助。

例如,对于一个好的DB类(PDO),我们可以这样做:

$sql = "SELECT (ignore this there's lots of requested collumns), lat, lng, ( 3959 * acos( cos( radians(:d1) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(:d2) ) + sin( radians(:d3) ) * sin( radians( lat ) ) ) ) AS distance FROM games WHERE name LIKE  AND matchtype=:matchType HAVING distance < :distance ORDER BY distance LIMIT 0 , 20 "
$db->query($sql, array(
    'd1' => $d1,
    'd2' => $d2,
    'd3' => $d3,
    'matchType' => $_REQUEST['matchType'],
    'distance' => $dist
));

编辑:仅供参考,通过加倍%符号来执行sprintf中的%; %% 在PHP文档中查看更多信息(我们最好的朋友):http://php.net/sprintf