【问题标题】:Application Error "SQLSTATE[42000]"应用程序错误“SQLSTATE [42000]”
【发布时间】:2016-04-08 07:06:16
【问题描述】:

我构建了restful API及其工作,但是当我尝试将参数传递给链接时,下面显示错误,尽管当我打印参数时结果是正确的!

详情

类型:PDOException

代码:42000

消息:SQLSTATE[42000]:语法错误或访问冲突:1064 You 您的 SQL 语法有错误;检查对应的手册 您的 MySQL 服务器版本,以便在 'where 附近使用正确的语法 Journal_name like 'Abhinav%' AND is_reported=1' 在第 1 行

文件:...路径/index.php

行:15

第 15 行是“$stmt = $db->query($sql);”

index.php

<?php

// index.php 

require 'confing.php';
require 'Slim/Slim.php';
\Slim\Slim::registerAutoloader();
$app = new \Slim\Slim();

$app->get('/rout', function() use ($app) {
    $db =getDB();
        $title = $app->request()->params('title');
        // echo 'title ='. $tilte print the correct title name get it by link
    $sql = "SELECT J_name FROM J where where `J_name` like '".$title."%' AND is_reported=1;";
    $stmt = $db->query($sql); 
    $pre = $stmt->fetchAll(PDO::FETCH_OBJ);
        $sql2 = "SELECT P_Name FROM P where `P_Name` like '".$title."%' AND is_reported=1;";
    $stmt2 = $db->query($sql2); 
    $pre2 = $stmt2->fetchAll(PDO::FETCH_OBJ);
    echo json_encode($pre);
    echo json_encode($pre2);
});
$app->run();
?>

【问题讨论】:

    标签: php mysql pdo


    【解决方案1】:

    在查询中使用两次 where condition 是错误的。

    $sql = "SELECT J_name FROM J where where `J_name` like '".$title."%' AND is_reported=1";
    
                                 ^^^^^^^^^^^
    

    删除一个where

    应该是

    $sql = "SELECT J_name FROM J where `J_name` like '".$title."%' AND is_reported=1";
    

    【讨论】:

    • 发生了什么事!!反正享受
    【解决方案2】:

    这并不是直接回答您的问题,但值得指出,因为这是一个极其严重的安全问题。您构建查询的方式为您打开了SQL injection 的大门。

    原因是您直接将用户提供的输入(在本例中为title)直接插入到数据库查询中。有人可以使用它在您的查询中插入和执行他们自己的恶意 SQL。

    PDO 的优点之一是它允许参数绑定,从而保护您免受 SQL 注入。所以而不是:

    $db =getDB();
    $title = $app->request()->params('title');
    $sql = "SELECT J_name FROM J where `J_name` like '".$title."%' AND is_reported=1;";
    $stmt = $db->query($sql); 
    $pre = $stmt->fetchAll(PDO::FETCH_OBJ);
    

    你可以这样做:

    $db =getDB();
    $title = $app->request()->params('title');
    $sql = "SELECT J_name FROM J where `J_name` like :title AND is_reported=1;";
    $stmt = $db->prepare($sql); 
    $stmt->execute([
        ':title' => "$title%"
    ]);
    $pre = $stmt->fetchAll(PDO::FETCH_OBJ);
    

    请注意我是如何从查询本身中删除变量 $title 的,而是将其绑定到 prepared statement 内的占位符 :title

    现在,PHP 将分别构造查询的实际“代码”部分,稍后介绍变量:title。即使变量 $title 包含恶意 SQL 代码,它也不会被视为 SQL 代码 - 它将被视为简单文本,就像其他任何内容一样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-15
      • 1970-01-01
      • 2013-02-02
      • 1970-01-01
      • 1970-01-01
      • 2010-11-12
      相关资源
      最近更新 更多