Можно ли упростить функцию?

error1001es

Новичок
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();
    }
вот эта строка найдет пользователя с id = 2 и поставит ему login = user
$conn->updateColumns('users', ['login'=>'user'], 'id = ?', [2]);
 

WMix

герр M:)ller
Партнер клуба
Код:
$conn->updateColumns('users', ['login'=>'user'],['id' => 2]);
 

WMix

герр M:)ller
Партнер клуба
а я про все, если параметры одинаковой структуры то и собирать их можно одним и темже методом
 

WMix

герр M:)ller
Партнер клуба
я не о updateColumns а про методы insert, update, delete которые используют метод x(params, delimiter)
 

error1001es

Новичок
я не о updateColumns а про методы insert, update, delete которые используют метод x(params, delimiter)
для insert у меня вот так код будет работать:

PHP:
 function dispense($table) //создает объект из строки (любые таблицы)
    {
        $stmt = $this->query('DESCRIBE ' . $table);
        $r = (object)[];
        foreach ($stmt as $field) {
            foreach ($field as $key => $value) {
                if ($key === 'Field') unset($r->$value);
            }
        }
        $r->tablename = $table;
        return $r;
    }
function create($object) //создает строку (из объекта) (любые таблицы)
{
    $table = $object->tablename;
    unset($object->tablename);
    $bindKeys = [];
    $bindValues = [];
    $questionmarks = [];
    foreach ($object as $column => $value) {
        $bindKeys[$column] = $column;
        $bindValues[$column] = $value;
        $questionmarks[] = '?';
    }
    $stmt = $this->prepare('INSERT INTO ' . $table . ' (' . implode(',', $bindKeys) . ') VALUES (' . implode(',', $questionmarks) . ')');
    $i = 0;
    foreach ($object as $column => $value) {
        $i++;
        $stmt->bindParam($i, $bindValues[$column], is_int($bindValues[$column]) ? PDO::PARAM_INT : PDO::PARAM_STR);
    }
    $stmt->execute();
}
$user = $conn->dispense('users'); //создадим объект
$user->login = 'testuser';
$user->password = 'testpass';
$conn->create($user); //добавим в бд
 

error1001es

Новичок
я не о updateColumns а про методы insert, update, delete которые используют метод x(params, delimiter)
PHP:
 function updateColumns($table, $object, $query, $params = null) //обновляет столбцы (любые таблицы)
    {
        $bindKeys = [];
        $bindValues = [];
        foreach ($object as $column => $value) {
            $bindKeys[$column] = $column . ' = ?';
            $bindValues[] = $value;
        }
        $stmt = $this->prepare('UPDATE ' . $table . ' SET ' . implode(',', $bindKeys) . ' WHERE ' . $query);
        $stmt->execute(array_merge($bindValues,$params));
    }
упростил код
 

Фанат

oncle terrible
Команда форума
я бы в первую очередь эту функцию не упростил, а обезопасил. Тут дыра на дыре и дырой погоняет.

А в плане упрощения я бы конечно выкинул повторяющиеся повторяющиеся циклы. Вместо второго и третьего написать ровно одну строчку

Код:
$stmt->execute(array_merge(array_values($columns_and_values), $params));
 

error1001es

Новичок
я бы в первую очередь эту функцию не упростил, а обезопасил. Тут дыра на дыре и дырой погоняет.

А в плане упрощения я бы конечно выкинул повторяющиеся повторяющиеся циклы. Вместо второго и третьего написать ровно одну строчку

Код:
$stmt->execute(array_merge(array_values($columns_and_values), $params));
Не знал о функции array_values, спасибо
 
Сверху