DBF пустая ячейка

SunTechnique

Новичок
привет всем. есть такая проблема, пытаюсь считывать данные из ячеек DBF считывается все кроме тех ячеек которые пустые вообще. но проблема состоит не совсем в пустой ячейке.
мне нужно знать что делать и как если ячейка пустая то как это узнать и как обработать нормально.

я вывожу все это в таблице и допустим когда попадается в ДБФ пустая ячейка то переменная, через которую происходит обращение к ячейке, вообще не обрабатывается.

ниже приведу код с подробными коментами что бы было понятнее.
PHP:
<?php
$query_str = '';
$out_string = '';
$query_str = $_POST['textId'];
if($query_str != ''){
	//'MY_DBASE.DBF';
	$db_handle = dbase_open('DVDOM.DBF',0);
	
	// создание шапки таблицы для вывода в HTML TABLE
	$tab_head_tds = generate_tab_thead($db_handle);
	
	// ниже идет функция создания строк со столбцами типа <tr><td></td></tr>
	//то есть то что будет содержать записи из DBF
	//ВОТ ТУТ И НАЧИНАЕТЮСЯ ТРАБЛЫ, В ДАННОЙ ФУНКЦИИ
	$tab_boby = generate_tab_body($db_handle);
	dbase_close($db_handle);

	//тут я создаю таблицу, с созданными в ней строками и столбами, для вывода в HTML
	//то есть примерно такое <table><tr><td></td></tr></table>
	$tab_head = '<table align="center"><tr class="tab_head">' . $tab_head_tds . '</tr>' . $tab_boby . '</table>';
	$out_string = $tab_head;
}

function generate_tab_thead($db_handle){
	$var = '';
	$count = dbase_numfields($db_handle);
	$field = dbase_get_header_info($db_handle);
	for($i = 0; $i < $count; $i++){
		$var .= '<td>' . $field[$i]['name'] . '</td>';
	}
	return $var;
}

//ТРАБЛОИДНАЯ ФУНКЦИЯ НАЧАЛО
function generate_tab_body($db_handle){
	$db_count_recs = dbase_numrecords($db_handle);
	$num_fields = dbase_numfields($db_handle);
	$tab_tr = '';

	for($line = 1; $line < $db_count_recs; $line++){
		$tab_td = '';
		$row_string = dbase_get_record($db_handle,$line);
		
		//ТРАБЛОИДНЫЙ ЦИКЛ НАЧАЛО
		for($cell = 0; $cell < $num_fields; $cell++){
			$one_record = '..';
			$tmp_var = '..';
			// если $row_string[$cell] попалась пустая ячейка, или как бы ее нет вообще
			//то почему-то переменная $one_record становится тоже пустой
			//и переменная $tab_td принимается значение <td></td>
			$tmp_var = $row_string[$cell];
			$tmp_var = iconv('CP866', 'UTF-8', $row_string[$cell]);
			$one_record = $tmp_var;
			//$row_string[$cell] = win2utf($row_string[$cell]);
			if(strlen($one_record) == 0){$one_record = '..';}
			$tab_td .= '<td> ' . $one_record . ' </td>';
		}
		//ТРАБЛОИДНЫЙ ЦИКЛ КОНЕЦ
		$tab_tr .= '<tr>
		' . $tab_td . '</tr>';
	}
	return $tab_tr;
}
//ТРАБЛОИДНАЯ ФУНКЦИЯ КОНЕЦ

?>

<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<style type="text/css">
<!--
	.tab_head { background-color:#F4FFCE; background-image: url(images/cell_bckg1.png) }
-->
TABLE { border-spacing:inherit; border-left: 1px solid #CCC}
TD { border-style:none; border-right: 1px solid #CCC; border-bottom: 1px solid #CCC; border-top:1px solid #CCC}
</style>
<form id="formdb" name="formdb" method="post" action="index.php">
  <p>
    <label for="textId">record index<br />
    </label>
    <input type="text" name="textId" id="textId" />
  </p>
  <p>
    <input type="submit" name="btn" id="btn" value="ввод"/>
  </p>
  <p>
	<!-- ТУТ ВЫВОД РЕЗУЛЬТАТА ОБРАЩЕНИЯ К DBF ФАЙЛУ -->
  <?php echo $out_string; ?>
  </p>
</form>
</html>
в общем дело в том, что когда в траблоидном цикле, момент доходит до момента:
$tmp_var = $row_string[$cell];

и если там пустая ячейка, он каким-то образом перерыгивает сразу на $tab_td .= '<td> ' . $one_record . ' </td>'; при том переменная $one_record судя по всему становится тоже пустой и в пемеренную $tab_td записывается только <td></td>

почему так происходит и как исправить ситуацию я не знаю. может кто из вас знает скажите плиз ?
как проверить пемеренную $row_string[$cell]; пустая она или какая-то еще ? что бы если она пустая присвоить переменной $one_record значение типа '...' strlen() не помогает...
 

SunTechnique

Новичок
я щас еще раз посмотрел, оказывается после операций:
PHP:
$tmp_var = $row_string[$cell];
$tmp_var = iconv('CP866', 'UTF-8', $row_string[$cell]);
$one_record = $tmp_var;
переменная $one_record принимает в качестве значений обычные пробелы то есть 0x20 если в $row_string[$cell];
попалась пустая ячейка.
просто в одном случае допустим там почему-то выводится три пробела в другом случае один.
но проблема в том что HTML пробелы в <td></td> игнорирует и не выводит их вообще и отображается корявая таблица.
 

SunTechnique

Новичок
если читать файл какой нибуть программой типа DBFviewer то там например пустые ячейки они и есть пустые, ни каких пробелов (0x20) нету. а когда в моем ПХП попадается такая ячейка то даже strlen($row_string[$cell]) проблему не решает, та как например if(strlen($row_string[$cell]) ==0) просто напросто игнорируется, так как в логах ошибок АПАЧА выводится ошибка что такой OFFSET не существует.... до какого-то момента выводил такую ошибку щас не выводит может потому что я убрал if(strlen($row_string[$cell]) ==0).
 

SunTechnique

Новичок
понимаете в чем дело ? переменная получает значения, но там пробелы...
 

SunTechnique

Новичок
а как такой может быть что там пробелы ??? они там действительно записаны значит ? в какую-то ячейку три пробела, в какую-то пять пробелов ? это реально только человек мог записать или там действительно пустая ячейка ?
 

флоппик

promotor fidei
Команда форума
Партнер клуба
в ДБФ размер ячейки определен заданным типом данным и их размером. Библиотека для разбора DBF в пхп (которая скажем прямо, неидеальна) вполне может заполнять это место пробелами.
 

SunTechnique

Новичок
короче ПРИКОЛ ТАКОЙ !!!! если ячейка заполнена только цифрой и эта цифра 0 то empty($row_string[$cell]) == true
 

С.

Продвинутый новичок
В DBF поля всегда фиксированы и дополнены пробелам до нужной длины. Соответственно пустое поле будет нести в себе пробелы в определенном количестве.
 

fixxxer

К.О.
Партнер клуба
DBF, cp866... Ох. :) Я долго вчитывался в дату создания треда, перечитывал раза 3-4... :)
 

флоппик

promotor fidei
Команда форума
Партнер клуба
fixxxer, да знаешь блин — у меня вот коммунальщики с платежных киосков получают файлики платежей, все поголовно потребовали в ср866 в DBF — я подозреваю что тут какой-то всемирный заговор.
 

SunTechnique

Новичок
просто они у себя в конторах до сих пор под досовскими прогами сидят
не смотря на то что ОС используется иногда WinXP
 

fixxxer

К.О.
Партнер клуба
ну а вообще да, в dbf нет varchar, там только char

так что trim() + strlen()
 
Сверху