【问题标题】:PHP Multiple Mysql Insert script explanation. How?PHP Multiple Mysql Insert 脚本说明。如何?
【发布时间】:2018-03-22 00:26:27
【问题描述】:

我需要帮助来理解这个聪明的 PHP Multiple Mysql Insert 代码。

请允许我强调一下,我在网上找到了对 JSON 数据的解析,剩下的就是我的了。

完美无瑕,但有些事情我并不完全理解......

  1. 如何构建插入字符串?如果你能评论代码,那就太好了……

  2. 是重复插入还是一个巨大的插入PDO执行?

  3. 我注意到它使用的是 bindValue 而不是 bindParameter。这是因为这个动态 PHP 脚本的性质吗?

  4. 可选:如果您知道一种简单明了的方法来执行此操作,请务必让我知道您是否有机会。

JSON POST 数据

[
   {
      "PK_LINE_ITEM_ID":555,
      "DESCRIPTION":"LINE ITEM 5",
      "QUANTITY":0,
      "UNIT":"SF",
      "COST":0,
      "TOTAL":"0.00"
   },
   {
      "PK_LINE_ITEM_ID":777,
      "DESCRIPTION":"LINE ITEM 7",
      "QUANTITY":0,
      "UNIT":"SF",
      "COST":0,
      "TOTAL":"0.00"
   },
   {
      "PK_LINE_ITEM_ID":999,
      "DESCRIPTION":"LINE ITEM 9",
      "QUANTITY":0,
      "UNIT":"SF",
      "COST":0,
      "TOTAL":"0.00"
   }
]

PHP 脚本 (data_post_json_insert_all.php)

<?php
/* Status Codes

return 0 = Nothing to Update (n/a)
return 1 = Successful Insert Query
return 2 = Database Connection refused
return 3 = MySQL Query Error OR Wrong URL Parameters */

/* Disable Warnings so that we can return ONLY what we want through echo. */
mysqli_report(MYSQLI_REPORT_STRICT);

// First get raw POST input
$raw_post = file_get_contents('php://input');
// Run through url_decode..
$url_decoded = urldecode($raw_post);
// Run through json_decode...
// false to allow for reference to oject. eg. $column->name instead of $column["name"] in the foreach.
$json_decoded = json_decode($url_decoded, true);

$table_name = 'tbl_xyz';

// INCLUDE DB CONNECTION STRING
include 'php_pdo_mysql_connect.php';

pdoMultiInsert($table_name, $json_decoded, $link);

function pdoMultiInsert($mysql_table, $json_decoded, $pdo_object) {

    //Will contain SQL snippets.
    $rows_sql = [];

    //Will contain the values that we need to bind.
    $to_bind = [];

    //Get a list of column names to use in the SQL statement.
    $column_names = array_keys($json_decoded[0]);


    //Loop through our $json_decoded array.
    // begin outter for each
    foreach($json_decoded as $array_index => $row) {

        $params = [];


        // begin inner for each --------------------------------
        foreach($row as $column_name => $column_value) {

            $param = ":" . $column_name . $array_index;

            $params[] = $param;

            $to_bind[$param] = $column_value;

        } // end inner for each --------------------------------


        $rows_sql[] = "(" . implode(", ", $params) . ")";

    } // end outter for each


    //Construct our SQL statement
    $sql = "INSERT INTO `$mysql_table` (" . implode(", ", $column_names) . ") VALUES " . implode(", ", $rows_sql);

    //Prepare our PDO statement.
    $pdo_statement = $pdo_object->prepare($sql);


    //Bind our values.
    foreach($to_bind as $param => $val) {
        $pdo_statement->bindValue($param, $val);
    }

    //Execute our statement (i.e. insert the json_decoded data).
    return $pdo_statement->execute();
}

$link = null;
$stmt = null;

// return 1 = Successful Insert Query
echo '1'; 

谢谢

【问题讨论】:

  • 您可以只打印$sql——这是一个插入多行的语句。代码已经注释并且非常清晰。不过我修好了你的标签。
  • 对我来说不是。如此多地使用数组......分配......从哪里到哪里?内爆……爆炸……叹息……
  • 我最终会明白的。在这里试一试。

标签: php jquery mysql json


【解决方案1】:

1) 该脚本使用二维数组,以便更轻松地准备插入查询。

它将为每一行创建一个数组(使用列名作为索引,字段值作为值),然后是包含这些行的第二个数组。所以这个数组代表了所有将被插入的数据,就像它应该被包含在内一样。

然后,他们使用逗号作为胶水将每一行内爆 - 因此您将使用逗号分隔每个值并在其上加上括号。然后再次使用 coma 作为胶水来内爆第二个数组,它将挂载整个插入值查询。

2) Execute 在任何重复循环之外运行,因此它只是一个巨大的插入。

3) bindParam 将查询绑定到一个变量,如果这个变量将来发生变化,它也会在查询中发生变化。 bindValue 在运行时附加最终值。 Take a look at this thread.

4) 这个脚本是通用的,可以与不同的表设置一起使用——这是一种很好的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-14
    • 2017-06-08
    • 1970-01-01
    • 1970-01-01
    • 2022-12-02
    • 1970-01-01
    • 2019-02-12
    • 1970-01-01
    相关资源
    最近更新 更多