通过复选框选择通过 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’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’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’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;
?>
我需要在 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’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’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’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;
?>