Вставка нескольких значений в несколько столбцов из массива данных с использованием подготовленного оператора PDO для MySQL - PullRequest
2 голосов
/ 14 августа 2011

Я новичок в PHP и MySQL (и программировании в целом), и я пытаюсь создать общий класс обработчика базы данных с именем Database_Handler, который поможет мне управлять основными вещами, такими как вставка, удаление, выбор, обновление и т. Д. .

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

Предположим, что где-то в моем приложении я вызвал функцию вставки следующим образом:

$table = "books";
$cols = array('author', 'title', 'pubdate');
$values = array('Bob Smith', 'Surviving the Zombie Apocalypse', '2010');

$db_handler->insert($table, $cols, $values);

Как я могу использовать данные из $table, $cols и $values для построения подготовленного оператора вставки PDO? Вот моя первая попытка, основанная на ответе "Как вставить массив в один оператор MySQL Prepared с PHP и PDO" .

public function insert($table, $cols, $values){

        $numvalues = count($values);

        $placeholder = array();
        for($i=0; $i<$numvalues; $i++)
        $placeholder[$i] = '?';

        $sql = 'INSERT INTO '. $table . '(' . implode(",", $cols) . ') ';
        $sql.= 'VALUES (' . implode("," $placeholder) . ')"';

        $stmt = $this->dbh->prepare($sql);
        $for($i=0; $i<$numvalues; $i++)
            $stmt->bindParam($i+1, $values[$i])
        $stmt->execute();
}

Не думаю, что это сработает, но, возможно, это даст вам представление о том, что я хочу сделать. Я немного сбит с толку, потому что пример , приведенный в руководстве по php.net :

$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $value);

// insert one row
$name = 'one';
$value = 1;
$stmt->execute();

Похоже, что они отправляют $name в качестве параметра функции bindParam(), а затем присваивают значение $name? Какое значение $name при отправке на bindParam()? Или bindParam() просто связывает параметр с переменной, не беря данные этой переменной - позволяя execute() обрабатывать эту часть?

Ответы [ 3 ]

8 голосов
/ 14 августа 2011

Да, bindParam привязывает параметр к имени переменной (ссылка), а не к значению, как говорится в руководстве .

Однако естьболее простой синтаксис для вашей ситуации.PDOStatement::execute может принимать массив значений.

public function insert($table, $cols, $values){

    $placeholder = array();
    for ($i = 0; i < count($values); $i++)
      $placeholder[] = '?';

    $sql = 'INSERT INTO '. $table . ' (`' . implode("`, `", $cols) . '`) ';
    $sql.= 'VALUES (' . implode(", ", $placeholder) . ')';

    $stmt = $this->dbh->prepare($sql);
    $stmt->execute($values);

}
0 голосов
/ 08 ноября 2013

Вы должны экранировать и фильтровать параметры в запросе (или использовать bindParam), потому что причина безопасности внутри функции вставки!

0 голосов
/ 14 августа 2011

bindParam действительно принимает ссылку на переменную - обратите внимание, что вторым параметром является mixed &$variable в прототипе метода. Изменения в переменной между связыванием и выполнением оператора будут влиять на запрос.

Кроме того, обратите внимание, что это то, что позволяет вам связывать переменные SQL "out" или "inout" - после вызова execute() эти переменные изменятся на любое значение, производимое оператором.

...