使用PDO将大量变量插入表中

Lia*_*iam 7 php mysql pdo

我有一个包含大约25个输入字段的大表单.

我试图将它们插入我的表中,这是我知道如何使用以下内容的唯一方法...

$count = $dbh->exec("INSERT INTO directory(field1, field2) VALUES (':value1', ':value2')");
Run Code Online (Sandbox Code Playgroud)

由于我有这么多的帖子变量,有没有比将每个人和每个人都输入我的查询更好的方法呢?

Jon*_*ler 4

Dynamic prepared queries

You can build your query dynamically from $_POST array:

But, NEVER trust user input, which means you cannot trust that data in $_POST will contain valid column names.

1. Sanitize the post data

You can define an array of whitelisted column names $whitelist = array('field1', 'field2', ...), and then use:

$data = array_intersect_key($_POST, array_flip($whitelist));
Run Code Online (Sandbox Code Playgroud)

to find the intersection between the whitelisted columns and your $_POST array. (Thanks @BillKarwin)

2. Build the query

private function buildInsertSql($data, $table) {
    $columns = "";  
    $holders = "";  
    foreach ($data as $column => $value) {  
       $columns .= ($columns == "") ? "" : ", ";  
       $columns .= $column;  
       $holders .= ($holders == "") ? "" : ", ";  
       $holders .= ":$column";  
    }  
    $sql = "INSERT INTO $table ($columns) VALUES ($holders)";  
    return $sql; 
}
Run Code Online (Sandbox Code Playgroud)

This will give you a SQL statement of the form:

$sql = INSERT INTO directory (field1, field2) VALUES (:field1, :field2)
Run Code Online (Sandbox Code Playgroud)

and prepare the statement:

$stmt = $dbh->prepare($sql);
Run Code Online (Sandbox Code Playgroud)

3. Bind parameters

You can then dynamically bind parameters to the placeholders:

foreach ($data as $placeholder => $value) {
    $stmt->bindValue(":$placeholder", $value);
 }
Run Code Online (Sandbox Code Playgroud)

and execute it:

$stmt->execute();
Run Code Online (Sandbox Code Playgroud)

A little more advanced...