За последние 24 часа нас посетили 93122 программиста и 5764 робота. Сейчас ищут 2287 программистов ...

Есть такой скрипт…

Тема в разделе "PHP для новичков", создана пользователем Chile, 28 дек 2015.

  1. Chile

    Chile Новичок

    С нами с:
    17 окт 2015
    Сообщения:
    27
    Симпатии:
    0
    Здравствуйте, товарищи.

    У меня есть такой вот скрипт, для преобразования XML на стороне сервера. Мне нужно туда прикрутить код, который бы формировал ссылки вида «index.php?p=article1234», то есть, чтобы этот файлик (скрипт) стал индексным файлом. Помогите пожалуйста это решить. Заранее благодарен.

    Собственно скрипт:
    Код (PHP):
    1. <?php
    2.  
    3. ini_set('error_reporting', E_ALL);
    4. ini_set('display_errors', 1);
    5.  
    6. define('ROOT', preg_replace('#\\\+#', '/', __DIR__));
    7. define('PATH', $_SERVER['PATH_INFO']);
    8.  
    9. $xmlfile = ROOT . (file_exists(ROOT . PATH) ? PATH : '/404/index.xml');
    10.  
    11. // Загружаем xml файл и кастуем XInclude
    12. $xmldoc = new DOMDocument('1.0', 'UTF-8');
    13. $xmldoc->preserveWhiteSpace = false;
    14. $xmldoc->formatOutput = true;
    15. $xmldoc->load($xmlfile);
    16. $xmldoc->xinclude();
    17.  
    18. // Определяем какой xsl применить к xml
    19. $xslts = array();
    20. $xpath = new DOMXPath($xmldoc);
    21. $pi = "/child::processing-instruction('xml-stylesheet')";
    22. foreach ($xpath->evaluate($pi) as $node)
    23. {
    24.     if (preg_match('#type=([\'"])text/xsl\1#i', $node->data) &&
    25.         preg_match('#href=([\'"])([^\'"]+)\1#i', $node->data, $matches))
    26.     {
    27.         $xslts[] = $matches[2];
    28.     }
    29. }
    30.  
    31. // Если xsl шаблон не задан, то xml файл надо отобразить без изменений
    32. if (!count($xslts))
    33. {
    34.     header('Content-Type: text/xml; charset=UTF-8');
    35.     printf($xmldoc->saveXML());
    36. }
    37. // Иначе применяем xsl к xml и отображаем результат преобразования
    38. else
    39. {
    40.     $tmp = getcwd();            // в xml файле ссылка на xsl указана относительная
    41.     chdir(dirname($xmlfile));   // поэтому чтобы корректно загрузить xsl надо сначала
    42.                                 // перейти в папку с xml
    43.     
    44.     $xslprc = new XSLTProcessor();
    45.     foreach ($xslts as $xslfile)
    46.     {
    47.         $xsldoc = new DOMDocument('1.0', 'UTF-8');
    48.         $xsldoc->load($xslfile);
    49.         $xslprc->importStylesheet($xsldoc);
    50.     }
    51.     
    52.     chdir($tmp);
    53.     
    54.     header('Content-Type: text/html; charset=UTF-8');
    55.     printf($xslprc->transformToXml($xmldoc));
    56. }
    57.  
    58. ?>
    Подсказка от модератора:
    Любой код или текст конфигурации пишите между тегом [code=php] и [/code].
    Используйте отступы в коде для форматирования текста.
    Это помогает быстрее понять вас, увеличивает шанс на получение ответа.
    Что выделять? Например: PHP, HTML, CSS, JavaScript, SQL, XML, .htaccess, ini, регулярные выражения, код шаблонизаторов, любая другая разметка, результаты array/object dump и т. д.
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.213
    Симпатии:
    1.711
    Адрес:
    Молдова, г.Кишинёв
    Я ничего не понял
     
  3. Chile

    Chile Новичок

    С нами с:
    17 окт 2015
    Сообщения:
    27
    Симпатии:
    0
    Ну как я понимаю, туда надобно добавить, что-то вроде «. $_GET['p'] …», чтобы, при наборе в адресной строке «my_site.org/index.php?p=article_1» стартовал файл index.php с этим скриптом и тащил бы за собой содержимое файла article_1.xml. Как-то так :). Я совсем новичок в php, могу сформулировать глупо, но, к сожалению, это всё, на что я способен :)
     
  4. Chile

    Chile Новичок

    С нами с:
    17 окт 2015
    Сообщения:
    27
    Симпатии:
    0
    Друзья, ну поможи́те мне в честь Нового года :)
     
  5. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.129
    Симпатии:
    1.225
    Адрес:
    там-сям
    Я тоже не понял. Нельзя сделать то, не пойми что.
     
  6. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.213
    Симпатии:
    1.711
    Адрес:
    Молдова, г.Кишинёв
    пусть $xmlfile ровняется $_GET['p'].'.xml' и чисти $_GET['p'] от всего кроме 0-9a-z_-. чтобы безопасно было
     
  7. Chile

    Chile Новичок

    С нами с:
    17 окт 2015
    Сообщения:
    27
    Симпатии:
    0
    А можно в примере? А то, я кофейник вообще.

    Добавлено спустя 2 минуты 57 секунд:
    Дело в том, что нужно чтобы этот скрипт склейки XML/XSL, выполнял также роль индексного файла, вроде index.php, как в простых движках, использующих не СУБД, а текстовые или .xml-файлы.
     
  8. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.213
    Симпатии:
    1.711
    Адрес:
    Молдова, г.Кишинёв
    Код (PHP):
    1. if ($_SERVER['REQUEST_METHOD'] === 'GET' && empty($_GET['p']) === false) {
    2.     $xmlfile = preg_replace('/[^0-9a-z-_]/iu', '', $_GET['p']).'.xml';
    3. } else {
    4.     $xmlfile = '404.xml';
    5. }
     
  9. Chile

    Chile Новичок

    С нами с:
    17 окт 2015
    Сообщения:
    27
    Симпатии:
    0
    Огромное спасибо! Все работает, осталось только разобраться с путями к CSS :) Но, это просто.
     
  10. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.213
    Симпатии:
    1.711
    Адрес:
    Молдова, г.Кишинёв
  11. Chile

    Chile Новичок

    С нами с:
    17 окт 2015
    Сообщения:
    27
    Симпатии:
    0
    denis01, спасибо, вам. Скажите, а как сделать, чтобы при неправильном значении «p=» (т. е., при несуществующем адресе) выдавало тоже 404 ошибку? А то, просто ругается вот этим:
    Код (PHP):
    1. This page contains the following errors:
    2.  
    3. error on line 2 at column 1: Extra content at the end of the document
    4. Below is a rendering of the page up to the first error. 
     
  12. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.213
    Симпатии:
    1.711
    Адрес:
    Молдова, г.Кишинёв
    в блок else вставь
    Код (PHP):
    1. header("HTTP/1.0 404 Not Found"); 
    и выводи текст, что ничего не найдено
     
  13. Chile

    Chile Новичок

    С нами с:
    17 окт 2015
    Сообщения:
    27
    Симпатии:
    0
    Вот так:
    Код (PHP):
    1. if ($_SERVER['REQUEST_METHOD'] === 'GET' && empty($_GET['p']) === false) {
    2.     $xmlfile = 'xdata/xml/' .  preg_replace('/[^0-9a-z-_]/iu', '', $_GET['p'])  . '.xml';
    3. } else {
    4.     header("HTTP/1.0 404 Not Found"); 
    5.     echo '404';
    6.     exit();
    7.     //$xmlfile = 'xdata/xml/404.xml';
    8. } 
    Все равно ругается. Т. е., если вместо существующего «index.php?p=201203130730» набрать «index.php?p=201203130730Н», то пишет то же, что я приводил выше. А надо бы 404.xml. Беда прямо…

    Я добавил вот это:
    Код (PHP):
    1. if(!is_file($xmlfile)) {
    2.      die('Error 404');
    3. } 
    но, по моему, это костыль и вообще как-то коряво :) . Может нужно как-то «обобщить», т. е., если в строке после адреса сайта написана ахинея (любое несоответствие существующему URL), то сразу выдавать 404?
     
  14. lastdays

    lastdays Активный пользователь

    С нами с:
    27 сен 2012
    Сообщения:
    410
    Симпатии:
    74
    Почему, собственно, оно должно отдавать 404?
    Если:

    Код (PHP):
    1. if ($_SERVER['REQUEST_METHOD'] === 'GET' && empty($_GET['p']) === false) {
    Переданные параметры соответствуют шаблону.

    а
    Код (PHP):
    1. preg_replace('/[^0-9a-z-_]/iu', '', $_GET['p'])
    Благополучно выполняет поиск и замену.


    Если вы хотите проверить наличие файла по нужному пути на сервере, можно применить функцию file_exists
    указав полный путь до папки с файлам.