我构建了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();
?>
答案 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代码 - 它将被视为简单文本,就像其他任何内容一样。