Решаю стандартную задачку: на странице стоит чек-бокс, который включает и отключает вывод сообщений. Общая логика: - Состояние чек-бокса после нажатия на кнопку “Сохранить” пишется в БД. - При заходе на страницу, скрипт смотрит в базе данных статус чекбокса и устанавливает соответствующий. - Обрабатываю форму на этой же странице. - В конце скрипта ставлю переадресацию на эту же страницу с помощью header, чтобы «очистить» кэш браузера от предыдущих данных формы. Проблема: В БД инфа пишется, но на странице обновляется только после перезагрузки Т.е. снял галочку, нажал сохранить, страница моргнула – галочка по прежнему стоит. Идешь в БД – там уже 0. Нажал F5 – состояние страницы пришло в соответствие с БД. Помогите найти причину и сделать так, чтобы после перезагрузки страницы она отражала реальное состояние чекбокса согласно БД. Спасибо! Код: Код (Text): <?php require 'config/db_connection.php'; // подключились к базе // Проверяем состояние режима отладки, которое ранее сохранял пользователь: // для этого извлекаем из БД значение флага для чекбокса debug_mode (0 или 1) и сохраняем в $checked $q = "SELECT status FROM tCheckbox WHERE checkbox_name = 'debug_mode'"; $sel = mysql_query ($q); while ($s = mysql_fetch_array ($sel)) { $checked = $s['status']; } // Теперь надо выставить чекбокс согласно флагу в базе. // Для этого в форме использую параметр checked. Если он есть - флаг выставляется, если нет - нет. if ($checked) { $checked = 'checked'; // если флаг стоит, присвоим переменной нужный атрибут, затем выведем в форме } ?> <div class = "section_header"> <h2>Options:</h2> </div> <form method="post"> <input type="checkbox" name="debug_mode" <?php echo $checked ?> > Debug Mode On <br><br> <input type = "submit" name="btnsave" value = "Save"> </form> <!-- Блок обработки формы --> <?php if (isset ($_POST['btnsave'])) { // если кнопка нажата, обрабатываем данные формы $debug_mode = $_POST['debug_mode']; if ($debug_mode) { $debug_mode = true; } else { $debug_mode = false; } // код апдейта значения в БД $q = "UPDATE tCheckbox SET status = '$debug_mode' WHERE checkbox_name = 'debug_mode' "; $sel = mysql_query ($q) or die(mysql_error()); header("Location: admin.php"); // перезагружаем сраницу exit; } ?>
Это потому что вы, формируя ответ сервера, сначала генерите чекбокс, а потом обрабатываете результат запроса и пишете в БД. Таким образом чекбокс генерится при ЕЩЕ поставленной галочке, потому что данные в БД еще не обновлены. Просто код, где у вас обновляются данные, выносите над генерацией чекбокса. А, еще лучше, не код двигайте, а проверяйте, при генерации, есть ли в запросе к серверу данные об изменении галочки. Если есть, используйте их. Если нет - забирайте данные из БД. В общем, проблемы существенной нет, обычное дело
Большое спасибо! Решил сразу пойти по "правильному пути", переделал код исходя из логики "проверяю при генерации страницы, была ли нажата кнопка", но эффект тот же ((( При нажатии на кнопку, данные в базе обновляются корректно. Но на странице отображаются только после рефреша. Посмотрите плиз, что не так (я подробно откомментировал свою логику): Код (Text): <?php require 'config/db_connection.php'; // подключились к базе // Выясняем откуда брать данные для отображения чекбокса. Возможны два сценария: // 1. Пользователь пришел на страницу и не нажимал кнопку // 2. Пользователь отправил форму, нажав на кнопку if (!isset ($_POST['btnsave'])) { // Вариант 1. Пользователь не нажимал кнопку. // В этом случае берем данные о состоянии чекбокса из БД: $q = "SELECT status FROM tCheckbox WHERE checkbox_name = 'debug_mode'"; $sel = mysql_query ($q); while ($s = mysql_fetch_array ($sel)) { $checked = $s['status']; } // И выставляем флаг согласно данным в базе. // Для этого в форме использую параметр checked. Если он есть - флаг выставляется, если нет - нет. if ($checked) { $checked = 'checked'; // если флаг стоит, присвоим переменной нужный атрибут, затем выведем в форме } else { } } else { // Вариант 2. Оказались на странице после нажатия на кнопку // Узнаем состояние чекбокса if ($_POST['debug_mode']) { // Если чек-бокс был выбран, $debug_mode = true; // подготовили переменную для записи в БД "единички" $checked = 'checked'; // подготовили переменную, которая будет выводить в форме признак, отвечающий за выбранное состояние } else { // чек-бокс был сброшен $debug_mode = false; // подготовили переменную для записи в БД "нолик" } // записываем измененное состояние в БД $q = "UPDATE tCheckbox SET status = '$debug_mode' WHERE checkbox_name = 'debug_mode' "; $sel = mysql_query ($q) or die(mysql_error()); header ("Location: admin.php"); } ?> <div class = "section_header"> <h2>Options:</h2> </div> <form method="post"> <input type="checkbox" name="debug_mode" <?php echo $checked ?> > Debug Mode On <br><br> <input type = "submit" name="btnsave" value = "Save"> </form>
Посмотрите код страницы, после выставления/снятия галочки руками Код (Text): <input type="checkbox" name="debug_mode" <?php echo $checked ?> > у вас сгенерит такой тег: Код (Text): <input type="checkbox" name="debug_mode" checked > В то время как вам нужно Код (Text): <input type="checkbox" name="debug_mode" checked="true" > Добавлено спустя 51 секунду: Просто надо чуть внимательнее. По логике все вроде корректно. Спасибо за коментарии, очень в тему пришлись. Добавлено спустя 1 минуту 9 секунд: if ($_POST['debug_mode']) - тут бы я на всякий случай тоже сделал проверку существования через empty() Код (Text): if (!empty($_POST['debug_mode'])) Добавлено спустя 55 секунд: Ну и как бонус - код у вас уязвим к SQL-инъекциям. Почитайте о них и примите меры.
Про checked вот что пишет htmlbook: http://htmlbook.ru/html/input/checked Синтаксис: Код (Text): HTML <input type="radio" checked> <input type="checkbox" checked> XHTML <input type="radio" checked="checked" /> <input type="checkbox" checked="checked" /> Я тестировал оба варианта, если страница использует теги <html></html>, то срабатывает именно вариант А. Просто наличие слова checked. А на разные вариации типа checked="checked", checked="on", checked="true" и пр. реагирует так, словно чек-бокс не выбран (т.е. не видит то, что нужно и считает что чекбокс не выбран). Да и не в этом похоже дело. Если б дело было в неправильном отражении чек-бокса, то он не выставлялся бы при "тру". А он корректно отрабатывает и тру и фолс только после принудительной ручной перезагрузки. Но все равно спасибо за участие, советы и ваше время. Может еще какие идеи будут.
делайте var_dump пост-запроса. И проверьте, входит ли вообще скрипт в ветку, отвечающую за проставление галки, если в запросе есть такое указание.