通过复选框选择通过 PHP 将 MySQL table 导出到 CSV

Export MySQL table to CSV via PHP by checkbox selection

我需要在 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
        ?>

还有 downloadcsv.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;
?>

任何帮助都会很棒,干杯

更新了我正在努力实现的截图

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

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

1st 你用复选框选项(数据库)的所有名称创建一个数组,例如

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

2nd 你遍历 $all_db 中的每个值并检查它们是否存在于 $_POST 数组中,如果存在,那么你可以导出行

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

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

如果你不想有一个静态的数据库列表(即它们将来可能有不同的名称/会有更多或更少等)然后让我知道我可以编辑我的答案如果需要 :) )

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

要知道,如果最终用户在他的 URL、

中得到一千个变量,$_GET 就会显得有点业余

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

EDIT: UPDATING ANSWER (SEE COMMENT)

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

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

然后我们将此唯一 ID 列的值赋予复选框的 "name" 属性,并使用 jquery / php 我们附加/预先添加一个静态字符串...

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

这让我们(再次使用你的例子): $_POST[] = ['rownumber_123456' => 1, 'rownumber_0000000' => 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);
      }
 }

EDIT: Updating answer for comment no.2

如果您要使用 php 遍历 html,那么旁注就很少了 (即循环遍历数据库行并以有序的方式打印出来) 然后你可能想使用循环的“:”变体,

  • 同时():
  • for() :
  • foreach() :
  • 如果 () :
  • .......

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

例如你可以这样做:

 <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 编辑为 $_POST 变量(复选框)中的所需行,如果没有,它不会'将行导出到 csv 文件中! :)

到此为止^^

EDIT 3: Troubleshooting

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

你 post 表单中的东西,(你的复选框和东西)让我们看看实际上得到了什么 posted,

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这些变量值:

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

初始结果集需要包装在POST到下一页的表单中。 复选框必须向导出脚本发送一个 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;
?>