Эта тема на forum.dklab.ru


XEugene: Загадочный баг при генерации xml методами domDocument
Для генерации xml решил воспользоваться методами createXXX класса domDocument.
Столкнулся при этом с очень странным багом.
Итак, по порядку...
Имеется класс, в котором сосредоточена работа с БД.
Допустим, мне нужно вывести колонку новостей.
Следующий метод возвращает новости в виде двумерного массива(массива хэш-массивов)
public function SelectNews($start, $end) {
$news = array();
$sql = "SELECT id, title, short, full, date, visitors, comment
FROM news
LIMIT ".$start.", ".$end;
$result = mysql_query($sql);
$i=0;
while ($row = mysql_fetch_assoc($result)) {
$news[$i] = array("id"=>$row['id'],
"title"=>$row['title'],
"short"=>$row['short'],
"full" =>$row['full'],
"date" =>$row['date'],
"visitors"=>$row['visitors'],
"comment"=>$row['comment']
);
$i++;
}
return $news;

}

Вызываю этот метод, формирую XML, к которому будет потом применено XSLT-преобразование.

$dm = DataManager::getInstance();
$dm->getConnection();
$doc = new domDocument('1.0', 'utf-8');
$rows = $dm->SelectNews(0, 5);
$root = $doc->createElement('news');
$doc->appendChild($root);
for ($i=0; $i < count($rows); $i++) {
$article = $doc->createElement('article');
$root->appendChild($article);
$title = $doc->createElement('title');
$article->appendChild($title);
$text = new domText($[$i]['title']);
$title->appendChild($text);
//и так далее...
}

Так вот, строка
$text = new domText($[$i]['title']);
почему-то вгоняет сервер(Денвер-2 2004-11-06) в состояние такого ступора, что даже перезапустить его
удаётся только предварительно перезагрузив машину.
Извлечение данных из БД происходит без проблем, т.е. такой код

$dm = DataManager::getInstance();
$dm->getConnection();
$rows = $dm->SelectNews(0, 5);
for ($i=0; $i < count($rows); $i++)
echo $rows[$i]['title']."<br>";

отрабатывает нормально.

Такой код тоже сработает

$doc = new domDocument('1.0', 'utf-8');
$root = $doc->createElement('news');
$doc->appendChild($root);
$rows = array("1", "2", "3", "4");
for ($i=0; $i < count($rows); $i++) {
$article = $doc->createElement('article');
$root->appendChild($article);
$title = $doc->createElement('title');
$article->appendChild($title);
$text = new domText($rows[$i]);
$title->appendChild($text);
}
$doc->formatOutput=true;
$xml = $doc->saveXML($root);

то есть и в этой части ошибок нет.

В чём может быть причина? Почему передача элемента двумерного массива в конструктор domText "вешает" PHP?
Г.О.:
$[$i]['title'], а что это вообще?
Почему не воспользоваться, $doc->createTextNode($rows[$i]) ?
XEugene:
$[$i]['title'], а что это вообще?
Метод SelectNews возвращает у меня двумерный массив такой структуры

array(
array("id"=>$id1, "title"=>$title1, "short"=>$short1, ... ),
array("id"=>$id2, "title"=>$title2, "short"=>$short2, ... ),
array("id"=>$id3, "title"=>$title3, "short"=>$short3, ... ),
array("id"=>$id4, "title"=>$title4, "short"=>$short5, ... )
);


Ключи ассоциативных массивов - это соответствующие поля таблицы в БД.
Поэтому до нужных значений я добираюсь так: $rows[$i]['title'], $rows[$i]['short'] и т.д.

$doc->createTextNode() и new domText() совершенно идентичны.
Я пробовал и createTextNode() - то же результат :(
jiraff:
А вы уверены что $[$i]['title'] возвращает именно это?
XEugene:
Абсолютно. Вот такой тест

$rows = $dm->SelectNews(0, 5);
echo $rows[0]['title'];

возвращает то, что и должен - значение поля title.

Я провёл ещё один эксперимент

$rows = array(
array("id"=>1, "title"=>"ewwewe"),
array("id"=>2, "title"=>"sds"),
array("id"=>3, "title"=>"erewwq"),
array("id"=>4, "title"=>"44ewee")
);

$doc = new domDocument('1.0', 'windows-1251');
$root = $doc->createElement('news');
$doc->appendChild($root);

for ($i=0; $i < count($rows); $i++) {
$title_text = $rows[$i]['title'];
$article = $doc->createElement('article');
$root->appendChild($article);
$title = $doc->createElement('title');
$article->appendChild($title);
$text = $doc->createTextNode($title_text);
$title->appendChild($text);

}
$doc->formatOutput=true;
$xml = $doc->saveXML($root);
echo htmlspecialchars($xml);

xml нормально формируется, а что собственно изменилось?
jiraff:
Ну хотя-бы то что вы не используете $[$i]['title']
XEugene:
Ну как же я его не использую

$doc = new domDocument('1.0', 'windows-1251');
$root = $doc->createElement('news');
$doc->appendChild($root);
$rows = array(
array("id"=>1, "title"=>"ewwewe"),
array("id"=>2, "title"=>"sds"),
array("id"=>3, "title"=>"erewwq"),
array("id"=>4, "title"=>"44ewee")
);

for ($i=0; $i < count($rows); $i++) {
$article = $doc->createElement('article');
$root->appendChild($article);
$title = $doc->createElement('title');
$article->appendChild($title);
$text = $doc->createTextNode($rows[$i]['title']);
$title->appendChild($text);

}
$doc->formatOutput=true;
$xml = $doc->saveXML($root);
echo htmlspecialchars($xml);

XEugene:
Ну хотя-бы то что вы не используете $[$i]['title']
это опечатка, в действительности там $rows[$i]['title'] и этот код должен работать по всем законам физики :)

Эта тема на forum.dklab.ru