Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Галочка остаётся помеченной.


Автор: bogdach 15.10.2007, 11:56
Помогите сделать так чтоб если галочка помечена, то она остаётся помеченной сколько бы раз пользователь на нажимал "FIRE".
Код

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" >
<table>
<?php
$fire =  $_POST["fire"];
$hit =  $_POST["hit"];
 for ($i = 0; $i < 10; $i++){
       for ($j = 0; $j < 10; $j++){
         if ($fire == $i . $j || $hit == $i . $j) {
            echo "<td><input type='checkbox' checked='checked' disabled='disabled' value='$i$j' name='hit'></td>";
         } else {
            echo "<td><input type='radio' value='$i$j' name='fire'></td>";
         }
       } // end for loop
     echo "</tr>";
    } // end for loop
?>
</table>
<input type="submit" value="FIRE">
</form>

Автор: PARROT 15.10.2007, 12:04
Код

"<td><input type='checkbox'  value='$i$j' name='hit' checked  disabled></td>";


Добавлено через 1 минуту и 37 секунд
Только причем тут РНР?

Автор: bogdach 15.10.2007, 12:16
Цитата(PARROT @  15.10.2007,  12:04 Найти цитируемый пост)
Без подсветки
1:

"<td><input type='checkbox'  value='$i$j' name='hit' checked  disabled></td>";






Добавлено через 1 минуту и 37 секунд
Только причем тут РНР?

Нет вы посмотрите на код, а лучше протестируй его чтоб было понятнее.
В общем там помечаешь кружек нажимаешь "FIRE" и он становится помеченным квадратиком.
А когда ещё раз помечаешь кружек нажимаешь "FIRE" тот первый квадратик опять становится непомеченным кружком, а мне нужно чтоб он оставался  помеченным квадратиком.

Автор: flashaa 15.10.2007, 12:19
Кривоватый вывод.. Я вижу что строка таблицы закрывается - </tr>, но не вижу, чтобы она открывалась.
Полагаю, надо сделать так:
Код

<?php
$fire =  $_POST["fire"];
$hit =  $_POST["hit"];
 for ($i = 0; $i < 10; $i++){
    echo '<tr>';
       for ($j = 0; $j < 10; $j++){
         if ($fire == $i . $j || $hit == $i . $j) {
            echo "<td><input type='checkbox' checked='checked' disabled='disabled' value='$i$j' name='hit'></td>";
         } else {
            echo "<td><input type='radio' value='$i$j' name='fire'></td>";
         }
       } // end for loop
     echo "</tr>";
    } // end for loop
?>


У тебя есть таблица 10х10, внутри ячеек которой либо чекбокс, либо радио... Что-то ты не договариваешь, поэтому остальное понять не могу.


Добавлено @ 12:24
Цитата(bogdach @  15.10.2007,  12:16 Найти цитируемый пост)
А когда ещё раз помечаешь кружек нажимаешь "FIRE" тот первый квадратик опять становится непомеченным кружком, а мне нужно чтоб он оставался  помеченным квадратиком. 

Теперь понятно. 
А с чего у тебя должны сохраняться предыдущие пометки?

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


Код

<?php session_start(); ?> // это должно быть первой строкой

<?php
$fire =  $_POST["fire"];
$hit =  $_POST["hit"];
 for ($i = 0; $i < 10; $i++){
    echo '<tr>';
       for ($j = 0; $j < 10; $j++){
         if ($fire == $i . $j || $hit == $i . $j || !empty($_SESSION[$i.$j])) {
            $_SESSION[$i.$j] = 1;
            echo "<td><input type='checkbox' checked='checked' disabled='disabled' value='$i$j' name='hit'></td>";
         } else {
            echo "<td><input type='radio' value='$i$j' name='fire'></td>";
         }
       } // end for loop
     echo "</tr>";
    } // end for loop
?>

Автор: bogdach 15.10.2007, 12:30
Цитата(flashaa @  15.10.2007,  12:19 Найти цитируемый пост)
Кривоватый вывод.. 

Код кривоватый а вывод нормальный.
Цитата(flashaa @  15.10.2007,  12:19 Найти цитируемый пост)
Что-то ты не договариваешь, поэтому остальное понять не могу.

Там ещё есть кнопка которую вы упустили, попробуйте пометить кружок и нажать эту кнопку. не бойтесь ничего страшного не произойдет.  smile smile 

Автор: flashaa 15.10.2007, 12:44
Где же вывод нормальный, если  в нем откровенное нарушение древовидной структуры причем в элементе второй вложенности - таблице. Да, браузер отрисовал, потому что умный, и потому что код простой.
Я отредактировал пост, в нем решение.

Автор: bogdach 15.10.2007, 12:53
Цитата(flashaa @  15.10.2007,  12:19 Найти цитируемый пост)
Чтобы он помечал все, тебе нужно каждый раз сохранять,
например в сессию.

А кроме сессий куда ещё можно сохранят? А то у меня сессии почемуто не работают.

Автор: MoLeX 15.10.2007, 12:59
bogdach, в куки, файлы, БД.

Автор: bogdach 15.10.2007, 13:19
Цитата(MoLeX @  15.10.2007,  12:59 Найти цитируемый пост)
bogdach, в куки, файлы, БД.

Ну в общем то понятно. Я просто в сессиях не разбираюсь.
Цитата(flashaa @  15.10.2007,  12:19 Найти цитируемый пост)
<?php session_start(); ?> // это должно быть первой строкой

<?php
$fire =  $_POST["fire"];
$hit =  $_POST["hit"];
 for ($i = 0; $i < 10; $i++){
    echo '<tr>';
       for ($j = 0; $j < 10; $j++){
         if ($fire == $i . $j || $hit == $i . $j || !empty($_SESSION[$i.$j])) {
            $_SESSION[$i.$j] = 1;
            echo "<td><input type='checkbox' checked='checked' disabled='disabled' value='$i$j' name='hit'></td>";
         } else {
            echo "<td><input type='radio' value='$i$j' name='fire'></td>";
         }
       } // end for loop
     echo "</tr>";
    } // end for loop
?>

Этот код не работает, вернее работает не так как я хотел.
Он оставляет помеченые квадратики только если их помечать попорядку а если вразброс то не оставляет. А мне надо чтобы вразброс работало

Автор: flashaa 15.10.2007, 14:00
Код работает так - перебирает все элементы таблицы, если координаты элемента соотвествуют $hit или  $fire или есть запись в сессии с координатами этого элемента (из 3х уловий достаточно выполнение хотя бы 1), то: 
1) добавляем в сессию информацию об элементе
2) отрисовываем помеченный элемент
Поскольку каждый элемент имеет свои собственные координаты и  мы проходимся по КАЖДОМУ элементу, проверяя отдельно условия для КАЖДОГО элемента - не вижу никакой зависимости от порядка нажатия... Скорее всего в браузере вы видите устарешвший вариант страницы. Чтобы этого избежать, вставьте перед первым выводом в браузер заголовки запрета кеширования. Собственно, session_start()  должно быть ДО вывода в браузер.

Код

/** Запрещаем кеширование */
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); //Дата в прошлом 
header('Cache-Control: no-cache, must-revalidate'); // HTTP/1.1 
header('Pragma: no-cache'); // HTTP/1.1 
header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . 'GMT');




Автор: bogdach 15.10.2007, 14:21
Цитата(flashaa @  15.10.2007,  14:00 Найти цитируемый пост)
Код работает так - перебирает все элементы таблицы...

Я просто удивляюсь как вы так можете посмотрели на код и знаете как он работает. По теории он может и работает а на практике нет. Вставил заголовки запрета кеширования, протестиравал, всё равно не работает, не знаю уже что и делать. :(

Автор: flashaa 15.10.2007, 14:30
Проверил код на своей машине - все работает.

Добавлено через 2 минуты и 37 секунд
Вот полный текст скрипта:

Код

<?php session_start(); ?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" >
<table> 

<?php
$fire =  $_POST["fire"];
$hit =  $_POST["hit"];
 for ($i = 0; $i < 10; $i++){
    echo '<tr>';
       for ($j = 0; $j < 10; $j++){
         if ($fire == $i . $j || $hit == $i . $j || !empty($_SESSION[$i.$j])) {
            $_SESSION[$i.$j] = 1;
            echo "<td><input type='checkbox' checked='checked' disabled='disabled' value='$i$j' name='hit'></td>";
         } else {
            echo "<td><input type='radio' value='$i$j' name='fire'></td>";
         }
       } // end for loop
     echo "</tr>";
    } // end for loop
?>
</table>
<input type="submit" value="FIRE">
</form>

Автор: bogdach 15.10.2007, 14:44
Цитата(flashaa @  15.10.2007,  14:30 Найти цитируемый пост)
Проверил код на своей машине - все работает.

Значит это у меня машина не правильная. У меня Апач, наверное он сессии не поддерживает. Может есть какой другой способ, например сохранять это в спрятанные элементы формы?

Автор: flashaa 15.10.2007, 15:01
Чтобы что-то отладить, надо понять что не работает. У вас выдаются какие-либо ошибки? Апач какой версии, как устанавливали?
По поводу вашей задачи - расскажите по-подробнее, для чего вы это делаете, возможно, удасться оптимизировать.

Другой вариант работы: с сохранением в файл(в папке со скриптом создайте файл selected.txt) - у себя проверял, работает

Код

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" >
<table> 
<?php
$selected_array = explode('.', file_get_contents('selected.txt'));

$fire =  $_POST["fire"];
$hit =  $_POST["hit"];
 for ($i = 0; $i < 10; $i++){
    echo '<tr>';
       for ($j = 0; $j < 10; $j++){
         if ($fire == $i . $j || $hit == $i . $j || in_array($i . $j, $selected_array)) {
            array_push($selected_array, $i . $j);
            echo "<td><input type='checkbox' checked='checked' disabled='disabled' value='$i$j' name='hit'></td>";
         } else {
            echo "<td><input type='radio' value='$i$j' name='fire'></td>";
         }
       } // end for loop
     echo "</tr>";
    } // end for loop
$f = fopen('selected.txt', 'w');
fwrite($f, implode('.', $selected_array));
fclose($f);
?>
</table>
<input type="submit" value="FIRE">
</form>

Автор: bogdach 15.10.2007, 15:25
Цитата(flashaa @  15.10.2007,  15:01 Найти цитируемый пост)
Другой вариант работы: с сохранением в файл(в папке со скриптом создайте файл selected.txt) - у себя проверял, работает

А вот это работает, отлично. Спасибо, спасибо и еще раз спасибо! smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)