|
|
|
| На странице - один чекбокс. Отметили его - поле в базе становится =1, сняли чекбокс- поле должно обнулиться. Где-то у меня ошибка... Помогите, пожалуйста.
<?php
$query = mysql_query("SELECT DISTINCT name, auction_id,intrest
FROM anticvar_auctions
WHERE auction_id = " . (int) $_GET['auction_id'] . " LIMIT 5");
while($row = mysql_fetch_assoc($query)){
//print_r($row);
if($row['intrest'] == 1) $cheked = "checked";
$sql = mysql_query("UPDATE anticvar_auctions SET intrest = 0
WHERE auction_id = " . $row['auction_id']);
if(!$sql) exit(mysql_error());
if(isset($_POST['something'])){
if($_POST['intrest'] == $row['intrest']){
$r = "INSERT INTO anticvar_auctions(intrest) VALUES(1)
WHERE auction_id = " . $row['auction_id'];
$re = mysql_query($r);
if(!$r)exit(mysql_error());
}
}
echo "
<table width=100% border=0 cellspacing=3 cellpadding=3 class='border'>
<tr><td colspan = 4>
<form method='post' action='' name = 'something'>
<input type='checkbox' name='intrest' value='" . $row['auction_id'] . "'
onclick='document.something{$row['auction_id']}.submit();'" .
$cheked . "/>
Поместить товар в раздел <span style = 'font-weight:bold;color:#F00;'>\"
Это интересно\"</span>
</form>
</td></tr></table>
";
}
?>
|
| |
|
|
|
|
|
|
|
для: Лена
(11.03.2010 в 12:32)
| | >
if($row['intrest'] == 1) $cheked = "checked";
$sql = mysql_query("UPDATE anticvar_auctions SET intrest = 0 ..............
|
для чего при показе состояний всех переключателей в таблице все они устанавливаются в 0 ?
и с $cheked чегойто не понял почему прокручивается 5 записей , и $cheked получается 1 если хоть одна запись была 1
.. со вторым общитался кучерявых скобок :) | |
|
|
|
|
|
|
|
для: heed
(11.03.2010 в 13:21)
| | Немного переделала.
<?php
$s = "SELECT DISTINCT name, auction_id,intrest
FROM anticvar_auctions
WHERE auction_id = 100091";
$query = mysql_query($s);
while($row = mysql_fetch_assoc($query)){
if($_row['intrest'] == 1){
$cheked = "checked";
}else
$cheked = "";
if(isset($_POST['something'])){
$r = "UPDATE anticvar_auctions SET intrest = 1
WHERE auction_id = " . $row['auction_id'];
print $r;
$re = mysql_query($r);
if(!$r)exit(mysql_error());
}
echo "
<table width=100% border=0 cellspacing=3 cellpadding=3 class='border'>
<tr><td colspan = 4>
<form method='post' action='' name = 'something'>
<input type='checkbox' name='intrest' value='" . $row['auction_id'] . "'
onclick='if(this.checked)this.form.submit();'" .
$cheked . "/>
Поместить товар в раздел
<span style = 'font-weight:bold;color:#F00;'>\"Это интересно\"</span>
</form>
</td></tr></table>
";
}
?>
|
| |
|
|
|
|
|
|
|
для: Лена
(11.03.2010 в 14:17)
| | сравните
if($_row['intrest'] == 1){ $cheked = "checked";
<input type='checkbox' name='intrest' value='" . $row['auction_id'] . "' | |
|
|
|
|
|
|
|
для: Trianon
(11.03.2010 в 22:22)
| | Спасибо. Сделала. По другому способу.
<?php
$query = mysql_query("SELECT DISTINCT name, auction_id,intrest
FROM anticvar_auctions
WHERE auction_id = " . (int) $_GET['auction_id']);
while($row = mysql_fetch_assoc($query)){
$_SESSION['check'] = isset($_POST['intrest']) ? 1 : 0;
if(isset($_SESSION['check'])){
$r = "UPDATE anticvar_auctions SET intrest = " . $_SESSION['check'] . "
WHERE auction_id = " . $row['auction_id'];
//print $r;
$re = mysql_query($r);
if(!$r)exit(mysql_error());
}
echo "
<table width=100% border=0 cellspacing=3 cellpadding=3 class='border'>
<tr><td colspan = 4>
<form method='post' action='' name = 'something'>
<input type='checkbox' name='intrest'
onclick='this.form.submit()' ".($chek = $_SESSION['check'] ? 'checked' : ''). "/>
Поместить товар в раздел
<span style = 'font-weight:bold;color:#F00;'>\"Это интересно\"</span>
</form>
</td></tr></table>
";
}
?>
|
| |
|
|
|
|
|
|
|
для: Лена
(12.03.2010 в 15:47)
| | А если $_SESSION['check'] поменять на $my_check , картина принципиально изменится? | |
|
|
|
|
|
|
|
для: Trianon
(13.03.2010 в 00:57)
| | Леной изначально не была описана ситуация. Ранее она пыталась принимать изменения чекбокса, которых у нее в принципе просто не могло быть. Почему не могло, я ей объяснил на примере, в котором роль "запоминающего устройства" выполняла сессия. Вот она сюда и перекочевала, я так полагаю. )
Представляю круглые глаза респондента Агента, которому я случайно сбросил вопрос адресованный Лене, но "протеста" в ответ не поступило, как и не получил я ответа на вопрос - куда попадает пользователь по запросу формы?
Если действия пользователя не откладываются "на потом", то чекбокс в форме, это просто картинка с галочкой или без оной для пользователя, а для скрипта обработчика его состояние вообще не важно - он просто отправляет форму:
<form method="post" action="?auction_id=id">
Важно будет только наличие запроса $_GET['auction_id'], и коли он будет, то просто проинвертировать состояние auction_id в базе. | |
|
|
|
|
|
|
|
для: sim5
(13.03.2010 в 08:16)
| | У ж коль скоро Вы в курсе ситуации, проясните еще один вопрос, если нетрудно.
Поле auction_id является первичным ключом или нет? | |
|
|
|
|
|
|
|
для: Trianon
(13.03.2010 в 08:45)
| | Я знаю только, что это id некой записи имеющей поле хранящее состояние этого чекбокса. Видимо для ясности мне нужно было написать:
то просто проинвертировать состояние для этого auction_id в базе. | |
|
|
|
|
|
|
|
для: sim5
(13.03.2010 в 08:55)
| | то есть первичный ключ.
Плохо.
Каша в скрипте. | |
|
|
|
|
|
|
|
для: Trianon
(13.03.2010 в 11:06)
| | Показываю наглядно, что нужно сделать.
http://lena.starbot.spb.ru/auction_details.php?auction_id=100086 - здесь мы видим карточку отдельного товара. В карточке есть чекбокс и рядом с ним надпись "Поместить товар в раздел "Это интересно". Отмечаем чекбокс - товар попадает в раздел "Это интересно", который находится в левой колонке сайта. Снимаем чекбокс - товар в левой колонке исчезает.
auction_id - первичный ключ в таблице, где лежат данные про товар.
состояние чекбокса мы отмечаем в поле intrest , 0 - чекбокс не отмечен, 1 - чекбокс отмечен.
Ошибка в том, что когда загружается карточка товара, чекбокс у нас оказывается неотмеченным, даже если поле intrest = 1. | |
|
|
|
|
|
|
|
для: Лена
(13.03.2010 в 18:44)
| | Попадает ли пользователь при выборе чекбокса (отправке формы) на эту же страницу? | |
|
|
|
|
|
|
|
для: sim5
(13.03.2010 в 18:49)
| | Да, он остается на этой же странице. | |
|
|
|
|
|
|
|
для: Лена
(13.03.2010 в 18:51)
| | >Ошибка в том, что когда загружается карточка товара, чекбокс у нас оказывается неотмеченным, даже если поле intrest = 1.
Я так полагаю, что загружаемая первый раз карточка и должна быть невыбранной (значение по умолчанию). Но если если загружается и как выбранная, то какие проблемы, ведь при каждом выводе страницы, проверяется состояние, а значит и чекбоск будет установлен. Какие тут могут быть проблемы? | |
|
|
|
|
|
|
|
для: sim5
(13.03.2010 в 19:01)
| | Нет. Чекбокс получается неустановленным.
Кликните на товаре, который уже находится в разделе "Это интересно". Чекбокс должен быть уже отмечен, а он - не отмечен. | |
|
|
|
|
|
|
|
для: Лена
(13.03.2010 в 19:09)
| | Давайте представим, что мы с вами супруги. На Украине наступила пусть и небольшая, но стабильность в ценах, что позволило нам накопить средства для покупки выключателя в прихожую. Этот выключатель управляет светом в зале (вот такая странность небольшая), и электрик установив его, оставил его в положение включено.
Я замечаю за своей супругой - как только она входит в квартиру, она громко объявляет о своем приходе - "Я пришла!". Это конечно радует (пора бы и борщ кушать), но есть у моей супруги (что я узнал, к сожалению, только после замужества) еще одно странное хобби. Она не только заявляет о своем приходе, но и обязательно при этом щелкает выключателем - если он включен был, выключает, а если выключен, включает.
Мне же, находящемуся в зале, совсем не обязательно знать когда супруга щелкнет им, мне достаточно улышать - "Я пришла!", и если я в это время (при свете) смотрю по ТВ игру киевского "Динамо", то обоснованно подумаю - "Ну все, пришел конец света!", а если в темноте сплю на диване, то - "Ну капец снам сладким...".
И это будет продолжаться бесконечно, по кольцу (выкл. вкл. выкл. вкл...), пока либо я не отучу супругу от этого хобби, либо пока не сломается выключатель.
При это двери в квартиру (это важно) к данной проблеме отношения не имеют, хотя супруга попадает в квартиру именно через них.
Согласны, что такой автомат будет работать? :)
Ну тоже самое и с чекбоксом. Имя переменной (двери) в url, по которому пользователь впервые попадает на страницу должно отличаться от запрашиваемого формой (выключатель).
При этом чекбокс, это тот же выключатель визуальный для супруги (чтобы ей не ошибиться с выбром:)), а я, это поле в таблице, которое просто запоминает - свет/темно.
Устнаваливаем по умолчанию значение выбрано в базе, и этим значеним будет служить значение -1. Запрос auction_id со ссылки мы игнорируем, но проверяем состояние чебокса и выводим его соответсвенно. Пусть это первое, установленное:
<input type="checkbox" <? echo $row['setid'] ? "checked" : "" ?> />
Форма передает переменную auctionset_id, на которую мы будем реагировать ("Я пришла!")
<form action="?auctionset_id=100086" method="post"></form>
Получая эту переменную, реагируем, устанавливая в базе - SET setid=~setid. Выводим страницу, естественно с проверкой состояния (выше), получаем нужное. | |
|
|
|
|
|
|
|
для: sim5
(13.03.2010 в 19:59)
| | Как форма может передавать переменную туда, куда вы указали, если у нас метод передачи формы - post? У вас же переменная auctionset_id уже идет как гет-параметр. Или я чего-то не понимаю... | |
|
|
|
|
|
|
|
для: Лена
(13.03.2010 в 20:18)
| | Если форма передается методом POST, то можно в атрибуте action формы передать переменную, которая будет передана методом GET (ведь это таже url строка). В случае передачи формы методом GET, такое уже не будет работать.
Можно и скрытое поле зайдествовать, но в данном случае в нем нет необходимости. | |
|
|
|
|
|
|
|
для: sim5
(13.03.2010 в 20:21)
| | Хорошо. Переходим к моей форме.
<form method='post' action='?auctionset_id=11234' name = 'something'>
<input type='checkbox' name='intrest'
onclick='this.form.submit()' ".$row['intrest'] . "?'checked':''" . "/>
И далее проверяем этот гет-параметр, которые мы передаем в форме, при получении формы:
$my_check = isset($_GET['auctionset_id']) ? 1 : 0;
if(isset($my_check)){
$r = "UPDATE anticvar_auctions SET intrest = " . $my_check . "
WHERE auction_id = " . $row['auction_id'];
$re = mysql_query($r);
if(!$r)exit(mysql_error());
}
Ерунда какая-то получается... Мы же в любом случае получим $_GET['auctionset_id'] и у нас получится значение чекбокса = 1, отметили мы его или нет.
Не пойму, как нам состояние отмечен-неотмечен получить... | |
|
|
|
|
|
|
|
для: Лена
(13.03.2010 в 20:33)
| | $my_check = isset($_GET['auctionset_id']) ? 1 : 0; - это забыть. Нам вообще не нужно этого знать, мы будем делать обычный счетный триггер, а это такая штука, которая менят свое состояние на противоположное при каждом воздейстиви на него. Нам также не важен чекбокс как таковой, ему даже имя не нужно - принимать на сервере его нет необходимости. Он нужен лишь для информации пользователю о состоянии его выбора.
Коли требуется по умолчанию выбор (сразу при загрузке анкеты), то поле состояния по умолчанию сделаем равным 1 (не -1, забыл о представлении). Все, а далее все происходит автоматически - требуют изменить состояние, меняем, нет, значит нет.
Пусть тестовая база имеет следующее:
CREATE TABLE `auction` (
`id` int(11) NOT NULL auto_increment,
`idset` tinyint(4) default '1',
`name` varchar(30) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=3 ;
INSERT INTO `auction` VALUES (1, 1, 'aaaa');
INSERT INTO `auction` VALUES (2, 1, 'bbb');
|
С некой страницы делаем запрос на страницу выбора:
<a href="auction.php?id=2">GO</a>
|
На этой странице:
<?
//для простоты приравниваем два запроса одной переменной,
//другого в примере не предполагается,
//а запросы должны обрабатываться оба
$id = isset($_GET['idset']) ? intval($_GET['idset']) : intval($_GET['id']);
//если пришел запрос от формы - пользователь изменил выбор,
//то инвертируем значение состояния выбора операцией XOR
if(isset($_GET['idset'])) mysql_query("UPDATE auction SET idset = idset ^ 1 WHERE id=" . $id);
//основной код - вывод страницы пользователю
$q = mysql_query("SELECT * FROM auction WHERE id=" . $id);
$row = mysql_fetch_assoc($q);
echo '<form action="auction.php?idset=' . $id . '" method="post">' .
$row["name"] . ' <input type="checkbox" onclick="this.form.submit()" ' .
($row["idset"] ? "checked" : "") .
' /></form>';
|
| |
|
|
|
|
|
|
|
для: sim5
(13.03.2010 в 21:51)
| | Спасибо, в "переключателе" разобралась, итоговый вариант покажу чуть позже.
Теперь еще такой момент.
В разделе "Это интересно" может быть только 5 товаров.
Получается, перед тем, как поставить очередной чекбокс, мне нужно проверить, сколько у меня уже есть отмеченных чекбоксов.
Делаю запрос: SELECT COUNT(*) FROM anticvar_auctions WHERE intrest = 1
или intrest <>0.
Получаю я число отмеченных чекбоксов.
Теперь мне перед отправкой формы на клиенте надо выяснить, могу ли я добавить еще один чекбокс.
Т.е. это надо проверить по событию onclick="if(count>5){alert('В разделе "это интересно" может быть до 5 товаров.');}else{this.form.submit();}"
count - это число отмеченных чекбоксов из базы. Как мне лучше передать это значение из сервера в клиент? | |
|
|
|
|
|
|
|
для: Лена
(13.03.2010 в 22:56)
| | Ну вот, оказывается предполагать нужно было о гареме. )
Перед отправкой формы клиенту решать, может ли он вообще иметь инструмент выбора (чекбокс). Аукцион, значит в режиме реального времени пользователь N должен видеть положение с квотой на сервере, т.е. - Ajax.
Хотя реальность времени для сети с ее задержками... думаю, что все равно сервер должен проверять возможно ли добавление, и одному из выбравших, лишнему, выдать сообщение. | |
|
|
|
|
|
|
|
для: sim5
(14.03.2010 в 07:22)
| | Согласно условию задачи, ставить чекбоксы может только админ сайта - один человек. Тут, наверное, достаточно проверки, показывать или не показывать ему чекбокс. | |
|
|
|
|
|
|
|
для: Лена
(14.03.2010 в 11:55)
| | Ну значит и проблемы нет. | |
|
|
|
|
|
|
|
для: sim5
(14.03.2010 в 12:19)
| | Тогда все получилось. Большое спасибо. Можно жениться :)))
<?php
$q = "SELECT COUNT(*) FROM anticvar_auctions WHERE intrest = 1";
$res = mysql_query($q);
if(!$res) exit(mysql_error());
$count_auc = mysql_result($res,0);
if($count_auc<5){
$id = isset($_GET['idset']) ? intval($_GET['idset']) : intval($_GET['auction_id']);
if(isset($_GET['idset']))
mysql_query("UPDATE anticvar_auctions SET intrest = intrest ^ 1 WHERE auction_id = " . $id);
$s = "SELECT name, auction_id,intrest
FROM anticvar_auctions
WHERE auction_id =" . $id;
$query = mysql_query($s);
if(!$query) exit(mysql_error());
$row = mysql_fetch_assoc($query);
echo "
<table width=100% border=0 cellspacing=3 cellpadding=3 class='border'>
<tr><td colspan = 4>
<form method='post' action='?idset=" . $row["auction_id"] . "'>
<input type='checkbox' name='intrest'
onclick='this.form.submit()' ".($row["intrest"] ? 'checked' : '') . "/>
Поместить товар в раздел
<span style = 'font-weight:bold;color:#F00;'>\"Это интересно\"</span>
</form>
</td></tr></table>
";
}
?>
|
| |
|
|
|
|
|
|
|
для: Лена
(14.03.2010 в 12:25)
| | На хостинге сначала не работало. Пришлось немного поменять гет-параметры, которые передает форма:
<form method='post' action='auction_details.php?auction_id=" . $row["auction_id"] . "&idset=" . $row["auction_id"] . "'>
Одна проблема осталась.
Допустим, у нас в разделе "Это интересно" уже есть 5 товаров. Мы хотим снять чекбокс с одного из товаров, но мы этого сделать не можем, потому что у нас теперь не видно вообще этогочекбокса. Надо, получается, еще куда-то запоминать id`ы тех чекбоксов, которые отмечены и для них выводить чекбокс. | |
|
|
|
|
|
|
|
для: Лена
(14.03.2010 в 12:36)
| | <form method='post' action='auction_details.php?auction_id=" . $row["auction_id"] . "&idset=" . $row["auction_id"] . "'>
тогда путаница получается. | |
|
|
|
|
|
|
|
для: sim5
(14.03.2010 в 12:52)
| | Самое интересное, что с этой путаницей - работает. Без нее - нет. | |
|
|
|
|
|
|
|
для: Лена
(14.03.2010 в 13:10)
| | Значит вы допустили ошибку в логике, скорее всего не верна проверка запросов - то что у меня в примере, годится только для примера, а не для реальной страницы. ID для состояния должен передваться именно при отправке формы, а других запросов здесь не должно быть. | |
|
|
|
|
|
|
|
для: sim5
(14.03.2010 в 13:17)
| | У меня так получилось:
<?php
if(!$count_auc<6){
$id = isset($_GET['idset']) ? intval($_GET['idset']) : intval($_GET['auction_id']);
if(isset($_GET['idset']))
mysql_query("UPDATE anticvar_auctions SET intrest = intrest ^ 1 WHERE auction_id = " . $id);
$s = "SELECT name, auction_id,intrest
FROM anticvar_auctions
WHERE auction_id =" . $id;
$query = mysql_query($s);
if(!$query) exit(mysql_error());
$row = mysql_fetch_assoc($query);
echo "
<table width=100% border=0 cellspacing=3 cellpadding=3 class='border'>
<tr><td colspan = 4>
<form method='post' action='auction_details.php?auction_id=" . $row["auction_id"] . "&idset=" . $row["auction_id"] . "'>
<input type='checkbox' name='intrest'
onclick='this.form.submit()' ".($row["intrest"] ? 'checked' : '') . "/>
Поместить товар в раздел
<span style = 'font-weight:bold;color:#F00;'>\"Это интересно\"</span>
</form>
</td></tr></table>
";
}
?>
|
Если я пытаюсь добавить шестой товар, то чекбокс для него выводится. Хотя на самом деле этот чекбокс не должен выводиться. | |
|
|
|
|
|
|
|
для: Лена
(14.03.2010 в 13:23)
| | Какова роль администратора в добавлении?
Если только администратор имеет право выставить (добавить) пять товаров для торгов, то почему выбор/сброс товара обуславливается условием if(!$count_auc<6)?
Что за правила на этом аукционе?
Еще раз повторяю, это:
<form method='post' action='auction_details.php?auction_id=" . $row["auction_id"] . "&idset=" . $row["auction_id"] . "'>
в корне не верно! | |
|
|
|
|
|
|
|
для: sim5
(13.03.2010 в 21:51)
| | Вообще-то делать модифицирующие GET-запросы с нестабильными результирующими состояниями - практика довольно порочная.
Дело в том, что GETы имеют обыкновение иногда повторяться без дополнительных предупреждений.
Или у вас триггер переключается POST-запросом?
Тогда стоит еще $_SERVER['REQUEST_METHOD'] проверить для надежности... | |
|
|
|
|
|
|
|
для: Trianon
(13.03.2010 в 23:45)
| | Вообще-то повторный запрос это другая проблема, это тут вообще не рассматривается. ) | |
|
|
|