簡體   English   中英

導出多個MySQL結果到CSV

[英]Export multiple MySQL results to CSV

我在下面有以下 PHP 腳本。

它檢查person表中引用PK001PK002的行。

當我在下面運行我的腳本時,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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM