2015-12-19 3 views
1

Я создаю restful API и его работу, но когда я пытаюсь передать параметр в ссылку, отображается ошибка ниже, хотя, когда я печатаю параметр, результат правильный!Ошибка приложения «SQLSTATE [42000]»

Подробности

Тип: PDOException

Код: 42000

Сообщение: SQLSTATE [42000]: Ошибка синтаксиса или нарушение прав доступа: 1064 Вы есть ошибка в вашем SQL синтаксиса; проверьте руководство, которое соответствует вашей версии сервера MySQL для правильного синтаксиса использовать вблизи «где Journal_name как„Abhinav%“И is_reported = 1» в строке 1

Файл: ... путь/index.php

Линия: 15

и строка 15 - это запрос $ stmt = $ db-> ($ 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(); 
?> 

ответ

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"; 
+0

hahaha Это постыдно. Спасибо – Seham

+0

Случилось что-то !! в любом случае – Saty

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 из самого запроса, и я вместо привязки его к заполнителем :title внутри prepared statement.

Теперь PHP будет строить фактическую «часть кода» запроса отдельно, ввести переменную :title позже. Даже если переменная $title содержит вредоносный код SQL, она не будет обрабатываться как код SQL - она ​​будет рассматриваться как простой текст, как и все остальное.

Смежные вопросы