У меня проблема. Я пытаюсь получить некоторые данные из базы данных в таблицу .csv.
$fn=fopen($path.$filename, "w");
$addstring = file_get_contents($path.$filename);
$addstring = 'Azonosito;Datum;Ido;Leiras;IP-cim;allomasnév;MAC-cim;Felhasznalonev;Tranzakcioazonosito;Lekerdezes eredmenye;Vizsgalat ideje;Korrelacios azonosito;DHCID;';
/*$addstring .= "\n";*/
$sql="select * from dhcpertekeles.dhcpk";
$result =mysqli_query($conn, $sql);
if ($result=mysqli_query($conn,$sql))
{
while ($row=mysqli_fetch_row($result))
{
$addstring .= "\n".$row[0].";".$row[1].";".$row[2].";".$row[3].";".$row[4].";".$row[5].";".$row[6].";".$row[7].";".$row[8].";".$row[9].";".$row[10].";".$row[11].";".$row[12].";";
};
};
/*file_put_contents($path.$filename, $addstring);*/
fwrite($fn, $addstring);
fclose($fn);
Данные представлены в следующем формате:
Первая addstring содержит имена столбцов и не имеет проблем
вторая (addstring. =) содержит данные:
ID ($ row [0]), Дата ($ row [1]), Время ($ row [2]), Описание ($ row [3]), IP ($ row [4]), Имя компьютера ($ row [5]), MAC ($ row [6]), пользователь ($ row [7]) (пусто), Transactionid ($ row [8]), результат запроса ($ row [9]), время запроса ($ row [10]), идентификатор корреляции ($ row [11]) (пусто), DHCID ($ row [12]) (пусто)
В основном это ежедневные данные DHCP-сервера, загружаемые в базу данных. Теперь код работает, он пишет все, что я хочу в CSV, но есть 2 проблемы.
1, код по какой-то необъяснимой причине вставляет пустую строку в таблицу csv между строками, которые содержат данные. Удаление $ row [12] исправляет это. Я попытался удалить специальные символы, преобразовать пробелы во что-то, что можно увидеть, и даже преобразовать пустую строку в то, что можно увидеть. Тем не менее, на самом деле ничего не получалось, я даже попробовал file_puts_content (то же самое для второй проблемы) вместо fwrite, но ничего. Продолжает происходить одно и то же. Если я уберу \ n, это будет работать, но 2-я строка будет смещена вправо на 1 столбец.
2, по некоторым причинам, последние 2 символа удаляются из CSV. Строка, которая должна быть вставлена в CSV, по-прежнему содержит указанные 2 символа, прежде чем записать ее в файл. Пробовал оба fwrite и file_puts_content.
Что касается формата .csv, столбцы данных делятся на; и строки по \ n.
Также попытался прочитать файл с помощью libre office и excel, думая, что это может быть excel, который тратит деньги, но нет.
Попробуйте использовать fputcsv()
функция. Я не тестировал следующий код, но думаю, что он должен работать.
$file = fopen($path . $filename, 'w');
$header = array(
'Azonosito',
'Datum',
'Ido',
'Leiras',
'IP-cim',
'allomasnév',
'MAC-cim',
'Felhasznalonev',
'Tranzakcioazonosito',
'Lekerdezes eredmenye',
'Vizsgalat ideje',
'Korrelacios azonosito',
'DHCID'
);
fputcsv($file, $header, ';');
$sql = "select * from dhcpertekeles.dhcpk";
$result = mysqli_query($conn, $sql);
if ($result = mysqli_query($conn, $sql)) {
while ($row = mysqli_fetch_row($result)) {
fputcsv($file, $row, ';');
}
}
fclose($file);
$addstring = file_get_contents($path.$filename)
не делает ничего, потому что вы перезаписываете эту переменную в следующей строке.
Чтобы удалить лишнюю строку на 12, вы пытались удалить \ n А ТАКЖЕ с чем-то вроде:
$row[12] = strtr($row[12], array("\n"=>'', "\r"=>''))
;
Вы также можете проверить, какие символы ascii вы получаете в $ row [12] с помощью этой функции, взятой с сайта php:
function AsciiToInt($char){
$success = "";
if(strlen($char) == 1)
return "char(".ord($char).")";
else{
for($i = 0; $i < strlen($char); $i++){
if($i == strlen($char) - 1)
$success = $success.ord($char[$i]);
else
$success = $success.ord($char[$i]).",";
}
return "char(".$success.")";
}
}
Другой совет — база данных, которая возвращает UTF-8 или UTF-16, и вы теряете некоторые символы в текстовом файле.
Попробуйте посмотреть на это с mb_detect_encoding
функция.