Mysql Изменить mysqli на аналог PDO

volnistii11

Новичок
Здравствуйте, по советам многих с этого форума начинаю изучать PDO, но не могу понять, как мне изменить отрывок этого кода, чтобы работал на PDO запросе.
Есть функция вывода строк из таблицы:
Код:
public static function getAll($query, $param = array())
        {
            self::$sth = self::getDbh()->prepare($query);
            self::$sth->execute((array) $param);
            return self::$sth->fetchAll(PDO::FETCH_ASSOC);
        }
Если с помощью следующего когда я мог в подобную функцию на Mysqli передавать сразу подготовленный запрос, то здесь помимо запроса мне нужно передать еще массив условий, это выглядит примерно так: DB::getAll('SELECT * FROM table WHERE user_id = ? AND id = ?', [1, 111]); // 1 - подставляется в user_id, 111 - в id
Ну и соответственно, чтобы order и linit тоже корректно работали. Вот, как подготовка запроса выглядела для mysqli_query:
Код:
    $pre = " ";
    $select = "SELECT SQL_CALC_FOUND_ROWS id, name, description, create_date FROM my_table ";
    $where  = "";
    $search = "";
    if( sizeof($_POST['columns']) > 0 ) {
        $searchPre = $pre."(";
        foreach($_POST['columns'] as $column){
            if($column['searchable'] == true && $_POST['search']['value'] != -1 && !empty($_POST['search']['value']) ){
                 $search .= $searchPre. $column['name']." LIKE '%".mres($_POST['search']['value'])."%'";
                 $searchPre = " OR ";
            }
        }
        $pre = " AND ";
        if (strlen($search)>0) { $search .= ")"; $where = ' WHERE '; }
    }
    if( isset($_POST['order'][0]) ){
        $col_name = $_POST['columns'][$_POST['order'][0]['column']]['name'];
        $limit_and_order .= ' ORDER BY '.$col_name.' '.$_POST['order'][0]['dir'];
    }
    $limit = filter_input(INPUT_POST,'length', FILTER_VALIDATE_INT );
    if($limit != -1){
        $start = filter_input(INPUT_POST, 'start', FILTER_VALIDATE_INT);
        $limit_and_order .= " LIMIT ".$start.",".$limit;
    }
    $q = $select.$where.$search.$limit_and_order;
    $data = DB::getAll($q);
    $total = DB::getAll("SELECT FOUND_ROWS()");
    echo json_encode(["draw"=>intval($_POST['draw']), "recordsTotal"=>(int) $total, "recordsFiltered"=>(int) $total, "data"=>$data]);
 

Фанат

oncle terrible
Команда форума
1. Надо выкинуть этот статический ад, который коннектится для каждого запроса. Если уж хочешь использовать статику, то во-первых, синглтон, а во-вторых, статикой должен быть только инстанс ПДО. все остальное из статики, все эти self::$sth выкинуть в ужасе. Пример можно посмотреть по ссылке выше.
2. Не надо использовать одну и ту же функцию на все случаи жизни. getAll у тебя возвращает массив массивов , а SELECT FOUND_ROWS() выбирает единичное значение. Раз уж ты такой писатель функций, то и напиши несколько функций для разных случаев. или же используй встроенные возможности ПДО, то есть функция возвращае стейтмент, а ты уже из него фетчишь что нужно. Пример можно посмотреть по ссылку выше
3. Так и делай как написал - в запрос добавляй плейсхолдеры, а значения для них - в массив:
PHP:
$search .= "$column LIKE ?";
$params[] = "%".$_POST['search']['value']."%";
4. Но это всё равно всё мёртвому припарки, потому что ты имя колонки берешь из ПОСТА, чего делать категорически нельзя. Смысл бороться с инхекциями если ты сам же засовываешь в запрос любой код, который тебе напишет малолетний хакер? Список колонок надо брать не из поста, а из переменной, которая прописана в скрипте. Ну или по крайней мере проверять каждое значение поля по прописанному фильтру. У тебя же всю эту ливерную колбасу, $_POST['columns'][$_POST['order'][0]['column']]['name'] - все равно же какой-то колумн хелпер выводит? вот и используй его
5. То же самое касается ORDER BY

Делай, потом покажешь, будем дальше разбирать.
 
Последнее редактирование:

volnistii11

Новичок
1. Надо выкинуть этот статический ад, который коннектится для каждого запроса. Если уж хочешь использовать статику, то во-первых, синглтон, а во-вторых, статикой должен быть только инстанс ПДО. все остальное из статики, все эти self::$sth выкинуть в ужасе. Пример можно посмотреть по ссылке выше.
2. Не надо использовать одну и ту же функцию на все случаи жизни. getAll у тебя возвращает массив массивов , а SELECT FOUND_ROWS() выбирает единичное значение. Раз уж ты такой писатель функций, то и напиши несколько функций для разных случаев. или же используй встроенные возможности ПДО, то есть функция возвращае стейтмент, а ты уже из него фетчишь что нужно. Пример можно посмотреть по ссылку выше
3. Так и делай как написал - в запрос добавляй плейсхолдеры, а значения для них - в массив:
PHP:
$search .= "$column LIKE ?";
$params[] = "%".$_POST['search']['value']."%";
4. Но это всё равно всё мёртвому припарки, потому что ты имя колонки берешь из ПОСТА, чего делать категорически нельзя. Смысл бороться с инхекциями если ты сам же засовываешь в запрос любой код, который тебе напишет малолетний хакер? Список колонок надо брать не из поста, а из переменной, которая прописана в скрипте. Ну или по крайней мере проверять каждое значение поля по прописанному фильтру. У тебя же всю эту ливерную колбасу, $_POST['columns'][$_POST['order'][0]['column']]['name'] - все равно же какой-то колумн хелпер выводит? вот и используй его
5. То же самое касается ORDER BY

Делай, потом покажешь, будем дальше разбирать.
А вы не знаете, где можно найти информацию о всех возможных данных, которые посылаются в результате $_POST запроса, есть такие как:
Код:
$draw = $_POST['draw'];
$row = $_POST['start'];
$rowperpage = $_POST['length']; // Rows display per page
$columnIndex = $_POST['order'][0]['column']; // Column index
$columnName = $_POST['columns'][$columnIndex]['data']; // Column name
$columnSortOrder = $_POST['order'][0]['dir']; // asc or desc
$searchValue = $_POST['search']['value']; // Search value
А есть ли какие-либо еще?
 

fixxxer

К.О.
Партнер клуба
Где найти информацию о всех возможных комментариях, которые можно написать на этом форуме?
 
Сверху