【问题标题】:An efficient way to save an Array and its Keys to a database将数组及其键保存到数据库的有效方法
【发布时间】:2011-01-01 09:04:15
【问题描述】:

我正在尝试将大量变量保存到数据库中,现在它变得越来越荒谬了。我正在使用 PHP 和 MySQL。

有没有办法,我可以一次性获取数组值和数组键(数组键与表列/字段名称完全相同),而无需添加新的变量和表列对。

说实话,我只需要构建 SQL 字符串的帮助,其余的都是为我设置的。

当我必须存储一个新变量时,我可以将新列添加到数据库表中。

感谢大家的帮助

【问题讨论】:

    标签: php mysql arrays performance


    【解决方案1】:

    如果您想从数组创建 SQL 查询,这可能会有所帮助:

    // Sample array
    $array = array(
                 'key1' => 'value1',
                 'key2' => 'value2'
                 ...
                 'key10' => 'value10'
             );
    
    // Get and escape the keys
    $keys = array_map('mysql_real_escape_string', array_keys($array));
    // Escape the values
    $array = array_map('mysql_real_escape_string', $array);
    // Build query
    $query = "INSERT INTO table(`".implode('`, `', $keys)."`) VALUES('".implode("', '", $array)."')";
    
    mysql_query($query);
    

    在这种情况下,查询看起来像这样:

    INSERT INTO
        table(`key1`, `key2` ... `key10`)
    VALUES
        ('value1', 'value2' ... 'value10')
    

    如果您有一个多维数组(数组的数组),您可以按如下方式创建查询:

    // Sample multidimensional array
    $array = array(
                 array('key1' => 'value1', 'key2' => 'value2'),
                 array('key1' => 'value3', 'key2' => 'value4'),
                 array('key1' => 'value5', 'key2' => 'value6')
             );
    
    // Get and escape the keys
    $keys = array_map('mysql_real_escape_string', array_keys(current($array)));
    // Array to store values for the query
    $values = array();
    // Loop every row and insert into $values array
    foreach($array as $row) {
        // Escape all items
        array_map('mysql_real_escape_string', $row);
        $values[] = "('".implode("', '", $row)."')";
    }
    
    $query = "INSERT INTO table(`".implode('`, `', $keys)."`) VALUES ".implode(', ', $values);
    
    mysql_query($query);
    

    在这种情况下,生成的查询将是这样的:

    INSERT INTO
        table(`key1`, `key2`)
    VALUES
        ('value1', 'value2'),
        ('value3', 'value4'),
        ('value5', 'value6')
    

    现在您唯一需要担心的是为数据库创建相应的列。

    【讨论】:

    • 太棒了!谢谢大图——这正是我想要的,我太笨了,无法自己完成! :)
    【解决方案2】:

    序列化数据并将其写入一个表中的单个字段。 然后检索数据反序列化它并留下一个数组。

    <?php
    $array = array("hello", "world");
    $serialized = serialize($array);
    
    // -> Then write $serialized to database
    ?>
    

    检索

    <?php      
    // -> First Get $serialized from database
    
    $array = unserialize($serialized);
    ?>
    

    【讨论】:

    • 当我尝试制作一个管理员可以随时更改的表单时,我想到了这种方法。因此,当管理员更改表单时,这是最简单的方法,不会弄乱以前的条目。
    • 不推荐的方式,因为它使插入的值不可查询。
    【解决方案3】:

    您可以尝试在数据库中存储一个序列化的选项数组。例如,来自:http://us3.php.net/manual/en/function.serialize.php

    <?php
    // $session_data contains a multi-dimensional array with session
    // information for the current user.  We use serialize() to store
    // it in a database at the end of the request.
    
    $conn = odbc_connect("webdb", "php", "chicken");
    $stmt = odbc_prepare($conn,
          "UPDATE sessions SET data = ? WHERE id = ?");
    $sqldata = array (serialize($session_data), $_SERVER['PHP_AUTH_USER']);
    if (!odbc_execute($stmt, $sqldata)) {
        $stmt = odbc_prepare($conn,
         "INSERT INTO sessions (id, data) VALUES(?, ?)");
        if (!odbc_execute($stmt, $sqldata)) {
            /* Something went wrong.. */
        }
    }
    ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多