2010-04-24 52 views
0

干所有, 我似乎无法得到我的头,这个数字,我看过的例子。基本上我有一个2D数组,并希望将其插入到MySQL中。该数组包含几个字符串。php推二维数组到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"); 

谢谢你们,

回答

0
<?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); 
+1

不错的例子,我其实不知道你可以在一个SQL语句中插入多行。顺便说一句,你也必须用单引号括住这些字段,所以'foreach'中的语句最好是:'$ aValues [] =“'”。 implode(“','”,$ aRow)。 “'”;' – thomaspaulb 2010-04-24 18:17:54

+0

感谢堆,这工作得很好,用正确的语法破解了两次,看起来没有什么技巧 – john 2010-04-25 00:33:39

+0

感谢@littlegreen。你的权利。我纠正了它。 – Alexar 2010-04-25 07:35:13

2

不知道它是一个完整的回答你的问题,但这里至少几个可能出现的问题:

  • 您不应该使用addslashes;相反,使用mysql_real_escape_string
    • 知道关于特定于您的数据库引擎的事情。
  • 在您的SQL查询,你不应该使用双引号(")以防万一字符串值,但单引号('
  • 在您的SQL查询,你应该在values()尽可能多的领域部分如您在字段列表中有:
    • 在这里,你有4个领域:id,keyword,data,flags
    • ,但只有一个值:VALUES(\"$value\")
  • 您应该使用mysql_error()知道什么是在执行SQL查询
    • 这将帮助你找出存在的问题,你已经得到了精确的错误您的疑问;-)
+0

我也找到它有用呼应了查询,以确保它是你真正希望它是。 – Twelve47 2010-04-24 15:55:12

+0

感谢您的指点,使用mysql_error()告诉我很多错误! – john 2010-04-25 00:35:18

+0

不客气:-)玩得开心! – 2010-04-25 10:41:35

0

作为已经给出的有用答案的补充,如果您有一个需要插入的大表可能不适合一个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(); 
?> 
+0

感谢您的回答,我无法得到这个工作,谢谢! – john 2010-04-25 00:34:40

+0

嗨,我增强了数据库登录,创建表的例子,使它可以开箱即用(只需检查'dologin'中的登录信息)。 – thomaspaulb 2010-04-26 07:47:45

+0

谢谢@littlegreen,我会放弃这个! – john 2010-04-29 13:42:31

0

试试这个:

// 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);