【问题标题】:Writing a PHP file to read from CSV and execute SQL Query编写 PHP 文件以从 CSV 读取并执行 SQL 查询
【发布时间】:2010-10-30 14:09:19
【问题描述】:

我想要一个 PHP 脚本以以下格式从 CSV 文件中读取内容

id, sku
1,104101
2,105213

一共有1486个条目,我认为最好使用for循环而不是while !EOF。

之后,我想对名为 m118 的数据库,表 catalog_product_entity 执行 SQL 查询。

查询类似于 UPDATE sku=$csvSku WHERE id=$csvId

作为 PHP 和 MySQL 的新手,我不知道从哪里开始编码。

【问题讨论】:

    标签: php mysql csv


    【解决方案1】:

    fgetcsv 可用于解析 CSV 文件。 mysql_query 方法可用于执行 MySQL 查询。

    完整代码如下:

    <?php
    $fin = fopen('catalog_product_entity.csv','r') or die('cant open file');
    $link = mysql_connect('localhost', 'm118', 'pw');
    If (!$link) {
        die ('Could not connect: ' . mysql_error());
    }
    @mysql_select_db('m118') or die ('Unable to select database');
    echo "Connection succeeded <br />\n";
    while (($data=fgetcsv($fin,1000,","))!==FALSE) {
        $query = "UPDATE catalog_product_entity SET sku='$data[1]' WHERE entity_id='$data[0]'";
        mysql_query($query);
        echo "Record updated <br />\n";
        }
    fclose($fin);
    mysql_close();
    ?>
    

    【讨论】:

    • 从 0 到编写代码是一项不错的成就。恭喜。
    • 感谢 Cannonade 和 Goblyn。学习新东西总是感觉很棒!
    • SQL 语法在最新版本的 PHP 中已经过时。例如。 php.net/manual/de/function.mysql-query.php
    【解决方案2】:

    您需要执行以下操作:

    $filename = "file_name_on_server.csv"
    $fp = fopen( $filename ,"r");
    while ($line = fgets ($fp))
    {
    

    现在使用Split 获取逗号分隔值的数组

        $arr = split (",", $line);
    

    现在您有了一个用于 $line 上逗号分隔值的数组。您可以进行简单的字符串格式化以将这些值粘贴到 SQL 查询中。

        $query = "INSERT INTO `TableBlah` (Field1, Field2) VALUES (" . $arr[0] . "," . $arr[1] . ")";
    

    使用mysql api 将这些查询发送到数据库

    }
    fclose($fp);
    

    【讨论】:

      【解决方案3】:

      学得好:)

      您现在或许应该了解 PHP 中的 PDO,因为它(在我看来)是在 PHP 中执行 MySQL 查询的最佳、最安全和最快的方法:

      <?php
      $fin = fopen('catalog_product_entity.csv','r') or die('cant open file');
      try {
          $link = new PDO('mysql:dbname=m118;host=localhost', 'm118', 'pw');
          echo 'Connection succeeded <br />' . PHP_EOL;
          $stmt = $db->prepare('UPDATE catalog_product_entity SET sku = :sku WHERE entity_id = :id');
          //Only give the length parameter if you **KNOW** that no line will be longer than that
          while (($data=fgetcsv($fin,1000,","))!==FALSE) {
              if ($stmt->execute(array(':sku' => $data[1], ':id' => $data[0]))) {
                  echo 'Record updated <br />' . PHP_EOL;
              } else {
                  $err = $stmt->errorInfo();
                  echo 'Update Failed: ' . $err[2] . PHP_EOL;
              }
          }
      } catch (PDOException $e) {
          echo 'Connection failed: ' . $e->getMessage();
      }
      fclose($fin);
      

      与您的相比,PDO 脚本具有以下优势:

      • 更安全:PDO 会根据需要自动引用插入的数据。这可以防止 SQL 注入攻击。
      • 更快:PDO缓存查询(在prepare中),然后使用execute中传入的参数。
      • 便携:PDO 可以连接到各种类型的 DB,而不仅仅是 MySQL,所以如果您需要切换 DB,它会更容易。

      【讨论】:

        【解决方案4】:

        好吧,我不会为你编写代码,因为如果我这样做你就不会学习。但我会为你指出正确的方向。查看此链接http://us.php.net/fgetcsv,了解有关在 PHP 中解析 CSV 文件的信息。一个简单的谷歌搜索还应该为您提供将其输入 MySQL 表的必要信息。

        【讨论】:

        • 嘿伙计,谢谢,实际上我自己已经弄清楚了。意识到 PHP 非常简单。
        【解决方案5】:

        Goblyn27 是正确的。看看 php.net 上的 fgetcsv() 和 mysql_query()。文档中甚至还有如何执行此操作的示例。

        【讨论】:

          【解决方案6】:
          <?php
          include ("dbsanjog.php");
          $uploadedfile=$_REQUEST['uploadedfile'];
            $target_path = "dataupload/";
            $user=$_REQUEST['username'];
          $target_path = $target_path.$user.".csv"; 
          
          if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) 
          {
              echo "The file ".  basename( $_FILES['uploadedfile']['name']). "has been uploaded";
          } 
          
          //echo $target_path; die;
          //$row = 1;
          $handle = fopen($target_path, 'r');
          //$sql="update agents_det set where user='$user'";
          
          
          while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) 
          {
              $query = "UPDATE agents_det SET contact='$data[3]' WHERE user='$user'";   
          
          }
          
          fclose($handle);
          //mysql_query($test);
          //echo ($test[1]); die;
          //echo $test; die;
          
          
          ?>
          

          【讨论】:

            猜你喜欢
            • 2013-09-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-07-28
            • 2018-10-11
            • 1970-01-01
            • 1970-01-01
            • 2019-06-01
            相关资源
            最近更新 更多