【问题标题】:Inserting Associative Array to MySQL via PHP with unknown keys使用未知键通过 PHP 将关联数组插入 MySQL
【发布时间】:2015-06-25 14:33:28
【问题描述】:

从 JSON 对象解码我想通过 PHP 将关联数组插入 MySQL。

我发现几个例子已经喜欢 https://www.daniweb.com/web-development/php/threads/381669/json-to-mysql-with-php 处理这样的一次性导入 - 也使用未知键。

但在我的情况下,我需要一次又一次地插入(从这个关联数组)到同一个表(不先删除并重新创建这个表),并且随时可能在数组中出现新的键,这也需要反映作为 MySQL 表中的新列(全部定义为“varchar(255)”)。

所以基本上在插入之前,需要检查现有列并在需要时补充新列。

我现在搜索了一段时间,但没有找到以前做过同样事情的人,简直不敢相信我是第一个需要这个的人。 :-)

有谁知道巧合的例子吗?

提前致谢!

【问题讨论】:

  • 可以先通过这个方法检查该列是否存在:stackoverflow.com/a/5943905/2136840。您也可以使用SHOW COLUMNS,尽管这是特定于 MySQL 的,因此不可移植。要创建列,php 脚本使用的 db 用户需要ALTER 权限,然后您将使用ALTER TABLE 创建列。我不确定您的网站/脚本的用途,但这需要为该用户提供大量访问权限,这可能是不可取的。
  • 你为什么不能使用id|key|value 表,它可以正确地表示这种不同的结构化数据集? (那时访问它的工作量几乎可以忽略不计)。或者将无关/稀有/非标准字段仅存储在 JSON blob 旁边的标准化列方案中不是更好吗? (在应用逻辑中也很容易重组)。

标签: php mysql arrays json


【解决方案1】:

应该有一个 information_schema 数据库,其中包含表名、字段名和该表中每个字段的序号位置。

  1. 你查询这个数据库如下:

     $sql = "select column_name, data_type from information_schema.columns
             where table_name = '$table_name' ORDER BY ordinal_position";
    

    注意:我还查询了 data_type,因为它在这些操作中很有用。

  2. 将此信息保存到数组中。 (这是你的主人)

  3. 遍历关联数组(外循环),同时遍历主数组中的每个元素(内循环)。外部中未在内部中找到的任何键都将添加到表中。

  4. 向表中添加任何新列(有很多示例sql statements for adding columns)。

  5. 重新查询 #1 以获取新的 master。

  6. 接下来,在遍历原始关联数组(内循环)的同时,遍历您的主数组(外循环)。当存在字段名称匹配时,将字段名称和值添加到新数组中(您也可以使用两个字符串:$fields 和 $values)。

  7. 新数组(或字符串)现在将具有正确顺序的所有字段/值,您可以使用它来构建您的插入 SQL 语句。

    INSERT INTO table_name (column1, column2, column3,...)
    VALUES (value1, value2, value3,...) 
    

【讨论】:

    【解决方案2】:

    将关联数组中的数据插入 MySQl 请按照以下步骤操作。

    第 1 步: 删除那些不是表格列的元素。请从您的 POST 数组中删除提交按钮值。

    unset($_POST['submit']);

    如果您想将任何其他列的值添加到表中,您可以将相同的值添加到数组中。如果您想保存客户端 IP 地址,则使用 like

    $_POST['customer_ip'] = $_SERVER['REMOTE_ADDR'];
    

    第 2 步: $query = "INSERT INTO table_name SET ";

    foreach($_POST as $column => $column_value) {
        $query .= $column." = '".$column_value."'";
    }
    

    $query 包含要执行的所需 SQL 查询。

    mysqli_query($query);
    

    【讨论】:

    • 感谢您的评论,但不幸的是,这并不能回答我关于在同一个表中插入新数据时处理未知列的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-21
    相关资源
    最近更新 更多