Я пытаюсь записать данные, полученные из запроса SQL, в текстовый файл с разделителями табуляции. Но есть проблема, что если есть пустая ячейка, она не регистрируется. и просто записывает следующий текст в пустую ячейку.
данные базы данных:
id text 2ndText
1 1t1 2t1
2 2t2
3 1t3 2t3
вывод excel:
id text 2ndText
1 1t1 2t1
2 2t2
3 1t3 2t3
код, который мы используем, следующий:
while ($row=mysql_fetch_row($Recordset1))
{
$line='';
$fc=0;
for ($i=0;$i<$fields;$i++)
{
if (substr(strtoupper(mysql_field_name($Recordset1,$i)),0,7)! = "DBSTACK")
{
if (strtoupper($_POST['checkbox'.$fc])==strtoupper(mysql_field_name($Recordset1,$i)))
{
$value=$row[$i];
if ((!isset($value)) | ($value == ""))
{
$value = "\t";
} else
{
$value=str_replace('"','""',$value);
$value='"'.$value.'"'."\t";
}
$line.=$value;
}
$fc++;
}
}
$data.=trim($line)."\n";
}
$data=str_replace("\r","",$data);
$TargetFileName = "temp/".session_id().time().".xls";
$target=fopen($TargetFileName,"wb");
$XLData=$header."\n".$data;
fwrite($target,$XLData);
fclose($target);
где $Recordset1 - результат запроса
В моем поиске решения это оказался возможным решением, но это часто используемый фрагмент кода, поэтому я не хочу, чтобы он слишком сильно менялся. Так есть ли более простое решение?
Изменение значения на na \ t, если ячейка пуста, может быть решением, но это грязно.
Любые идеи?






Я не собираюсь касаться кода вашей базы данных десятифутовым шестом. Вы используете API базы данных, который устарел в течение многих лет; альтернативы доступны уже десять лет. Используй их.
Итак, мое первое предложение - использовать правильный API базы данных, который возвращает массив строк, индексированных по имени столбца. Намного легче пройти через цикл.
Я также предлагаю, чтобы ваш запрос к базе данных выбирал только нужные вам столбцы вместо SELECT *.
Если вы хотите написать файл CSV (технически TSV, но это нормально), вы должны использовать встроенная функция fputcsv(), который избавит вас от необходимости создавать собственный модуль записи CSV и позволит вам работать с массивами вместо строк.
Вы также должны сохранить его с расширением csv, чтобы избежать ошибок при попытке открыть его в Excel.
Но как насчет проблемы, о которой вы спрашивали? Вы не пишете значение, когда есть пустое поле, только разделитель табуляции. Как насчет:
if ((!isset($value)) | ($value == "")) {
$value = "\"\"\t";
}
PS $value будет установлен всегда, потому что вы устанавливаете его в строке выше.
Это действительно устаревший код, который мы планируем решить. насчет ответа это сработало как шарм, спасибо.