【问题标题】:php array how to dynamically insert data into mysql table when field names not known in advance?当字段名称事先不知道时,php数组如何将数据动态插入mysql表?
【发布时间】:2012-05-22 22:45:18
【问题描述】:

我在一个数组中接收到一些数据,这些数据将存储在一个 mysql 表中。表字段名称与数组中键/值对中的key相同,但是我事先不知道会到达哪些键/值对

// First execution
$array1 = array('a'=> 'str1', 'b'=> 'str2', 'c'=> 'str3', 'd'=> 'str4');

// second execution
$array2 = array('a'=> 'str6', 'c'=> 'str7', 'e'=> 'str5');

// third execution
$array3 = array('b'=> 'str8', 'd'=> 'str9', 'e'=> 'str10');

所以上面指出了数据可以到达的方式。下面是db表结构的例子

column 1 name = id (auto increment)
column 2 name = 'a'
column 3 name = 'b'
column 4 name = 'c'
column 5 name = 'd'
column 6 name = 'e'
column 7 name = 'f'

请注意,可能会有一些意外数据,但如果该意外值的 db 字段(列)不存在,则应跳过该数据。我基本上只需要在存在列的位置插入数据,并且该列的任何不存在的值都应该为空。我希望这对某人有意义。

如何在php中构造SQL?

【问题讨论】:

  • 理论上你可以在进行任何插入之前 DESCRIBE TABLE,但我真的建议不要这样做,因为如果你要与很多交互,你真的会损害性能表。你可能最好实现一组知道底层表是如何布局的类

标签: php mysql dynamic insert


【解决方案1】:

您可以从数组键构造列名列表,从数组值构造值列表。比如:

$keys = array_keys($arr);
$vals = array();
foreach ($keys as $k)
{
    $vals[] = "'".mysql_real_escape_string($arr[$k])."'";
}
$qry = "INSERT into tab1 (".implode(',', $keys).") VALUES (".implode(',', $vals).")";

您仍然需要找到一种方法来删除不在表中的键。我认为 GordonM 使用 DESCRIBE TABLES 的想法可能是要走的路,然后过滤 $keys (一旦你得到了列名列表,使用 array_intersect())

【讨论】:

    【解决方案2】:

    您可以使用 Zend 框架的一部分 Zend_Db_Table。 http://framework.zend.com/manual/en/zend.db.table.html 请注意,您可以将其用作库,而无需使用框架。 Zend_Db_Table 有一个检索表元数据的方法,因此很容易过滤数组。它还提供缓存元数据的功能。

    一个简单的例子:

    $db = new Zend_Db_Adapter_Pdo_Mysql(array(
        'host'     => 'localhost',
        'username' => 'test',
        'password' => 'test',
        'dbname'   => 'test'
    ));
    Zend_Db_Table::setDefaultAdapter($db);
    $table = new Zend_Db_Table('table_name');    
    $info = $table->info();
    
    // assuming array1 contains keys => values    
    $arr = array_intersect_key($array1,array_flip($info['cols']));    
    $table->insert($arr);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-08
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 2019-06-17
      相关资源
      最近更新 更多