PHP библиотека для работы с pdo

fixxxer

К.О.
Партнер клуба
но туда не может попасть пробел, ведь я сам ввожу код, а пользователь не сможет выбрать колонку, в которую вводить
да и у объектов свойства не могут начинаться с пробела
Допустим, сейчас это так. А потом появится REST API, какой-нибудь json_decode и опаньки PWNED

По сути-то ты пытаешься написать простейший query builder, то есть задачей построения запросов. Посмотри, как сделано тут:
https://github.com/auraphp/Aura.SqlQuery
 

fixxxer

К.О.
Партнер клуба
а нафига им совпадать? имя плейсхолдера - это просто некий уникальный идентификатор, какая разница, какой там был ключ в массиве?
PHP:
$i = 0;
foreach ($fields as $key => $value) {
    $placeholderName = "p" . ($i++);
    // insert $key and :$placeholderName into query
    $bindings[$placeholderName] = $value;
}
Другое дело, что когда ты генерируешь запрос вида INSERT ... (`foo`, `bar`) VALUES :p0, :p1) или UPDATE .. SET `foo`=:p0, `bar`=:p1, надо еще грамотно проэкранировать имена полей. Но это совсем просто - надо окружить `` и удвоить внутри `, если встречаются. (Ну или " вместо `, если это не mysql).
 

error1001es

Новичок
а нафига им совпадать? имя плейсхолдера - это просто некий уникальный идентификатор, какая разница, какой там был ключ в массиве?
PHP:
$i = 0;
foreach ($fields as $key => $value) {
    $placeholderName = "p" . ($i++);
    // insert $key and :$placeholderName into query
    $bindings[$placeholderName] = $value;
}
Другое дело, что когда ты генерируешь запрос вида INSERT ... (`foo`, `bar`) VALUES :p0, :p1) или UPDATE .. SET `foo`=:p0, `bar`=:p1, надо еще грамотно проэкранировать имена полей. Но это совсем просто - надо окружить `` и удвоить внутри `, если встречаются. (Ну или " вместо `, если это не mysql).
Сейчас для обновления колонок у меня:
PHP:
function updateColumns($table, $columns_and_values, $query, $params = null) //обновляет столбцы (любые таблицы)
    {
        $bindKeys = [];
        foreach ($columns_and_values as $column => $value) {
            $bindKeys[$column] = $column . ' = ? ';
        }
        $stmt = $this->prepare('UPDATE ' . $table . ' SET ' . implode(',', $bindKeys) . 'WHERE ' . $query);
        $i = 0;
        foreach ($columns_and_values as $column => $value) {
            $i++;
            echo $i . '='.$value;
            $stmt->bindParam($i, $value, is_int($value) ? PDO::PARAM_INT : PDO::PARAM_STR);
        }
        foreach ($params as $param) {
            $i++;
            echo $i . '='.$param;
            $stmt->bindParam($i, $param, is_int($param) ? PDO::PARAM_INT : PDO::PARAM_STR);
        }
        $stmt->execute();
    }
Стоит ли менять на плейсхолдеры и есть ли у них преимущество над "?"?
Используется так:
$conn->updateColumns('users', ['login'=>'user'], 'id = ?', [2]);
 

fixxxer

К.О.
Партнер клуба
С позиционными в данном случае проще, да.

Вот тут
$bindKeys[$column] = $column . ' = ? ';
и тут
$this->prepare('UPDATE ' . $table .
надо зкранировать $column и $table - я выше писал как (про backticks).
 

error1001es

Новичок
С позиционными в данном случае проще, да.

Вот тут
$bindKeys[$column] = $column . ' = ? ';
и тут
$this->prepare('UPDATE ' . $table .
надо зкранировать $column и $table - я выше писал как (про backticks).
Поставить '"'.$table.'"'?
А зачем экранировать, если и так все работает?
 

fixxxer

К.О.
Партнер клуба
PHP:
function escapeName($name, $escapeChar = "`") {
    return $escapeChar . str_replace($escapeChar, $escapeChar . $escapeChar, $name) . $escapeChar;
}
А зачем экранировать, если и так все работает?
С таким подходом далеко не уйдешь. ))
Программировать надо для всех случаев, а не для частных, на которых ты проверял.
Попробуй, например, имя поля "select".
Задача такой библиотеки - строить корректный SQL-запрос для _любых_ входных данных.
 
Сверху