【问题标题】:php push 2d array into mysqlphp将二维数组推入mysql
【发布时间】:2010-04-24 15:39:49
【问题描述】:

干草, 尽管我阅读的示例数量众多,但我似乎无法理解这一点。基本上我有一个二维数组,想把它插入 MySQL。该数组包含一些字符串。

我无法让以下工作......

$value = addslashes(serialize($temp3));//temp3 is my 2d array, do i need to use keys? (i am not at the moment)
$query = "INSERT INTO table sip (id,keyword,data,flags) VALUES(\"$value\")"; 
mysql_query($query) or die("Failed Query");

谢谢各位,

【问题讨论】:

    标签: php mysql arrays 2d serialization


    【解决方案1】:

    不确定这是否是您问题的完整答案,但这里至少有几个可能的问题:

    • 你不应该使用addslashes;相反,使用mysql_real_escape_string
      • 知道特定于您的数据库引擎的事情。
    • 在 SQL 查询中,不应使用双引号 (") 围绕字符串值,而应使用单引号 (')
    • 在您的 SQL 查询中,values() 部分中的字段应该与字段列表中的字段一样多:
      • 在这里,您有 4 个字段:id,keyword,data,flags
      • 但只有一个值:VALUES(\"$value\")
    • 您应该使用mysql_error() 来了解您在执行 SQL 查询时遇到的确切错误
      • 这将帮助您找出查询中的问题 ;-)

    【讨论】:

    • 我还发现回显查询以确保它是您实际期望的结果很有用。
    • 感谢您的指点,使用 mysql_error() 向我展示了很多问题!
    【解决方案2】:
    <?php
    
    // let's assume we have a 2D array like this:
    $temp3 = array(
        array(
            'some keywords',
            'sme data',
            'some flags',
        ),
        array(
            'some keywords',
            'sme data',
            'some flags',
        ),
        array(
            //...
        ),
    );
    
    // let's generate an appropriate string for insertion query
    $aValues = array();
    foreach ($temp3 as $aRow) {
        $aValues[] = "'" . implode("','", $aRow) . "'";
    }
    $sValues = "(" . implode("), (", $aValues) . ")";
    
    // Now the $sValues should be something like this
    $sValues = "('some keywords','some data', 'someflags'), ('some keywords','some data', 'someflags'), (...)";
    
    // Now let's INSERT it.
    $sQuery = "insert into `my_table` (`keywords`, `data`, `flags`) values $sValues";
    mysql_query($sQuery);
    

    【讨论】:

    • 很好的例子,我其实不知道你可以在一个 SQL 语句中插入多行。顺便说一句,您还必须将字段括在单引号中,因此foreach 中的语句最好是:$aValues[] = "'" . implode("','", $aRow) . "'";
    • 谢谢大家,这很好用,用正确的语法看起来两次内爆
    【解决方案3】:

    作为已经给出的有用答案的补充,如果您有一个需要插入的大表,它可能不适合一个 SQL 语句。但是,为每一行创建单独的事务也很慢。在这种情况下,我们可以告诉 MySQL 在一个事务中处理多个语句,这将大大加快大表(>1000 行)的插入速度。

    一个例子:

    <?php
    function dologin() {
        $db_username    =   'root';
        $db_password    =   'root';
        $db_hostname    =   'localhost';
        $db_database    =   'logex_test';
    
        mysql_connect($db_hostname, $db_username, $db_password);
        mysql_select_db($db_database);  
    }
    
    function doquery($query) {
        if (!mysql_query($query)) {
            echo $query.'<br><br>';
            die(mysql_error());
        }
    }
    
    function docreate() {
        doquery("drop table if exists mytable");
        doquery("create table mytable(column1 integer, column2 integer, column3 integer)");
    }
    
    function main() {
        $temp3 = array(
            array('1','2','3',),
            array('4','5','6',),
            array('7','8','9',),
        );
    
        dologin();
        docreate();
        doquery("start transaction");
        foreach($temp3 as $row)
            doquery("insert into mytable values('" . implode("','", $row) . "')");
        doquery("commit") or die(mysql_error());
    }
    
    main();
    ?>
    

    【讨论】:

    • 感谢您的回答,但我无法让这个工作,谢谢!
    • 嗨,我通过数据库登录、表创建增强了示例,使其可以开箱即用(只需检查dologin 中的登录信息)。
    • 谢谢@littlegreen,我试试看!
    【解决方案4】:

    试试这个:

    // lets array 
    $data_array = array(
        array('id'=>1,'name'=>'a'),
        array('id'=>2,'name'=>'b'),
        array('id'=>3,'name'=>'c'),
        array('id'=>4,'name'=>'d'),
        array('id'=>5,'name'=>'e')
    )
    ;
    $temp_array = array_map('implode', $data_array, array('","'   ,'","','","','","','","'));
    echo $query =  'insert into TABLENAME (COL1, COL2) values( ("'.implode('"),("', $temp_array).'") )';
    mysql_query($query);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-16
      • 2012-02-27
      • 1970-01-01
      • 2015-04-26
      • 1970-01-01
      • 2016-03-13
      相关资源
      最近更新 更多