我已经搜索了几个小时,试图找到这个问题的简单答案。我确信它在很多方面都被其他答案所涵盖,至少部分是这样。我需要一个明确的答案,具体到我正在做的事情,因为我很难从一堆其他格式和结构不同的问题/答案中找到一个对我有用的答案。
我有一个表单,它发布了一系列结果,这些结果将用作mysql查找循环的关键字。这工作得很好——我的帖子产生了一个成功的数组。例如:
$payarr = $_POST['pay'];
print_r($payarr);
结果:
Array ( [0] => 12 [1] => 7 [2] => 1 )
这很好,因为我想运行一个mysqli进程,选择claim_id是$payarr中每个值的行。然后,我想使用fputcsv将这些行中的每一行完全写入一个CSV文件中,该文件以运行的日期和时间唯一命名。
我有一些代码片段不起作用,我在试图拼凑出一些起作用的东西时感到有点沮丧。有人能告诉我如何有效地做到这一点吗?
目前,我的代码看起来是这样的(但失败得很惨):
<?php
include ("../conf/dbconfig.php");
include ("../conf/funcs.php");
include ("../conf/privs.php");
if($privs == 500) {
$view = $_POST['view'];
$payarr = $_POST['pay'];
$ts = date('Ymd-His');
print_r($payarr); //Testing to make sure our array to select from has arrived here ok.
//ob_start();
$fp = fopen('../csv/ResultsFile_'.$ts.'.csv', 'w');
foreach($payarr as $val) {
$result = mysqli_query($con, "'SELECT * FROM claims' WHERE claim_id='$val'");
//$row = mysqli_fetch_array($result, MYSQLI_ASSOC);
while ($row = mysqli_fetch_array($result)) {
echo $payarr;
echo $val;
//fputcsv($fp, $row);
print_r($row);
}
}
fclose($fp);
// return ob_get_clean();
} else {
header("Location: http://www.google.com.au/");
die;
}
?>
我愿意(也很高兴)重写整个东西,只要它有效,所以任何帮助和建议都非常感谢!
提前谢谢。
BTW-$view值在这个过程中并不重要,但它在这里,因为一旦一切正常,它将被传递回结果头。
一些粗略的建议(您可能需要调整):
1) 将查询更改为对可能的值使用IN
,因此您只需执行一个DB查询:
$result = mysqli_query($con, "SELECT * FROM claims WHERE claim_id IN (" . implode(",",$payarr) . ")");
2) 确保你确实得到了一个DB结果,而不是仅仅假设:
if(!$result || mysqli_num_rows($result) == 0) {
die("We didn't get any results from the DB!"); // Obviously you'll want better error handling
}
3) 现在你可以打开你的文件,知道你需要它。一定要验证它是否有效,因为你很容易遇到权限问题:
$fp = fopen('../csv/ResultsFile_'.$ts.'.csv', 'w');
if(!$fp) {
die("We couldn't open the CSV file for writing, check permissions!"); // Obviously you'll want better error handling
}
4) 现在循环浏览DB结果并存储它们:
while ($row = mysqli_fetch_array($result)) {
fputcsv($fp, $row);
}
5) 您的CSV文件需要标题行吗?如果是这样,请将mysqli_fetch_array()
更改为mysqli_fetch_assoc()
,并将其粘贴在循环中:
while ($row = mysqli_fetch_assoc($result)) {
if(!isset($header)) {
$header = array_keys($row);
fputcsv($fp, $header);
}
fputcsv($fp, $row);
}
6) 现在才应该关闭你的文件(在你的代码中,你是在foreach
循环中完成的):
fclose($fp);
7) 消毒$payarr
。它可以简单到:
$payarr = is_array($_POST['pay']) ? array_map('intval', $_POST['pay']) : array();
你可能还想做更多的事情。但至少可以保证只有整数值的数组(只要没有0的claim_id
值,数组中有零是无害的)。
希望这能有所帮助,至少可以找到代码出现故障的地方。