За последние 24 часа нас посетили 17387 программистов и 1600 роботов. Сейчас ищут 937 программистов ...

Обрезанная строка - фича или ошибка?

Тема в разделе "Вопросы от блондинок", создана пользователем Pied Piper, 26 авг 2008.

  1. Pied Piper

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

    С нами с:
    15 авг 2008
    Сообщения:
    15
    Симпатии:
    0
    Я случайно наткнулся на странную на мой взгляд вещь: скрипт нормально работал на моем компе (IIS 6 + PHP 5.2.6), а когда я его положил на хостинг, вдруг взбрыкнул: от строк, содержащихся в массиве, остались только первые буквы. "Методом скульптора" (отсечь все лишнее) я получил некий минимальный скрипт (ttt.php), который демонстрирует эту фичу.
    PHP:
    1. <html><head></head>
    2. <form method="post" action="ttt.php">
    3. <select name="T" size=1>
    4. <option selected value="1"> Aaa </option>
    5. </select>
    6. <input type="submit" value="Set">
    7. </form>
    8. <?php
    9.     $T[0]="asdf";
    10.     echo "$T[0]";
    11.     phpinfo();
    12. ?>
    13. </body>
    14. </html>
    А тут можно посмотреть его в работе на хостинговом сервере. Чтобы увидеть эффект надо нажать на кнопку и следить за словом под ней. Чтобы вторично насладиться, надо закрыть браузер и пойти по этой ссылке заново. phpinfo я вставил, пытаясь предвосхитить вопросы любопытных.. :) Как я уже сказал, этот скрипт минимальный (почти). Например, убирание тега "option" приводит к мсчезновению эффекта. Я проверял только в IE, но думаю, что это не важно.
    Так что это - ошибка версии 4.4.7 или результат неизвестных мне настроек на сервере?..
     
  2. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
  3. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Правильный вариант:

    PHP:
    1. <?php
    2.     $T = array();
    3.     $T[0]="asdf";
    4.     echo "$T[0]";
    5.     phpinfo();
    6. ?>
     
  4. Pied Piper

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

    С нами с:
    15 авг 2008
    Сообщения:
    15
    Симпатии:
    0
    хм..
    Но почему тогда:
    1. в первый раз выводится вся строка;
    2. на моей машине всегда выводится вся строка;
    3. если убрать option выводится вся строка
    ???

    Нда, нестрогая типизация - это мина в песочнице.. :)
     
  5. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Потому что из формы приходит строка. А когда из формы ничего не приходит, то $T превращается в массив. Виной всему - regiter_globals и необъявленная переменная. Тоесть в данном примере поведение предсказуемо.
     
  6. Pied Piper

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

    С нами с:
    15 авг 2008
    Сообщения:
    15
    Симпатии:
    0
    Замысловато... Куда "приходит" эта строка? Это надо обдумать..

    И вопрос номер 2 остается.
     
  7. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    register_globals on

    Из формы приходит переменная $T, которая является строкой. Ты меняешь нулевой индекс строки, тоесть первый символ строки на "a". А затем его выводишь.

    register_globals off
     
  8. Pied Piper

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

    С нами с:
    15 авг 2008
    Сообщения:
    15
    Симпатии:
    0
    Вот теперь врубился.
    Сработало случайное совпадение назвний переменной и элемента формы. И поскольку я никогда не пользовался register_globals (все больше $_POST), то и внимания не обратил..
    Спасибо! :)