应用程序错误“SQLSTATE [42000]”

时间:2015-12-19 11:35:35

标签: php mysql pdo

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

详细

  

键入:PDOException

     

代码:42000

     

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

     

文件:... path / 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();
?>

2 个答案:

答案 0 :(得分: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";

答案 1 :(得分:0)

这不是你问题的直接答案,但值得指出,因为这是一个非常严重的安全问题。构建查询的方式最多可让您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代码 - 它将被视为简单文本,就像其他任何内容一样。