Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Не могу понять как работает этот код

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
EuRusik
Отправлено: 09 Октября, 2015 - 13:25:24
Post Id


Новичок


Покинул форум
Сообщений всего: 15
Дата рег-ции: Окт. 2015  


Помог: 0 раз(а)




Я новичек в php, и пытаюсь разобраться в одном примере, который нашел на просторах интернета. Пытаюсь понять что делает этот код, уже всю голову сломал Однако , буду очень признателен если кто-то из форумчан опишет принцип работы этого примера.

PHP:
скопировать код в буфер обмена
  1. if ($_SERVER['REQUEST_URI'] == '/') {
  2. $Page = 'index';
  3. $Module = 'index';
  4. } else {
  5. $URL_Path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
  6. $URL_Parts = explode('/', trim($URL_Path, ' /'));
  7. $Page = array_shift($URL_Parts);
  8. $Module = array_shift($URL_Parts);
  9.  
  10.  
  11. if (!empty($Module)) {
  12. $Param = array();
  13. for ($i = 0; $i < count($URL_Parts); $i++) {
  14. $Param[$URL_Parts[$i]] = $URL_Parts[++$i];
  15. }
  16. }
  17. }


Все что я смог понять это то, что вот эта часть
PHP:
скопировать код в буфер обмена
  1. if ($_SERVER['REQUEST_URI'] == '/') {
  2. $Page = 'index';
  3. $Module = 'index';

Если мы набрали домен test.ru то сервер добавляет test.ru/index для переменных $Page и $Module, а дальше после else непонятно что происходит Огорчение

(Отредактировано автором: 09 Октября, 2015 - 13:28:54)

 
 Top
DelphinPRO
Отправлено: 09 Октября, 2015 - 13:38:01
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




CODE (htmlphp):
скопировать код в буфер обмена
  1. $URL_Path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);

Из URL вытаскивается путь: из "http://site.ru/blog/topic/12" получаем "blog/topic/12"


разбивается на части по слешу. Получаем массив ['blog','topic','12'].


Из массива вытаскивается первый элемент. $page = 'blog'. Note: элемент при этом будет удален из массива. Массив станет таким ['topic','12'].


Снова тащится первый элемент. Теперь это будет $Module = 'topic'? потому что предыдущий первый был удален из массива. Этот элемент также будет удален из массива. Массив станет таким ['12'].

Далее выбираются все остальные элементы массива, и записываются в другой массив $Param - Это видимо переданные параметры запроса. В нашем примере - 12, идентификатор топика.


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
Panoptik
Отправлено: 09 Октября, 2015 - 13:44:30
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




код достаточно плохой чтобы брать его как образец для подражания
второе - форматируйте код. выравненный по левому краю он очень нечитабелен

отформатированным должен выглядеть примерно так
PHP:
скопировать код в буфер обмена
  1. if ($_SERVER['REQUEST_URI'] == '/') {
  2.   $Page = 'index';
  3.   $Module = 'index';
  4. } else {
  5.   $URL_Path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
  6.   $URL_Parts = explode('/', trim($URL_Path, ' /'));
  7.   $Page = array_shift($URL_Parts);
  8.   $Module = array_shift($URL_Parts);
  9.  
  10.   if (!empty($Module)) {
  11.     $Param = array();
  12.     for ($i = 0; $i < count($URL_Parts); $i++) {
  13.       $Param[$URL_Parts[$i]] = $URL_Parts[++$i];
  14.     }
  15.   }
  16. }

теперь что касательно того что он делает

в переменной $_SERVER['REQUEST_URI'] обычно содержится весь запрос от домена

то есть если у вас было в строке браузера что-то типа такого

http://example.com/my/test/example?page=1

то в REQUEST_URI будет так /my/test/example?page=1

далее функция parse_url c вторым аргументом PHP_URL_PATH выбирает только URL_PATH - а это будет /my/test/example

после эта строчка разбивается на части по разделителю '/' - функция explode
но в функцию эксплод передается не целая строка /my/test/example а немного обрезанная версия после trim (второй аргумент в трим '/' говорит что нужно обрезать строку по строном по символу '/' если он есть в конце или в начале), то есть в эксплод попадает такое my/test/example

получаем массив

ну а функция array_shift извлекает первую часть из массива и возвращает ее, а массив при этом становится меньше

то есть после первого захода
в $Page пападет 'my', а в массиве останется всего 2 элемента
далее происходит похожая процедура
в $Module пападает 'test' а массив $URL_Parts становится еще меньше

ну а дальше думаю разберетесь


-----
Just do it
 
 Top
EuRusik
Отправлено: 09 Октября, 2015 - 13:53:13
Post Id


Новичок


Покинул форум
Сообщений всего: 15
Дата рег-ции: Окт. 2015  


Помог: 0 раз(а)




Большое спасибо за разъяснения! Теперь все стало намного проще понимать Улыбка
 
 Top
Nizz
Отправлено: 21 Марта, 2016 - 19:46:35
Post Id



Гость


Покинул форум
Сообщений всего: 79
Дата рег-ции: Март 2016  


Помог: 0 раз(а)




Работая по этому же коду, у меня не работает код. Ошибка насколько я мог понять ссылается на неверную переменную $Param. Помогите пожалуйста исправить.
Вот сама ошибка, которая высвечивается при переходе по категориям. Все категории отображают информацию отлично.
Fatal error: Uncaught exception 'mysqli_sql_exception' with message 'You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ORDER BY `id` DESC LIMIT 0, 5' at line 1' in /****/*****/public_html/module/articles/main.php:40 Stack trace: #0 /****/*****/public_html/module/articles/main.php(40): mysqli_query() #1 /****/*****/public_html/index.php(47): include('/****/*****...') #2 {main} thrown in /****/*****/public_html/module/articles/main.php on line 40




Вот ссылки:
PHP:
скопировать код в буфер обмена
  1. <a href="/articles"><div class="Cat">Все категории</div></a>
  2. <a href="/articles/category/id/1"><div class="Cat">Категория 1</div></a>
  3. <a href="/articles/category/id/2"><div class="Cat">Категория 2</div></a>
  4. <a href="/articles/category/id/3"><div class="Cat">Категория 3</div></a>
  5.  



PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. if (!$Module or $Module == 'main') {
  3. $Param1 = 'SELECT `id`, `name`, `added`, `date` FROM `articles` ORDER BY `id` DESC LIMIT 0, 5';
  4. } else if ($Module == 'category') {
  5. $Param1 = 'SELECT `id`, `name`, `added`, `date` FROM `articles` WHERE `cat` = '.$Param['id'].' ORDER BY `id` DESC LIMIT 0, 5';
  6. }
  7.  
  8.  
  9. $Query = mysqli_query($CONNECT, $Param1);
  10. while ($Row = mysqli_fetch_assoc($Query)) echo '<a href="/articles/material/id/'.$Row['id'].'"><div class="ChatBlock"><span>Добавил: '.$Row['added'].' | '.$Row['date'].'</span>'.$Row['name'].'</div></a>';
  11. ?>
  12.  

(Отредактировано автором: 21 Марта, 2016 - 19:48:50)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB