2015-10-14 2 views
0

Я пытаюсь создать класс CRUD стиля ООП в PHP и используя подготовленные заявления PDO для защиты от инъекций. Мое соединение работает, и я могу выполнять обычные SQL-запросы из класса, но когда я пытаюсь включить функцию подготовки PDO, я получаю сообщение об ошибке, когда у меня либо есть синтаксическая ошибка MySQL, либо подготовка PDO не определена.Использование подготовленных инструкций PDO Ошибка MySQL

Ошибка попадает на линию $p_query = $db->prepare($sql). Может ли кто-нибудь определить, что я делаю неправильно?

<?php 
require_once 'dbconfig.php'; 

class Crud { 
    protected $db; 

    private static function fetchQuery($sql, $values) { 
     echo $sql; 
     var_dump($values); 
     $db = Db_conn::pdoBuilder(); 
     $p_query = $db->prepare($sql); 
     $p_query->execute($values); 
     $results = $p_query->fetch(PDO::FETCH_OBJ); 
     return $results;  
    } 
    public static function show($tbl, $id) { 
     $sql = '"SELECT * FROM (:tbl) WHERE id = (:id)"'; 
     $values = [':tbl' => $tbl, ':id' => $id]; 
     $results = self::fetchQuery($sql, $values); 
     return $results; 

    } 

    public static function listAll($tbl) { 
     $sql = '"SELECT * FROM (:tbl)"'; 
     $values = [':tbl' => $tbl]; 
     $results = self::fetchQuery($sql, $values); 
     return $results; 
    } 
} 
+0

Покажите нам вывод '$ sql' и' $ values' –

+1

. Вы пытались удалить двойные кавычки из запроса? Как насчет удаления скобок из имени таблицы и фильтров столбцов? –

+0

@ MarcoAurélioDeleu sql: "SELECT * FROM (: tbl)" values: array (1) {[": tbl"] => string (6) "client"} –

ответ

1

Во-первых:

$sql = '"SELECT * FROM ?"'; 

Почему вы со ссылкой на ваш запрос? Оно должно быть:

$sql = 'SELECT * FROM ?'; 

Следующая:

$values = [':tbl' => $tbl]; 

Где заполнитель :tbl в запросе? Вы используете ?, измените $sql строку:

$sql = 'SELECT * FROM :tbl'; 

который сразу же создает другую проблему: таблица, которую вы используете в своем заявлении не может быть привязано после создания подготовленное заявление. Impossiburu. Никогда не произойдет. Лучшее, что вы можете сделать, это что-то вроде:

$sql = sprintf(
    'SELECT * FROM `%s`', 
    //remove illegal chars 
    str_replace([' ', '\\', '`', '"', "'"], '', trim($tbl)) 
); 

Наконец, применительно к этому биту:

$sql = '"SELECT * FROM (:tbl) WHERE id = (:id)"'; 
$values = [':tbl' => $tbl, ':id' => $id]; 
$results = self::fetchQuery($sql, $values); 

Это означает, что вы должны написать:

$sql = sprintf(
    'SELECT * FROM `%s` WHERE id = :id', 
    $tbl 
); 
$values = [':id' => $id]; 
return self::fetchQuery($sql, $values); 

Но на самом деле, ты «Не используйте подготовленные заявления, а возможно, вы могли бы. Самое лучшее в подготовленных заявлениях - то, что они многоразового использования. Обшивка PDO для получения более чистого API не была выполнена, насколько я знаю. Большинство попыток фактически уменьшают силу расширения или создают вокруг него раздутый слой абстракции. Это не должно быть плохо, если вы создаете полномасштабный ORM/DBAL. I've been quite vocal about this stuff here, вы, возможно, захотите его прочитать

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