Firefox игнорирует программное изменение массива $ _POST в php - PullRequest
0 голосов
/ 09 января 2012

Я обнаруживаю отправку формы при нажатии кнопки 'addrecord', а затем сбрасываю значение этой кнопки 'addrecord' в массиве $ _POST:

if(array_key_exists('addrecord', $_POST))
{   
    var_dump($_POST);

    if($_POST['addrecord'] == "ADD RECORD")
    {
        $_POST['addrecord'] = "Handled already.";  // prevents a 'reload' 
                                                   // from adding the same record again
       // now do the 'addrecord' -- just once -- to the database
    }
    else
    {
       // yay -- we avoided adding the same record on a browser reload 
    }
 }

И вот проблема -- когда я нажимаю кнопку «перезагрузить» в Firefox 8, показанная выше переменная var_dump показывает мне, что значение «addrecord» для массива post НЕ является строкой «Обработано уже».- это все еще «ADD RECORD».

  • , когда пользователь нажал кнопку «addrecord», сервер получает массив POST, а кнопка addrecord имеет значение «ADD RECORD» -- вот кнопка добавления записи в моей форме:

         <input type="submit" name="addrecord" value="ADD RECORD" />
    
  • , а затем на стороне сервера, я вижу значение «addrecord» является «ДОБАВИТЬ ЗАПИСЬ», и я изменяюЭлемент addrecord массива POST от «ADD RECORD» до «Обработано уже».

  • , а затем сервер отправляет браузеру новую страницу с надписью «Запись».Добавлено! "

Так что, похоже, значение массива POST элемента 'addrecord' больше не является" ДОБАВИТЬ ЗАПИСЬ ", потому что я изменил его на" Обработано уже ".Если пользователь не нажимает кнопку «Добавить запись» в форме снова, а выполняет только перезагрузку страницы - как тогда браузер может переустановить массив POST с «Обработано уже» - на «ДОБАВИТЬ ЗАПИСЬ»?Почему, когда сервер получает перезагрузку страницы, элемент «addrecord» массива POST теряет значение, которое я установил ранее, «Уже обработано». ?

Потому что, когда я нажимаю «перезагрузить»в браузере var_dump говорит мне - это именно то, что произошло: значение addrecord массива POST теперь снова возвращается к «ADD RECORD» - даже если пользователь НЕ нажимал кнопку добавления записи формы.

Почему?Есть ли в браузере кэшированная копия значений, используемых для заполнения массива POST на сервере, так что даже если вы измените массив POST в php на сервере, браузер повторно отправит кэшированную копию всех старыхзначения формы?

Ответы [ 2 ]

1 голос
/ 09 января 2012

Да, браузер запоминает данные POST, и эта кэшированная информация не зависит от всего, что вы пишете в своем PHP-коде для обработки форм.Если пользователь нажмет на перезагрузку, те же самые данные POST будут отправлены снова.

Один альтернативный подход, позволяющий перезагрузить загрузку от повторной вставки тех же данных, заключается в добавлении столбца «идентификатора отправки» в столбец вашей базы данных.Когда вы отображаете форму для заполнения пользователем, включите скрытое поле формы с уникальным идентификатором - см. PHP-функции uniqid () или microtime ().Затем вы можете либо:

a) выполнить запрос к базе данных перед отправкой команды INSERT, чтобы проверить, была ли отправлена ​​форма с таким идентификатором отправки, либо

b) просто добавить индекс UNIQUE.к этому новому столбцу в вашей таблице базы данных, так что повторяющиеся записи не могут быть созданы.

1 голос
/ 09 января 2012

При установке $ _POST в PHP, вы просто переопределяете то, что видит PHP, а не то, что FF отправляет!Firefox никогда не информируется о вашем изменении параметров POST.

На более высоком уровне, я предполагаю, что вы пытаетесь достичь, на SO мы отвечали довольно часто и тщательно.GIYF.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...