【问题标题】:Get each array into an SQL query将每个数组放入 SQL 查询中
【发布时间】:2016-05-18 07:39:05
【问题描述】:

问题:

将从文本文件生成的每个数组放入 SQL 查询中。我有一个包含此类机场信息行的文本文件:https://abc-supervisor.c9users.io/airports.txt

如果您不想点击链接,这里有一个示例:

1,"Goroka","Goroka","Papua New Guinea","GKA","AYGA",-6.081689,145.391881,5282,10,"U","Pacific/Port_Moresby"
2,"Madang","Madang","Papua New Guinea","MAG","AYMD",-5.207083,145.7887,20,10,"U","Pacific/Port_Moresby"
3,"Mount Hagen","Mount Hagen","Papua New Guinea","HGU","AYMH",-5.826789,144.295861,5388,10,"U","Pacific/Port_Moresby"

我正在尝试将每个值放入 SQL 表中。

PHP:

<?php
    $lines = file('airports.txt');

    echo '<xmp>';

    $airport = array();

    foreach($lines as $row) 
    {
      $airport = str_replace('"', '', explode(",", $row));
      print_r($airport);
    }

    echo '</xmp>';
?>

输出:

Array
(
    [0] => 1
    [1] => Goroka
    [2] => Goroka
    [3] => Papua New Guinea
    [4] => GKA
    [5] => AYGA
    [6] => -6.081689
    [7] => 145.391881
    [8] => 5282
    [9] => 10
    [10] => U
    [11] => Pacific/Port_Moresby

)
Array
(
    [0] => 2
    [1] => Madang
    [2] => Madang
    [3] => Papua New Guinea
    [4] => MAG
    [5] => AYMD
    [6] => -5.207083
    [7] => 145.7887
    [8] => 20
    [9] => 10
    [10] => U
    [11] => Pacific/Port_Moresby

)

期望的输出:

将每个值插入 SQL 中的一行。谢天谢地,如果有人能指出正确的方向。

【问题讨论】:

    标签: php mysql sql-server file foreach


    【解决方案1】:

    我假设您想读取 CSV 文件并将每一行加载到数据库表的一行中。

    如果 MySQL 服务器可以访问该文件,则使用 LOAD DATA INFILE 是最简单的方法。像这样的东西(未经测试,不是我经常使用的东西)

    <?php
    $mysqli = new mysqli("localhost", "my_user", "my_password", "world");
    
    $mysqli->query("LOAD DATA INFILE 'airports.txt' 
                    INTO TABLE expenses  
                        FIELDS TERMINATED BY ',' 
                               OPTIONALLY ENCLOSED BY '\"'
                        LINES  TERMINATED BY '\\n' 
                    (col0, col1, col2, col3, col4, col5, col6, col7, col8, col9, col10, col11)");
    

    但假设您可能希望事先对某些值进行一些其他处理,或者无法从 MySQL 访问该文件,那么您可能只想手动插入每一行(请注意,您可以插入多行一次会更有效率,但这是一个单独的问题)。

    <?php
    
    $mysqli = new mysqli("localhost", "my_user", "my_password", "world");
    
    if (($handle = fopen('airports.txt', "r")) !== FALSE) 
    {
        while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) 
        {
            if ($stmt = $mysqli->prepare("INSERT INTO some_table(col0, col1, col2, col3, col4, col5, col6, col7, col8, col9, col10, col11) VALUES(?,?,?,?,?,?,?,?,?,?,?,?)")) {
                $stmt->bind_param("isssssddiiss", $data[0], $data[1], $data[2], $data[3], $data[4], $data[5], $data[6], $data[7], $data[8], $data[9], $data[10], $data[11]);
                $stmt->execute();
            }   
        }
        fclose($handle);
    }
    

    【讨论】:

    • 感谢您的努力,但不幸的是,没有一个解决方案适用于 Cloud9。
    • 什么是cloud9?某种云存储?您是否有一个包含此文件的单独云存储和一个包含脚本的不同服务器?
    • 我立刻后悔我的话,它运作良好。只需要修改 PDO 的代码。没注意你用过mysqli。
    【解决方案2】:

    json 编码存储在数据库中

    foreach($lines as $row) 
    {
      $airport = str_replace('"', '', explode(",", $row));
      $json = json_encode($airport );
      //Code to store $json in database
    }
    

    当您检索数据时,您可以使用 json_decode 对其进行解码。

    if you want to store field wise you can do this
    
        foreach ($airport as $key => $field) { 
          for($i=0;$i<11;$i++){
           if($key == 'i') {
             $value[$i] = $field; }
    
        $sql = "INSERT INTO table name (fields1,fields2,...) values ($value[0],$value[1]...); }
    

    【讨论】:

    • 但是如果他想单独对每个字段进行查询呢?将数组存储为 json 对象时无法做到这一点。
    • 一旦将值存储在数据库中,稍后您就可以解码该值并做任何您想做的事情。他的查询很简单,他只想将数据存储在数据库中。
    • @teeyo 这正是我要找的。抱歉,如果我不清楚这一点。
    • @kexxcream 您尝试了第二种解决方案吗?
    • @AmitRay 我刚刚做了,当你回显 $value[0] 或 $value[1] 时只输出第一个字母。
    【解决方案3】:
    foreach ($airport as $key => $value)
       {
         $sql = "INSERT INTO table name (fields1,fields2,...) values    ($value[0],$value[1]...)
       }
    

    【讨论】:

    • 这不起作用,我尝试在输入它们之前先输出不同的值,它只输出每个键的第一个字母。
    • 这段代码的问题是什么 ($airport as $value) { $sql = "INSERT INTO table name (fields1,fields2,...) values ($value[0],$value[ 1]...) }
    • 只显示每个值的第一个字母。
    • 你的意思是 $value 只得到第一个字母
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多