簡體   English   中英

使用 PDO 為 MySQL 准備的語句從數據數組中將多個值插入到多個列中

[英]Inserting multiple values into multiple columns from an array of data using a PDO prepared statement for MySQL

I'm new to PHP and MySQL (and programming in general) and I'm trying to create a generic database handler class called Database_Handler that will help me manage basic things like insert, delete, select, update, etc.

我目前正在研究成員 function 來處理插入。 在我的插入 function 中,我想構建一個准備好的 PDO 插入語句並執行它。

假設在我的應用程序的某個地方,我調用了插入 function,如下所示:

$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 statement w/ 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()處理該部分?

是的, 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);

}

由於插入函數內部的安全原因,您應該轉義並過濾查詢中的參數(或使用 bindParam)!

bindParam確實引用了變量——注意第二個參數在方法原型中是mixed &$variable 在綁定和語句執行之間對變量的更改將影響查詢。

另外,請注意,這是允許您綁定到“out”或“inout” SQL 變量的原因——在execute()調用之后,這些變量將更改為語句生成的任何值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM