За последние 24 часа нас посетили 19208 программистов и 1643 робота. Сейчас ищут 885 программистов ...

Оптимизировать код.

Тема в разделе "PHP для новичков", создана пользователем Lopar, 10 июн 2009.

  1. Lopar

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

    С нами с:
    18 янв 2009
    Сообщения:
    16
    Симпатии:
    0
    Есть вот такой совершенно не замечательный код. Пользователь в зависимости от преключателя option может выбрать один из двух сетов картинок, каждая из которых является ссылкой на исполнение.

    PHP:
    1.  
    2. <?
    3. if ($myinfo->option==1) {
    4. $ob="1.jpg,2.jpg,3.jpg,4.jpg,5.jpg";$ob=explode(',',$ob);
    5. }else{
    6. $ob="1.jpg,2.jpg,3.jpg,4.jpg,5.jpg";$ob=explode(',',$ob);
    7. }
    8.  
    9. foreach ($ob as $key=>$value) {
    10. ?>
    11. <a href="main.php?setimage=<? echo $value; ?>"><IMG SRC="http://localhost/photos/<? echo $myinfo->option; ?>/<? echo $value; ?>");'></a>
    12. &nbsp;&nbsp;&nbsp;
    13. <?
    14. }
    15. ?>
    16.  
    Вопрос первый - где в этом коде закрыть дыру, из за которой пользователь подставив в конечную ссылку
    http://localhost/main.php?setimage=свой_код
    Может подставить туда что угодно, парралельно имея возможность полазить внутри моих файлов.

    Вопрос второй - как в этом коде поставить проверку, которая бы, например, после каждых 7 изображений (ну когда их станет больше) делала бы перенос строки. А то всё время переносятся поштучно...
     
  2. lexa

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

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Это чё? Если $myinfo->option равно единице, то делаем ..., иначе делаем то же самое?

    Перенос:
    PHP:
    1. <?
    2. if ($key%7 == 0){
    3.    echo '<br />';
    4. }
    Если ключ кратен семи (7, 14, 21 и т.д.), то делаем перенос.

    Проверяй $_GET['setimage'] на существование файла в каталоге photos. Также проверяй эту переменную на две точки в содержании, иначе могут написать что-то типа такого:
    http://localhost/main.php?setimage=../../пароли.txt
     
  3. Lopar

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

    С нами с:
    18 янв 2009
    Сообщения:
    16
    Симпатии:
    0
    Пока на странице рыба - выглядит одинаково. А по замыслу - option - номер папки в которой лежат фото. А далее - перечень обьектов в папке в код, и он в зависимости от опции выдаёт в эфир пачку картинок с ссылками.

    В идеале хотелось бы это как то оптимизировать, чтобы оно само хавало картинки, заброшенные в папку и выдавало их на экран по тому же условию - но пока не знаю как это сделать. Определенный тупик еще вызывает задание - в будущем часть этих фото должна будет быть доступной пользователю, если выполняется option2, option3 etc как дополнительные условия...

    Сильно ли проблемно написать подобный код?
     
  4. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Я обычно делаю так:

    PHP:
    1. <?
    2.  
    3. if(!($key % 7)) {
    4.     // ...
    5. }
    6.  
    7. ?>
    Мне кажется, что так более =)
     
  5. lexa

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

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Lopar, листинг директории проще всего (да и правильнее всего) сделать функцией glob():
    PHP:
    1. <?
    2. print_r(glob('photos/*.jpg'));
    Apple, в скобках в ифах у меня тока такое:
    PHP:
    1. <?
    2. if ($some or ($var = func())){}
    3. // или
    4. if (($some 1 and $some2) or $some3)
    Отрицание за скобку выношу крайне-крайне редко. Хотя и вариант с == 0 мне тоже никогда не нравился, но твой вариант с вынесением отрицания за скобку не нравится ещё больше. :)
     
  6. Lopar

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

    С нами с:
    18 янв 2009
    Сообщения:
    16
    Симпатии:
    0
    имеется код.

    PHP:
    1.  
    2. foreach (glob("img/path/".$option."/*.jpg") as $ob) {echo $ob."<br>";}
    3.  
    На выход получаю:

    img/path/0/1.jpg
    img/path/0/2.jpg
    img/path/0/3.jpg
    img/path/0/4.jpg
    img/path/0/5.jpg


    А нужно получить только сами файлы - 1.jpg, 2.jpg, 3.jpg, 4.jpg, 5.jpg
    Есть такой выход?
     
  7. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    И чем же?
    Он стилистически более приемлем, как мне кажется, чем $a == 0 (= !$а)
     
  8. lexa

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

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Apple, не, ты споришь не о том. Я вообще никогда не делаю $a == 0, это глупо (хотя бы в контексте PHP с его игрищами с типами) и как-то не пришей пи**е рукав. Но ($a % 2) == 0 мне кажется приемлемей (не лучше, не красивше и не удобней, а приемлемей), чем if (!($a % 2)).

    Lopar, читай мануал, в том числе про basename().
     
  9. Lopar

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

    С нами с:
    18 янв 2009
    Сообщения:
    16
    Симпатии:
    0
    Всем спасибо.
    Финальный код превратился в:

    Передающая часть
    PHP:
    1. <?
    2. foreach (glob("img/path/".$option."/*.jpg") as $ob)
    3. {
    4. $value = basename($ob);
    5. ?>
    6. <a href="main.php?setimage=<? echo $value; ?>"><IMG SRC="http://localhost/<? echo $ob; ?>"></a>
    7. <?
    8. if(!(basename($ob,".jpg") % 7)) {echo"<br>";}
    9. }
    10. ?>
    Принимающая проверка
    PHP:
    1. <?
    2. if ($_REQUEST['setimage'] && file_exists("img/path/".$option."/".$_REQUEST['setimage'])) { %ВыводФотографии% }
    3. ?>
    1. Стоит ли ставить проверку на две точки, если проверка на существование файла привязана насмерть в папке? Тесты показали что две точки не проходят, но мало ли...
    2. Стоит ли (и возможно ли) всю эту систему еще упростить, или дальше некуда?