[英]Export multiple MySQL results to CSV
我在下面有以下 PHP 腳本。
它檢查person表中引用PK001
和PK002
的行。
當我在下面運行我的腳本時,output 如下:
ID,Reference,Email
1,PK001,mcg@gmail.com
我希望 output 是:
ID,Reference,Email
1,PK001,mcg@gmail.com
2,PK002,mcg@hotmail.com
~
PHP
$data = array("PK001","PK002");
$count = count($data);
foreach ($data as $value) {
$sql = "SELECT * FROM person WHERE reference = '$value'";
$result = $con->query($sql);
$csvheaders = ["ID","Reference","Email"];
$fp = fopen('php://output', 'w');
if ($fp && $result) {
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename="export.csv"');
header('Pragma: no-cache');
header('Expires: 0');
fputcsv($fp, $csvheaders);
while ($row = $result->fetch_array(MYSQLI_NUM)) {
fputcsv($fp, array_values($row));
}
die();
}
}
die();
有人可以解釋一下我是如何解決這個問題的嗎?
您可以使用IN()
與多個值進行比較。 有關IN()
的文檔,請參閱https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html#operator_in 。
您還應該使用查詢參數。 請不要將值直接插入到 SQL 表達式中。 這是生成不安全、錯誤代碼的好方法。
數組中的每個值都需要一個單獨的參數占位符。 您不能對值列表使用單個參數。
這是我的寫法:
$data = ["PK001","PK002"];
$placeholders = implode(",", array_fill(1, count($data), "?"));
$sql = "SELECT ID, reference, email FROM person WHERE reference IN ({$placeholders})";
$stmt = $con->prepare($sql);
$stmt->bind_param(str_repeat("s", count($data)), ...$data);
$stmt->execute();
$result = $stmt->get_result();
然后像您所做的那樣繼續循環遍歷$result
。
僅供參考,PDO 更容易,因為您不需要進行任何綁定。 只需將數組傳遞給execute()
:
$stmt = $con->prepare($sql);
$stmt->execute($data);
我寧願在任何 PHP 項目中使用 PDO 而不是 mysqli。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.