PDA

Просмотр полной версии : ЗАМЕНА: XML >> PHP


jakim_denis
11.08.2008, 16:54
Добрый день!
Подскажите, каким образом правильно генерить XML файл средствами PHP?
Я работаю с XML след. структуры:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<images>
<image>
<title>My title</title>
<img>contents/gallery/category2/img1.jpg</img>
<tmb>contents/gallery/category2/tmb1.jpg</tmb>
<desc><![CDATA[Desc goes hire]]></desc>
</image>
</images>

я создал след PHP

<?
function db_connect()
{
$result = @mysql_pconnect("localhost", "root", "");
if (!$result)
return false;
if (!@mysql_select_db("studio"))
return false;

return $result;
}


$conn = db_connect();

$sql = "select * from gallery where id='1'";
$result = mysql_query($sql, $conn);
if (mysql_num_rows($result)) {
echo '<?xml version="1.0" encoding="ISO-8859-1" ?> ';
echo '<images>';
while ($qry = mysql_fetch_array($result)) {



$item = '<image><title>'.$qry[title].'</title><img>'.$qry[img].'</img><tmb>'.$qry[thmb].'</tmb><desc><![CDATA['.$qry[desc].']]></desc></image>';
echo $item;
}
echo '/<images>';
}
?>

Который выдает при обработке браузером такой результат:
<?xml version="1.0" encoding="ISO-8859-1" ?> <images><image><title>My title</title><img>contents/gallery/category1/img1.jpg</img><tmb>contents/gallery/category1/tmb1.jpg</tmb><desc><![CDATA[Desc goes hire]]></desc></image>/<images>

И в скрипте обрабатывающем XML меняю адрес файла для обработки на свой PHP.

К сожалению результат получается нулевой ((((
Подскажите где я допускаю ошибку? она на уровне логистики или инструментария?

Спасибо огромное!

wvxvw
11.08.2008, 17:45
Добрый день!
Официальная поддержка ПХП4 закончилась ровно 3 дня тому назад (8 августа), и поэтому... =)
Поэтому учимся пользоваться DOMDocument классом =)
Кроме того, во избежание дальнейших граблей сразу забываем про любые ASCII кодировки для ХМЛей и начинаем использовать UTF-8.

К сожалению, не видя неработающей скрипт вероятность угадать, что в нем не работает стремится к нулю, могу только предположить, что:
нужно порасставлять trace() в ключевых местах и проверить совпаение URL в запросе с реальным URL по которому расположен скрипт.

Кроме того, не используйте короткое обозначение включений скрипта, т.е.
<?php ?> а не <? ?>
<?php print "hi!" ?> а не <?="hi!" ?>
Control statements should have one space between the control keyword and opening parenthesis, to distinguish them from function calls.

You are strongly encouraged to always use curly braces even in situations where they are technically optional. Having them increases readability and decreases the likelihood of logic errors being introduced when new lines are added.

Это значит не
if (condition)
statement;
a
if (condition) {
statement;
}

ЗЫ. И ну максимум 80 символов в строке =) (а вообще - 72)

jakim_denis
11.08.2008, 19:26
Официальная поддержка ПХП4 закончилась ровно 3 дня тому назад (8 августа), и поэтому... =)
Поэтому учимся пользоваться DOMDocument классом =)
В смысле? я не совсем понял как закончилась? тоесть теперь флеш что не знает что такое пхп?

Косательно сокращений php - их там деже и не использовалось.
Вывод того что проблема не в скрипте я зделал из того что с XML все работает - трабл только с php

Если трабл с кодировками - то оно по ходу должно же было выдать ну хоть что-то, пусть даже кривой текст?

jakim_denis
11.08.2008, 20:09
Вот код функции если это облегчит понимание задачи
function loadImages () {
var images:XML = new XML ();
images.ignoreWhite = true;
images.onLoad = function (success) {
if (success) {
var xml:XMLNode = this.firstChild;
totalImages = xml.childNodes.length;
for (i = 0; i < xml.childNodes.length; i++) {
var imagesTitle:String = xml.childNodes[i].childNodes[0].childNodes[0].nodeValue;
var imagesLarge:String = xml.childNodes[i].childNodes[1].childNodes[0].nodeValue;
var imagesTmb:String = xml.childNodes[i].childNodes[2].childNodes[0].nodeValue;
var imagesDesc:String = xml.childNodes[i].childNodes[3].childNodes[0].nodeValue;
//
bottomBar.rightSide.imageTxt.txt.autoSize = true;
bottomBar.rightSide.imageTxt.txt.text = "1";
//
bottomBar.rightSide.totalTxt.txt.autoSize = true;
bottomBar.rightSide.totalTxt.txt.text = totalImages;
//
displayPositions ();
//
imageTitleArr.push (imagesTitle);
imagesArr.push (imagesLarge);
imageDescArr.push (imagesDesc);
//
tmbs.containerTmbs.attachMovie ("attach","attach" + i,i);
tmbs.containerTmbs["attach" + i]._x = i * 30;
//
loadThumbnails (imagesTmb,tmbs.containerTmbs["attach" + i].picture);
loadThumbnails (imagesTmb,tmbs.containerTmbs["attach" + i].largeTmb.picture);
//
contentBox.contentBox_text.catText.text = categoryTitleForContent;
contentBox.contentBox_text.titleText.text = xml.childNodes[0].childNodes[0].childNodes[0].nodeValue;
contentBox.contentBox_text.descText.htmlText = xml.childNodes[0].childNodes[3].childNodes[0].nodeValue;
contentBox.contentBox_text.descText.autoSize = true;
myListenerload.onResize ();
//
tmbs.containerTmbs["attach" + i].bt.idInstance = i;
//
tmbs.containerTmbs["attach" + i].bt.onRelease = function () {
//
cursorArr = this.idInstance;
//
for (a = 0; a < totalImages; a++) {
if(tmbs.containerTmbs["attach" + a].back._tint == color){
tmbs.containerTmbs["attach" + a].bt.enabled = true;
tmbs.containerTmbs["attach" + a].back._tint = 0x353535;
}
//
if(a > 0){
if(a == totalImages - 1){
tmbs.containerTmbs["attach" + cursorArr].gotoAndPlay("close");
tmbs.containerTmbs["attach" + cursorArr].bt.enabled = false;
tmbs.containerTmbs["attach" + cursorArr].back._tint = color;
}
}
}
//
abortSlideShow ();
//
bottomBar.rightSide.imageTxt.txt.autoSize = true;
bottomBar.rightSide.imageTxt.txt.text = cursorArr + 1;
//
displayPositions ();
//
contentBox.contentBox_text.catText.text = categoryTitleForContent;
contentBox.contentBox_text.titleText.text = imageTitleArr[cursorArr];
contentBox.contentBox_text.descText.htmlText = imageDescArr[cursorArr];
contentBox.contentBox_text.descText.autoSize = true;
myListenerload.onResize ();
//
ZigoEngine.doTween (imageContainer,'_alpha',0,1,"easeOutExpo",0,function () {
loadBitmapSmoothed (imagesArr[cursorArr],imageContainer);
});
};
}
}
loadBitmapSmoothed (imagesArr[cursorArr],imageContainer);
};
images.load ("contents/data/gallery_category1.xml");
}

jakim_denis
11.08.2008, 22:23
Почти разобрался с помощью скрипта:
<?php
//phpinfo();
if(!$dbconnect = mysql_connect('localhost', 'root', '')) {
echo "Connection failed to the host 'localhost'.";
exit;
} // if
if (!mysql_select_db('studio')) {
echo "Cannot connect to database 'test'";
exit;
} // if

$table_id = 'image';
$query = "SELECT * FROM $table_id";
$dbresult = mysql_query($query, $dbconnect);

// create a new XML document
$doc = new DomDocument('1.0');

// create root node
$root = $doc->createElement('images');
$root = $doc->appendChild($root);

// process one row at a time
while($row = mysql_fetch_assoc($dbresult)) {

// add node for each row
$occ = $doc->createElement($table_id);
$occ = $root->appendChild($occ);
// add a child node for each field
foreach ($row as $fieldname => $fieldvalue) {
$child = $doc->createElement($fieldname);
$child = $occ->appendChild($child);
$value = $doc->createTextNode($fieldvalue);
$value = $child->appendChild($value);
} // foreach
} // while


// get completed xml document
$xml_string = $doc->saveXML();

echo $xml_string;
?>
Только вот трабл в том что не сильно специалист в PHP ((
Подскажите плизз, как отконфигурировать ячейки которые будут выводиться и отредактировать порядок строк?
Спасибо!

wvxvw
11.08.2008, 23:14
То, что закончилась поддержка значит, что php.net больше не отвечает за корректную работу / не принимает багрепорты, не гарантирует обратной совместимости и т.п.
Проблема по всей видимости не с PHP, а с AS, а он ну просто ужасный =)
1. Читаем про mx.utils.Delegate класс.
2. Объявлять функции внутри тела другой функции - это самый верный путь навредить себе самому.
3. Вот так в цикле обращаться к узлу - это безбожное расточительство ресурсов:
xml.childNodes[0].childNodes[3].childNodes[0].nodeValue
4. Нетипизированый доступ - еще один хороший способ не увидеть ошибки:
tmbs.containerTmbs["attach" + i].picture
Максимум, что из этого сможет понять читающий, что у вас есть какой-то динамический объект с динамическими свойствами containerTmbs, но вот что такое picture - этого уже не поймет никто.
5. contentBox.contentBox_text.descText.htmlText аналогично - вы сами себе усложняете жизнь, а что если contentBox_text не существует, как вы об этом узнаете?
6. images.load("contents/data/gallery_category1.xml");
Вы пытаетесь общаться с ПХП скриптом, а при этом очень похоже на то, что пытаетесь загрузить ХМЛ файл. Если вы не трогали настройки сервера, и сохранили ваш ПХП файл с расширением .XML, то сервер не выполнит ПХП файл, а просто отдаст его в виде текста.

jakim_denis
11.08.2008, 23:28
Это только фрагмент скрипта - это галерея которую я подключаю к сайту
Значение это я менял на адрес к пхп файлу:
images.load("contents/data/gallery_category1.php");
К сожалению знаний чтоб написать такую галерею самуому нехватит (((
К сожалению все это не устраняет необходимость админить галерею (
DOM XML на половину решил задачу.
Не трогая AS я вгрузил место XML файл PHP
<?php
//phpinfo();
if(!$dbconnect = mysql_connect('localhost', 'root', '')) {
echo "Connection failed to the host 'localhost'.";
exit;
} // if
if (!mysql_select_db('studio')) {
echo "Cannot connect to database 'test'";
exit;
} // if

$table_id = 'image';
$query = "SELECT * FROM $table_id";
$dbresult = mysql_query($query, $dbconnect);

// create a new XML document
$doc = new DomDocument('1.0');

// create root node
$root = $doc->createElement('images');
$root = $doc->appendChild($root);

// process one row at a time
while($row = mysql_fetch_assoc($dbresult)) {

// add node for each row
$occ = $doc->createElement($table_id);
$occ = $root->appendChild($occ);
// add a child node for each field
foreach ($row as $fieldname => $fieldvalue) {
$child = $doc->createElement($fieldname);
$child = $occ->appendChild($child);
$value = $doc->createTextNode($fieldvalue);
$value = $child->appendChild($value);
} // foreach
} // while


// get completed xml document
$xml_string = $doc->saveXML();

echo $xml_string;
?>

Который из базы

CREATE TABLE IF NOT EXISTS `image` (
`title` text NOT NULL,
`img` varchar(255) NOT NULL,
`thmb` varchar(255) NOT NULL,
`desc` text NOT NULL
PRIMARY KEY (`title`)
)

Генерил код который прекрасно обработался галереей.
Осталось только следующие:
1) Отрегулировать порядок в котором будут выводиться строки из базы
Как я понимаю это проще зделать еще при вызове данных тут:
$query = "SELECT * FROM $table_id";
2) Отфильтровать ячейки которые будут входить в результат работы скрипта
На пример я ходу добавить перед title поле id, которое будет использоваться только панелью администрирования а скриптом не обрабатываться. Вопрос только в том как это зделать.
[B]3) Название второй ноды соответствует названию таблицы в базе - это тоже хочетсья изменить[B]

На сервере у меня PHP 5
DOM/XML enabled
DOM/XML API Version 20031129
libxml Version 2.6.16
HTML Support enabled
XPath Support enabled
XPointer Support enabled
Schema Support enabled
RelaxNG Support enabled