好的,所以我通常会搜索和搜索,直到找到解决方案,但我认为这是我的第一个任务。让我们希望它不是一个愚蠢的错误!这是我的第一篇文章...
下面的代码是一个修改过的商店定位器脚本,它一直正常,直到我在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;因为它有匹配的搜索结果,但它会引发错误。
希望这个简洁明了!任何帮助表示赞赏!!
答案 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