如何从 php 中的当前会话中获取 csv 文件?

Posted

技术标签:

【中文标题】如何从 php 中的当前会话中获取 csv 文件?【英文标题】:How to get csv file from current session in php? 【发布时间】:2021-10-23 22:08:29 【问题描述】:

逻辑是“从当前用户填写的表单中获取信息,插入数据库并以 .csv 格式文件将其(给用户)返回”。但是在 csv 文件中,数据重复两次,如本问题底部所附的屏幕截图所示。如果您遇到这种情况,请您帮帮我吗?

整个 index.php

  <?php

  session_start();
  $_SESSION['user'] = $_POST['first_name'];

  try 
       $db = new PDO('pgsql:host=localhost;dbname=test', 'someuser', '123456');
       $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
   catch(PDOException $e) 
      print $e->getMessage();
  

  if($_SERVER['REQUEST_METHOD']=='POST') 
      if(validate()) 
          process();
      
   else 
      show();
  

  function validate() 
      $phoneLength = strlen($_POST['phone']);
      if($phoneLength==11) 
              return true;
       else 
          print "Phone number must contain more than $phoneLength characters.";
      
  

  function process()
      try
          // Insert into db
          $stmt = $db->prepare("INSERT INTO personalInfo (first_name, last_name, email, phone) 
                            VALUES (?,?,?,?)");
          $stmt->execute(array($_POST['first_name'], $_POST['last_name'], 
                        $_POST['email'], $_POST['phone']));
    
       catch(PDOException $e) 
          print $e->getMessage();
      

      // Get file
      header('Content-type: text/csv');
      header('Content-disposition: attachment; filename: info.csv');

      $fh = fopen('php://output', 'wb');
      $q = $db->query("SELECT * FROM personalInfo WHERE first_name = '$_SESSION['user_fname']' ");
      while ($row = $q->fetch()) 
          fputcsv($fh, $row);
      
  

  function show()
      print<<<_html_
      <form method='POST' action='$_SERVER[PHP_SELF]'>
          <input name='first_name' type='text' placeholder='Your first name' required><br>
          <input name='last_name' type='text' placeholder='Your last name' required><br>
          <input name='email' type='email' placeholder='Your e-mail' required><br>
          <input name='phone' type='number' placeholder='Your phone number' required><br>
         <input type='submit' value='GET'>
     </form>
     _HTML_;
  

问题区域:

      // Get file
      header('Content-type: text/csv');
      header('Content-disposition: attachment; filename: info.csv');

      $fh = fopen('php://output', 'wb');
      $q = $db->query("SELECT * FROM personalInfo WHERE first_name = '$_SESSION['user_fname']' ");
      while ($row = $q->fetch()) 
          fputcsv($fh, $row);
      

它显示: Double writing each column data 为什么?

【问题讨论】:

【参考方案1】:

这在文档中有解释。 manual for the PDO fetch function 表示它接受一个名为“mode”的可选参数,这就是它对该选项的说明:

mode:控制如何将下一行返回给调用者...默认为 PDO::FETCH_BOTH

PDO::FETCH_BOTH(默认):返回一个由列名和 0 索引列号索引的数组,如结果集中返回的那样

因此,您将获得两次相同的数据,因为 PDO 会返回两次。 $row 将包含相同数据的数组 - 一次在关联(命名)字段中,一次在编号字段中。然后fputcsv 只处理整个数组,一视同仁。

为了您的目的,一个基本的编号数组就足够了,所以您可以告诉 PDO 只返回那个:

$row = $q->fetch(PDO::FETCH_NUM)

【讨论】:

以上是关于如何从 php 中的当前会话中获取 csv 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用会话ID从php mysql中的两个或多个表中获取值

如何使用 PHP 获取 CSV 文件中的总行数?

如何从加载在 sql/plsql 表中的 csv 文件中获取值

如何从不同的会话中获取 Windows 环境变量的当前值

Data Studio Community Connector - 如何从 Google Cloud Storage 中的 CSV 文件中获取数据?

从 CSV 文件加载数据以进行负载测试并为每个用户保持会话