php - 使用具有大量 INSERT 值的 PDO 的正确方法

标签 php mysql post pdo

我正在使用 PDO 将用户在具有 10 个输入字段的表单上的输入插入到 MySQL 数据库中。我通过执行以下操作创建一个包含 $_POST 值的数字数组:

foreach ($_POST as $key => $val)
{
     //testInput() sanitizes the input
     $postArray[] = testInput($val);
}

从我在线浏览的所有示例和答案以及使用 PDO 插入数据的 SO 中,他们做了这样的事情( https://stackoverflow.com/a/767520/3040381 ):

$db = new PDO("...");
$statement = $db->prepare("insert into some_other_table (some_id) values (:some_id)");
$statement->execute(array(':some_id' => $row['id']));

我遇到的问题是,我有近 10 个用户输入要插入到我的数据库中。使用上面的方法,我必须做这样的事情:

$statement->execute(array(':id1' => $row['id'], ':id2' => $row['id2'], ':id3' => $row['id3'], ........':id10' => $row['id10'], ':id11' => $row['id11']));

打字量很大,让我想知道我是否做得正确,但我没有看到任何其他方法可以在线使用 PDO 进行大规模插入。

我把它简化了一点:

    //ConnectDB() is a method in another file that returns a PDO object
$dbHandle = ConnectDB();

/**
* Gets the columns of a MySQL table
* @param {String} $tableName is the name of the table
* @param {Object} $handle is the PDO object
* @return {array} returns a numeric array containing column names
*/
function getColumnNames($tableName, $handle) {
    $query = $handle->prepare("SHOW COLUMNS FROM $tableName");
    $query->execute();
    $table_fields = $query->fetchAll(PDO::FETCH_COLUMN);
    return $table_fields;
}

/**
* Builds an INSERT query using named placeholders
* @param {String} $tableName is the name of the table to be inserted
* @param {Object} $handle is the PDO object
* @return {String} returns a INSERT query
*/
function getColumnStrings($tableName, $handle) {

    $columnArray = getColumnNames($tableName, $handle);
    $size = sizeof($columnArray);
    $sql = "(";
    for($i = 0; $i < $size; $i++) {
        $sql .= $columnArray[$i] . ",";

    }
    $sql = rtrim($sql, ",");
    $sql .= ")";
    $values = "VALUES (";
    for($i = 0; $i < $size; $i++) {
        $values .= ":" . $columnArray[$i] . ",";

    }
    $values = rtrim($values, ",");
    $values .= ")";


    return "INSERT INTO " . $tableName . " ". $sql . " " . $values;

}

/**
* Builds an associative array to place inside query->execute()
* @param {array} $postArray numeric array containing $_POST values
* @param {Object} $handle is the PDO object
* @param {String} $tableName is the name of the table
* @return {array} returns an associative array with 
*                 values to be replaced
*/
function buildArr($postArray, $handle, $tableName) {
    $namesArray = getColumnNames($tableName, $handle);
    $size = sizeof($namesArray);
    $paramArray = [];
    for($i = 0; $i < $size; $i++) {
        $namesArray[$i] = ":" . $namesArray[$i];

    }

    for($i = 0; $i < $size; $i++) {
        $paramArray[$namesArray[$i]] = $postArray[$i];
    }

    return $paramArray;
}

我将命名占位符放入数字数组中,然后与包含 $_POST 值的数组同时循环遍历占位符数组,并创建一个新的关联数组以放置在 $ 内query->execute() 参数。

我还可以不创建一个新数组,而是执行 bindValue() 并绑定(bind)两个数组中的每个索引元素,我认为这是一种替代方法。我插入大量用户输入的方法是否正确?

最佳答案

你的例子是一种方法,但我将给出我将如何处理这个问题的例子,特别是当你可能有大量的输入,而无需不断更新 SQL 查询或数据库时添加、删除或重新排序输入,或者无需在界面和数据库之间创建不必要的依赖关系。

假设我们已经执行了我们想要进行的任何检查,我们知道要插入数组中的任何值,我会执行以下操作:

<?php
//This array gives us a way to match our incoming data to where it needs to be stored.
$lookup = array( 'form1' => 'id1', [...]);

$columns_params = array();
$params_values = array();

foreach($lookup as $form_key => $column_key) {
    $param_key = ':'.$column_key;
    $columns_params[$column_key] = $param_key;
    $params_values[$param_key] = $_POST[$form_key];
}

$insert_statement = sprintf('insert into some_other_table (%s) VALUES (%s)', implode(',',array_keys($columns_params)), implode(',',array_values($columns_params)));

$statement = $db->prepare($insert_statement);
array_map(function($param, $value) use (&$statement) {
                $statemnt->bindParam($param, $value);
            }, $params_values);
$statement->execute();

关于php - 使用具有大量 INSERT 值的 PDO 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30782757/

相关文章:

mysql - 将站点数据存储在列或行中

ruby-on-rails - 通过 Post 在 Rails 中发送 JSON 对象

php - Laravel 4使用eloquent创建记录时无法保存created_at字段

PHP 数组 : cross data

php - 处理 php 中的特定异常

php - $_PHP_SELF常量

mysql - sql对2个表相同的列名进行排序

php - 如何读取保存在mysql数据库中的pdf文件?

ios - 如何发送带有文本参数和图像文件的帖子数据?

java - Android POST 到服务器总是返回错误的响应代码