Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Серверные технологии и Flash (http://www.flasher.ru/forum/forumdisplay.php?f=62)
-   -   ЗАМЕНА: XML >> PHP (http://www.flasher.ru/forum/showthread.php?t=114840)

jakim_denis 11.08.2008 16:54

ЗАМЕНА: XML >> PHP
 
Добрый день!
Подскажите, каким образом правильно генерить 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!" ?>
Цитата:

Сообщение от PEAR
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


Часовой пояс GMT +4, время: 23:27.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.