Я пытаюсь вставить данные, выбранные из моей базы данных, в файл csv. Я здесь застрял и не знаю, почему это не работает. Это заставляет меня давать такой файл:

По какой-то причине он поместил имена столбцов в 1 поле (A1), я сейчас использую этот код:
<?php
include "includes/connection.php";
if (isset($_POST['submit'])){
$tabel = $_POST['tabel'];
$date1 = $_POST['date1'];
$date2 = $_POST['date2'];
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename = "data.csv";');
$output = fopen("php://output", "w");
fputcsv($output, array('Dev_ID', 'Barcode', 'Naam', 'Ip_adres', 'Merk', 'Model', 'CPU', 'Memory', 'Moederbord', 'Serialnummer', 'Aanschaf_dat', 'Aanschaf_waarde', 'Opmerkingen', 'Picture_dev'));
$sql = "SELECT * FROM ".$tabel." WHERE Aanschaf_dat BETWEEN ".$date1." AND ".$date2."";
$query = $conn->prepare($sql);
while($row = $query->fetch(PDO::FETCH_ASSOC))
{
fputcsv($output, $row);
}
fclose($output);
}
?>
Кто-нибудь знает, что я делаю не так?
Ваш сценарий широко открыт для Атака с использованием SQL-инъекции Даже если вы избегаете ввода, это небезопасно! Используйте подготовленные параметризованные операторыдолжным образом в API MYSQLI_ или PDO
@RiggsFolly Да, я пробовал и спасибо за вашу помощь, но на данный момент это не проблема моего вопроса
Вы ведь знаете, что $variables будет автоматически расширяться в строковый литерал в двойных кавычках, не так ли?
И эти даты следует заключать в одинарные кавычки.
И этот .""; совершенно не нужен в конце строкового литерала
Это кошмар с SQL-инъекцией, но попробуйте $sql = "SELECT * FROM $tabel WHERE Aanschaf_dat BETWEEN '$date1' AND '$date2'";
И что он ничего не достигает preparing, подобное утверждение без параметров в нем
У меня были даты, заключенные в одинарные кавычки, но ничего не помогло, даже с вашим новым запросом sql файл csv останется пустым. И я знаю, что он широко открыт для SQL-инъекций, но здесь это не имеет значения
В каком формате даты вводятся пользователем? Они должны быть YYYY-MM-DD, чтобы запрос работал
Это ГГГГ-ММ-ДД
У вас есть данные в таблице для диапазона дат, указанного пользователем
Выведите запрос, затем запустите его в phpMyAdmin или другом инструменте, который вы используете для выполнения запросов.
Запрос @RiggsFolly sql дает мне результат imgur.com/a/iooeD5e Я не уверен, но не думаю, что это будет проблемой
@RiggsFolly Я внес некоторые изменения, и теперь он выводит данные из базы данных, помещает все в поле A вместо того, чтобы каждый раз брать новое поле






Проверьте приведенный ниже код и обратите внимание на изменение в операторе SQL. Также необходимо выполнить дезинфекцию данных, чтобы предотвратить SQL-инъекцию,
<?php
include "includes/connection.php";
if (isset($_POST['submit'])){
$tabel = $_POST['tabel'];
$date1 = $_POST['date1'];
$date2 = $_POST['date2'];
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename = "data.csv";');
$output = fopen("php://output", "w");
fputcsv($output, array('Dev_ID', 'Barcode', 'Naam', 'Ip_adres', 'Merk', 'Model', 'CPU', 'Memory', 'Moederbord', 'Serialnummer', 'Aanschaf_dat', 'Aanschaf_waarde', 'Opmerkingen', 'Picture_dev'));
$sql = "SELECT * FROM $tabel WHERE Aanschaf_dat BETWEEN '$date1' AND '$date2'";
$query = $conn->prepare($sql);
while($row = $query->fetch(PDO::FETCH_ASSOC))
{
fputcsv($output, $row);
}
fclose($output);
}
?>
Об этом уже упоминалось в комментариях, но спасибо за ответ.
Добавьте Отчет об ошибках в начало файла (ов) во время тестирования сразу после открывающего тега PHP, например
<?php error_reporting(E_ALL); ini_set('display_errors', 1);, и вы сможете решать свои собственные проблемы.