【问题标题】:Export MySQL table to CSV via PHP by checkbox selection通过复选框选择通过 PHP 将 MySQL 表导出到 CSV
【发布时间】:2016-09-30 08:13:02
【问题描述】:

我需要在 PHP 页面上显示调查结果列表,然后将它们导出到 CSV 文件。该列表还可以作为一个摘要,可以单击查看完整结果。

我已经对所有内容进行了排序,但现在我需要通过检查 bx 选择来导出 CSV,这样我们就不需要每次只下载我们需要的整个数据库。

到目前为止我的代码如下。

<div class="resultsList">

            <h1>PEEM Results List</h1>
            <a class="exportCSV" href="https://domain.com/downloadcsv.php">Export to CSV</a>
            <!-- Export CSV button -->
            <h3 class="resultsbydate">All results by date</h3>


                <div class="resultsListHeader">
                    <div class="clientidTab">Agency</div>
                    <div class="clientidTab">Family ID</div>
                    <div class="clientidName">Name</div>
                    <div class="clientidTab">Date</div>
                    <div class="clientidTab"></div>
                </div>
                <div class="entriesListMain">
                    <?php
                    $connection = mysql_connect("localhost", "username", "password"); // Establishing Connection with Server
                    $db = mysql_select_db("database_name", $connection); // Selecting Database
                    //MySQL Query to read data
                    $query = mysql_query("select * from results ORDER BY peemdate DESC", $connection);
                    while ($row = mysql_fetch_array($query)) {
                    echo "<div><input type=\"checkbox\" name=\"xport\" value=\"export\"><span>{$row['client_id']}</span> <span>{$row['family_id']}</span> <span>{$row['firstname']} {$row['lastname']}</span> <span>".date("d F Y", strtotime($row['peemdate']))."</span>";
                    echo "<span><a class=\"parents-button\" href=\"peem-parent-repsonses.php?id={$row['survey_id']}\"><strong>Parent&rsquo;s Review</strong></a></span>";
                    echo "<span><a href=\"peem-repsonses.php?id={$row['survey_id']}\"><strong>View Results</strong></a></span>";
                    echo "</div>";
                    }
                    ?>
                </div>
        </div>

        <?php
        if (isset($_GET['id'])) {
        $id = $_GET['id'];
        $query1 = mysql_query("select * from results where survey_id=$id", $connection);
        while ($row1 = mysql_fetch_array($query1)) {
        ?>

        <?php
        }
        }
        ?>

        <?php
        mysql_close($connection); // Closing Connection with Server
        ?>

还有下载csv.php

<?php
$conn = mysql_connect("localhost","username","password");
mysql_select_db("databasename",$conn);

$filename = "peem_results.csv";
$fp = fopen('php://output', 'w');

$query = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='realwell_peemfinal' AND TABLE_NAME='results'";
$result = mysql_query($query);
while ($row = mysql_fetch_row($result)) {
    $header[] = $row[0];
}   

header('Content-type: application/csv');
header('Content-Disposition: attachment; filename='.$filename);
fputcsv($fp, $header);

$query = "SELECT * FROM results";
$result = mysql_query($query);
while($row = mysql_fetch_row($result)) {
    fputcsv($fp, $row);
}
exit;
?>

对此的任何帮助都会很棒,干杯

更新了我想要实现的截图

【问题讨论】:

  • 这应该是'checkbox'选择而不是'check bx'。

标签: php mysql csv export-to-csv


【解决方案1】:

因此,如果我理解正确,您只需能够选中复选框以选择要插入 csv 文件的数据库 ($rows)....

您选中的每个复选框都将位于 $_POST 变量中,因此:

首先你创建一个包含所有复选框选项(数据库)名称的数组,例如

$all_db = ['database1', 'database2', 'database3'];

第二次循环遍历$all_db 中的每个值并检查它们是否存在于 $_POST 数组中,如果存在,则可以导出该行

foreach( $all_db as $db_check ) {
     if ( array_key_exists( $db_check, $_POST ) {
          // EXPORT TO CSV
      }
 }

别忘了!这意味着复选框的“名称”属性应该是数据库的名称。

如果您不想拥有数据库的静态列表(即将来它们可能具有不同的名称/可能会更多或更少等,请告诉我,如果需要,我可以编辑我的答案: ) )

(如果你使用 $_GET 变量,那么你可以做同样的事情,只需将 $_POST 更改为 $_GET)

尽管 $_GET 对最终用户来说有点业余,如果他的 URL 中有一千个变量,

$_POST 通常是更好的选择,因为它对最终用户来说是隐藏的和更清晰的......

编辑:更新答案(见评论)

所以基本上你需要人们能够选择他们从你那里导出哪些行 dB... 首先,这意味着我们需要为每一行设置一个唯一的 ID,

这可以是仅用于该目的的列(即具有自动增量和唯一属性的 ID 列) 或者这可以是您已经拥有的列,只需确保它是唯一的列,这样我们就不会得到重复值(您将在下面看到原因)

然后我们将这个唯一 ID 列的值赋予复选框的“名称”属性,并使用 jquery / php 我们附加 / 前置一个静态字符串...

例如,使用您的家庭 ID: "rownumber_" + $family_ID

这让我们(再次使用您的示例): $_POST[] = ['rownumber_123456' =&gt; 1, 'rownumber_0000000' =&gt; 1, .....]

那么在您的 PHP 文件中,您只需执行以下操作即可将正确的行添加到您的 CSV:

 while($row = mysql_fetch_row($result)) {
      if ( array_key_exists($row['your_row_id'], $_POST) {
           fputcsv($fp, $row);
      }
 }

-- 再次使用带有 family_ID 的示例:--

 while($row = mysql_fetch_row($result)) {
      if ( array_key_exists($row['family_ID'], $_POST) {
           fputcsv($fp, $row);
      }
 }

编辑:更新第 2 条评论的答案

如果你打算使用 php 循环浏览 html (即循环通过数据库行并以有序的方式打印出来) 然后你可能想使用循环的“:”变体,

  • While():
  • for() :
  • foreach():
  • 如果():
  • .....

这些变体允许yu关闭“:”之后的php标签,并且你放在条件/循环中的whataver html / css / php / jquery将像正常一样执行......

例如你可以这样做:

 <ul>
 <?php foreach ($row as $columnkey => $columnvalue): ?>
      <img src="whateveryouwant"?>
      <li class="<?php echo $columnkey;?>">This is my value: <?php echo $columnvalue; ?></li>
 <?php endforeach; ?>
 </ul>

当你这样做时,它会更干净,并且使用双引号和所有这些东西不会有任何问题:)

所以在这里使用该方法是您显示的列表在代码中的样子:

    <div class="entriesListMain">
    <?php
                $connection = mysql_connect("localhost", "username", "password"); // Establishing Connection with Server
                $db = mysql_select_db("database_name", $connection); // Selecting Database
                //MySQL Query to read data
                $query = mysql_query("select * from results ORDER BY peemdate DESC", $connection);
                while ($row = mysql_fetch_array($query)) : 
    ?>


                  <div>
                      <input type="checkbox" name="<?php echo $row['family_id']; ?>" value="export">
                      <span><?php echo $row['client_id']; ?></span> 
                      <span><?php echo $row['family_id']; ?></span> 
                      <span><?php echo $row['firstname'] . " " . $row['lastname']; ?></span> 
                      <span><?php echo date("d F Y",strtotime($row['peemdate']); ?></span>;
                      <span>
                        <a class="parents-button" href="peem-parent-repsonses.php?id=<?php echo $row['survey_id']; ?>">
                        <strong>Parent&rsquo;s Review</strong>
                        </a>
                      </span>
                      <span>
                        <a href="peem-repsonses.php?id=<?php echo $row['survey_id']; ?>">
                        <strong>View Results</strong>
                        </a>
                      </span>
                    </div>


                <?php endwhile; ?>
 </div>

像这样,复选框将获取家庭 ID 的名称,因此您可以在 csv.php 中使用以下代码:

  while($row = mysql_fetch_row($result)) {
       if ( array_key_exists($row['family_ID'], $_POST) {
            fputcsv($fp, $row);
       }
  }

从现在开始,它将检查每一行,SQL 行的家庭 ID 是否作为所需行发布在 $_POST 变量(复选框)中,如果没有,它不会将该行导出到 csv 文件中! :)

那么你就去吧^^

编辑 3:故障排除

所以你在这个函数中做了几件事, 表格, 您的 html 表单中的复选框是否在其名称属性中包含 family_ID ? (即&lt;input type="checkbox" name="&lt;?php echo $row['family_id']; ?&gt;"....检查name属性是否真的填充)

您从表单中发布内容,(您的复选框和内容)所以让我们看看实际发布的内容,

die(print_r($_POST)); - 这意味着你希望 php 在这一行之后死掉(完全停止工作),然后按原样打印出一个变量(你会看到的那种 xml 格式)

那么你会得到一大堆信息,如果你想以格式良好的方式查看这些信息,只需右键单击其上的检查元素 :)

然后看看你的复选框是如何从 $_POST 变量中出来的, (他们应该以 family_ID 作为键,值为 1)

如果一切正常,请检查您的row['family_ID'] 变量,看看family_ID 是否填写正确,对您的整个$row 变量执行相同操作,实际上检查您在csv.php 中使用的每个变量,然后检查为什么您要搜索的数组中不存在键:)

另外不要忘记检查您填写的array_key_exists( 有一个key FIRST 和一个array[] LAST )

我无法直接帮助您,因为这可能是您的表单中的错误变量或错误,因此请尝试自己查找此内容,如果仍然没有,请发布这些变量值:

  • $_POST
  • $row
  • 以及表单的完整 HTML

【讨论】:

  • 嗨@Rafael Lambelin,感谢您的回复。是的,你在正确的轨道上,但它只是来自 1 个数据库。我只需要被允许选择需要导出数据库中的哪些条目,但在重写我的代码以实现这一点时遇到了麻烦。
  • 感谢您的更新,您的回答很好,但我的 php 技能很弱,我不知道如何实现这一点。干杯
  • 你能告诉我哪一部分你不能实现吗?
  • 标签之间的所有内容哈哈。我的技能更多的是前端,所以我不擅长编写 php 我更多的是复制和粘贴示例,并根据我的需要进行更改。
  • 我的开始方式对我来说是一样的 :),最重要的是应该发布所有内容,只需根据您的需要更改设置(即 ID、类、sql 主机等)
【解决方案2】:

初始结果集需要包装在一个表单中,该表单可以 POST 到下一页。 Checkbox 必须向导出脚本发送一个 id 数组。

<input type='checkbox' name='xport[]' value='ID_OF_THE_ROW_HERE'>

xport 后面的 [ ] 表示 $_POST['xport'] 将是一个值数组。


导出页面可以将该 id 数组折叠成一个逗号分隔的字符串并用于查询:

SELECT * FROM results WHERE id IN (4,7,11,30)

<form method="POST" action="downloadcsv.php">

        <h1>PEEM Results List</h1>
        <a class="exportCSV" href="https://domain.com/downloadcsv.php">Export to CSV</a>
        <!-- Export CSV button -->
        <h3 class="resultsbydate">All results by date</h3>


            <div class="resultsListHeader">
                <div class="clientidTab">Agency</div>
                <div class="clientidTab">Family ID</div>
                <div class="clientidName">Name</div>
                <div class="clientidTab">Date</div>
                <div class="clientidTab"></div>
            </div>
            <div class="entriesListMain">
                <?php
                $connection = mysql_connect("localhost", "username", "password"); // Establishing Connection with Server
                $db = mysql_select_db("database_name", $connection); // Selecting Database
                //MySQL Query to read data
                $query = mysql_query("select * from results ORDER BY peemdate DESC", $connection);
                while ($row = mysql_fetch_array($query)) {
                echo "<div><input type='checkbox' name='xport[]' value='{$row['client_id']}'><span>{$row['client_id']}</span> <span>{$row['family_id']}</span> <span>{$row['firstname']} {$row['lastname']}</span> <span>".date("d F Y", strtotime($row['peemdate']))."</span>";
                echo "<span><a class=\"parents-button\" href=\"peem-parent-repsonses.php?id={$row['survey_id']}\"><strong>Parent&rsquo;s Review</strong></a></span>";
                echo "<span><a href=\"peem-repsonses.php?id={$row['survey_id']}\"><strong>View Results</strong></a></span>";
                echo "</div>";
                }
                ?>
            </div>

         </form>

将 $row['client_id'] 更改为正确的值

然后在导出脚本中:

<?php
/*
Expecting $_POST['xport'] array of row ids
*/
if( !isset($_POST['xport']) OR !is_array($_POST['xport']) ) {
    exit('No rows selected for export');
}

$conn = mysql_connect("localhost","username","password");
mysql_select_db("databasename",$conn);

$filename = "peem_results.csv";
$fp = fopen('php://output', 'w');

$query = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='realwell_peemfinal' AND TABLE_NAME='results'";
$result = mysql_query($query);
while ($row = mysql_fetch_row($result)) {
    $header[] = $row[0];
}   

header('Content-type: application/csv');
header('Content-Disposition: attachment; filename='.$filename);
fputcsv($fp, $header);

//Cast all ids to integer
$ids = $_POST['xport'];
array_walk($ids, function(&$value, $key) {
    $value = (int)$value;
});

$ids = implode(', ', $ids);

$query = "SELECT * FROM results WHERE id IN ($ids)";
$result = mysql_query($query);
while($row = mysql_fetch_row($result)) {
    fputcsv($fp, $row);
}
exit;
?>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    • 2011-12-04
    • 2013-08-30
    • 2011-11-12
    • 2019-05-13
    • 2018-12-03
    • 2019-11-01
    相关资源
    最近更新 更多