【问题标题】:% creates syntax error in sql LIKE search for json_encode% 在 sql LIKE 搜索 json_encode 时创建语法错误
【发布时间】:2016-03-11 11:40:21
【问题描述】:

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

下面的代码是一个修改过的商店定位器脚本,它一切正常,直到我在 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 语句应该选择名称 'blue where I have written '%lue',因为它有匹配的搜索结果,但它会抛出错误。

希望这足够清晰和简洁!任何帮助表示赞赏!

【问题讨论】:

    标签: javascript php sql json sql-like


    【解决方案1】:

    首先,请敦促删除真的现在这样的东西:

    $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

    【讨论】:

    • 我知道我目前可能不是最安全的方式,但是当我同时学习如何编码时,我会加强安全性,一旦它全部启动并运行 - 欢呼!
    • 请同时考虑第一个元素(SQL 注入)。无论如何,这确实是一个大问题。编辑:嗯,好的。只是不要被“以后,永远不会”所困。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多