将数组插入mysql表

时间:2013-05-08 09:21:43

标签: php mysql arrays

我有一个格式如下的csv文件:

a;a1;1;0;1
b;b1;1;0;0

使用下面的php脚本,我可以将其转换为:

a;a1;1;
a;a1;0;
a;a1;1;
b;b1;1;
b;b1;0;
b;b1;0;

使用此:

$data = array();
foreach($lines as $value) {
    $value = explode(";", $value);

    $first = array_splice($value, 0, 2);

    foreach($value as $x){
        $row = $first;
        $row[] = $x;
        $data[] = implode(';', $row);
    }
}

输出是数组:

array(6) {
  [0]=>
  string(6) "a;a1;1"
  [1]=>
  string(6) "a;a1;0"
  [2]=>
  string(6) "a;a1;1"
  [3]=>
  string(6) "b;b1;1"
  [4]=>
  string(6) "b;b1;0"
  [5]=>
  string(6) "b;b1;0"
}

现在我正在尝试将此数组插入到我已设置的mysql表中,但我遇到了麻烦......

$file = "_ss.csv";
$lines = file($file);
$count = count($lines);
$data = array();
$i = 0;
foreach($lines as $value){
    $value = explode(";", $value);
    $first = array_splice($value, 0, 2); 

    foreach($value as $x){

        $row = $first;
        $row[] = $x;
        $data[] = implode(',', $row);
        $dump = implode(',', $data);
        $query="INSERT INTO csv_test2 VALUES ('$dump')";
        $init=mysql_query($query);
$i++;
echo $dump;

    }
}

echo "<pre>";
print_r($dump);
echo "</pre>";

任何想法如何使其发挥作用?

6 个答案:

答案 0 :(得分:1)

好的,所以这就是我想出的解决方案。

foreach(explode($lineseparator,$csvcontent) as $value){
      $lines++;
      $value = trim($value," \t");
      $value = str_replace("\r","",$value);
      $value = str_replace("'","\'",$value); 
      $linearray = explode($fieldseparator,$value);
      $linemysql = implode("','",$linearray); // sitas rdy siuntimui i db
      $first = array_splice($linearray, 0, 2); 
    foreach($linearray as $x){
            $row = $first;
            $row[] = $x;
            $data[] = implode("','",$row);    
            }
}
foreach ($data as $id) {
    echo "<pre>";
    var_dump($id);
    echo "</pre>";
    $query="INSERT INTO csv_test3 VALUES ('$id')";
    $init=mysql_query($query);
}

这是代码的一部分,它基本上采用csv文件,格式化为@OP,将其转换并将所有内容转储到mysql表中。

答案 1 :(得分:0)

您有两个选择:

  1. 将数组存储为mysql中的序列化(使用列的blob类型)
  2. 将数组编码为json并将其存储在blob列的mysql中
  3. UPDATE:序列化的示例代码,请记住blob_test2表有一个blob列,其中插入了序列化数组

    $file = "_ss.csv";
    $lines = file($file);
    $count = count($lines);
    $data = array();
    $i = 0;
    foreach($lines as $value){
        $value = explode(";", $value);
        $query="INSERT INTO blob_test2 VALUES ('".serialize($value)."')";
        $init=mysql_query($query);
    }
    

答案 2 :(得分:0)

您可以执行以下步骤

  1. 将数据转换为excel格式
  2. 使用\
  3. 转义所需的字符
  4. 再次将其转换为csv
  5. 然后使用程序或任何其他导入工具导入

答案 3 :(得分:0)

$data = array();
foreach($lines as $value) {
    $value = explode(";", $value);

    $first = array_splice($value, 0, 2);
    unset($value[3]); // <---------------------- point
    foreach($value as $x){

        $first[]=$x;

        $data[] = $first;
    }
}

foreach($data as $v){
    $dump = implode(',', $v);
    $query="INSERT INTO csv_test2 VALUES ('$dump')";
    $init=mysql_query($query);
}

//mysql not good pls mysqli

答案 4 :(得分:0)

在foreach中没有查询的更好方法:

$data = array();

foreach ($lines as $value){
  // do something
  $data[] = "('".serialize($value)."')";
}

$query = mysql_query("INSERT INTO csv_test2 VALUES".implode(',', $data)."");
  • 不推荐使用MySQL扩展程序,将来会删除它,请使用MySQLi或PDO。

答案 5 :(得分:0)

首先,我建议您打印出查询。我已经对您的代码进行了一些修改以打印出查询:

$file = "_ss.csv";
$lines = file($file);
$count = count($lines);
$data = array();
$i = 0;
foreach($lines as $value){
    $value = explode(";", $value);
    $first = array_splice($value, 0, 2); 

    foreach($value as $x){

        $row = $first;
        $row[] = $x;
        $data[] = implode(',', $row);
        $dump = implode(',', $data);
        $query="INSERT INTO csv_test2 VALUES ('$dump')";
        echo $query."<br/>";
        //$init=mysql_query($query);

        $i++;
    //echo $dump."<br/>";
    }
}

在我身边,它打印类似于:

INSERT INTO csv_test2 VALUES ('a,a1,1')
  • 如果您的表csv_test2只包含一个存储类型的字段 text(可以是varchar,char,...),这个查询就可以了。
  • 但如果它包含更多需要的字段(非空,唯一,......),则此查询将不起作用。你需要写:

    INSERT INTO csv_test2(a_field_name)VALUES('a,a1,1')

  • 但是如果你想插入对应于每个字段的数组的每个元素,那么在这种情况下你的代码将不起作用。你需要像这样进行查询:

    INSERT INTO csv_test2 VALUES('a','a1','1') 因此,您需要执行$dump = implode("','", $data);