|
|
|
| Вот такой вопрос, как в базу занести если выбрали 2-3 или 8 checkbox?
Я так понял через массивы как-то.. | |
|
|
|
|
|
|
|
для: Ванек2010
(31.01.2010 в 10:47)
| | Просто - установкой соответсвующего значения в соответсвующем поле, вот только все зависит от того, что определяют эти чекбоксы, что будет в свою очередь определять способ хранения этих значений. | |
|
|
|
|
|
|
|
для: sim5
(31.01.2010 в 10:51)
| |
<? /* Страница тест */
$res8 = mysql_query("SELECT * FROM test WHERE user='$_SESSION[login]' ",$db);
$myr8 = mysql_fetch_array($res8);
echo"
<form name='form1' method='post' action='obrabotchik.php'>";
do { echo "
<input type='checkbox' name='idt' id='checkbox' value='$myr8[id]' >";
}
while ($myr8 = mysql_fetch_array($res8));
echo "
<input type='submit' name='submit1' value='Сохранить изменения'>
</form>";
?>
|
<? /*Страница обработчик */
if (isset($_POST['idt'])) {$idt = $_POST['idt']; if ($idt == '') {unset($idt);}}
$resUP1 = mysql_query ("UPDATE test SET add='ON' WHERE id='$idt' ");
?>
|
Вот и как мне занести если 2 выбрали или 3 или 8 checkbox ? У меня только 1 заносится | |
|
|
|
|
|
|
|
для: Ванек2010
(31.01.2010 в 11:02)
| | mysql_fetch_array если использовать, то хотя бы флаг указывайте, а вообще используйте mysql_fetch_assoc.
do ... while тут вообще ни к чему, и вам вроде бы как уже указывали на сей факт.
Что касается группы выбранных чекбоксов, начнем с этого - а вы знаете что получите на сервере, если чекбокс выбран? Каким образом они у вас именуются в форме, при ее выводе, если форма имеет 8 чекбоксов? | |
|
|
|
|
|
|
|
для: sim5
(31.01.2010 в 11:17)
| | Именуются они одинакого, name='idt' просто значение разное , там же в цикле их выполняю.
Их может быть 8 на следущий день 20 на следущий 30, и как показать файлу обработчику, какой именно выбран checkbox я не могу понять. Думал как-то через массивы | |
|
|
|
|
|
|
|
для: Ванек2010
(31.01.2010 в 11:43)
| | обрабатывая набор чекбоксов, в форме нужно давать полям имена элементов массива.
"<input type='checkbox' name='idt[$id]' ..."
Где $id - номер позиции. | |
|
|
|
|
|
|
|
для: Trianon
(31.01.2010 в 11:48)
| | а на странице обработчике, что надо добавить?
И почему тут "<input type='checkbox' name='idt[$id]' ..."
$id а не 0 тож не понял | |
|
|
|
|
|
|
|
для: Ванек2010
(31.01.2010 в 11:43)
| | Ну ведь можно проверить, что вы будете получать, послав на сервер форму, например, с тремя чекбоксами и с одинаковыми именами? Посмотрите обязательно, и уже поймете, что в таком случае вы просто никоим образом не узнаете были ли нажаты несколько чекбоксов или один.
Учить надо и пробовать для уяснения. | |
|
|
|
|
|
|
|
для: sim5
(31.01.2010 в 11:58)
| | Блин я уже так запутался ппц.
Допустим я сюда всунул $id
<?
echo "<input type='checkbox' name='idt[$id]' id='checkbox' value='$myr8[id]' >";
?>
|
Ну а че $id значит то? Где ей давать значения:/
Ну вот , сделал так idt[$id] дальше отсылается на обработчик, а как доставать этот масив и заносить в базу? Вот это я не пойму | |
|
|
|
|
|
|
|
для: Ванек2010
(31.01.2010 в 12:23)
| | Вот почему бы прежде чем заносить что-то в базу из формы, понять что вы получаете от нее?
Отправьте для теста вот эту форму и посмотрите, что вы получите в этом случае, при выборе тех или иных чекбоксов:
<form action="" method="post">
<input type="checkbox" name="as[]" value="1">
<input type="checkbox" name="as[]" value="2">
<input type="checkbox" name="as[]" value="3">
<input type="submit" value="Send">
</form>
|
Проверку производить так:
print_r($_POST) | |
|
|
|
|
|
|
|
для: sim5
(31.01.2010 в 12:32)
| | Так как передать массив я вроде понял, а как заносить массив в базу ?? | |
|
|
|
|
|
|
|
для: Ванек2010
(31.01.2010 в 15:46)
| | Кроме этого вы должны уснить, что вы будете получать в случае именования чекбоскосов, или иных элментов формы, таким образом:
<form action="" method="post">
<input type="checkbox" name="as]" value="1">
<input type="checkbox" name="as]" value="2">
<input type="checkbox" name="as]" value="3">
<input type="submit" value="Send">
и
<form action="" method="post">
<input type="checkbox" name="as1" value="1">
<input type="checkbox" name="as2" value="2">
<input type="checkbox" name="as3" value="3">
<input type="submit" value="Send">
</form>
</form>
|
Кроме этого должны уяснить, что невыбранный чекбокс на сервер не передается.
Если чекбоксы в качестве значений имеют id-записей, кторым и нужно установить значение "выбрано", то можно сделать это следующим образом:
<?
//обработать и подготовить входные значения чекбоксов для запроса
$chk = implode(",", array_map('intval', $_POST['check']));
//а затем запрос для обновления этих полей, используя в запросе
.... WHERE `id` IN(" . $chk . ") ....
|
Но еще раз - невыбранные чекбоксы не передаются на сервер, а это значит....? | |
|
|
|
|
|
|
|
для: sim5
(31.01.2010 в 17:05)
| | Спасибо большое, на счет того, что те которые не выбрал не будут отсылаться это знал.
За код спасибо, с этими функциями implode, array_map не встречался.. и поэтому незнал как же внести массив в базу | |
|
|
|
|
|
|
|
для: Ванек2010
(31.01.2010 в 17:21)
| | Эти функции в мануале описаны, так что почетать нет проблем.
То что знаете про невыбранные, это хоршо, но вот что это для вас на сервер будет означать, вы понимаете? | |
|
|
|
|
|
|
|
для: sim5
(31.01.2010 в 17:26)
| | Понимаю, что не чего не будут означать =) Я в обработчике сделал так, что бы поумолчанию сперва везде ставил OFF в таблице, а те которые были выбраны т.е. массив им поставить в таблице ON, все просто) И если массив пустой то не делать UPDATE базы. | |
|
|
|
|
|
|
|
для: Ванек2010
(31.01.2010 в 17:41)
| | Запрос у вас будет изменять состояние выбранных чекбоксов, а что тогда должно произойти, если, например, запись под номером 7 ранее была выбрана, а в следующий раз, пользователь не выберет чекбокс 7? То есть, надо будет сбросить это значение в таблице, но ведь этого запрос вышеуказанный не делает. Кстати, уж лучше тогда использовать вместо on и off - 1 и 0. | |
|
|
|
|
|
|
|
для: sim5
(31.01.2010 в 17:58)
| | Я сделал так, перед выносом chechboxa, создал запрос, если ON стоит то установить флажок(checked), а иначе оставить пустым бокс. | |
|
|
|
|
|
|
|
для: Ванек2010
(31.01.2010 в 19:51)
| | Вы, похоже, вообще не слышите и не понимаете, что Вам говорят.
Перед вставкой значений чекбоксов в базу, все значения поля, которое принимает значения чекбоксов, надо ОБНУЛИТЬ, т.е. перед Вашим запросом выполнить запрос:
UPDATE test SET add=0 и только потом - UPDATE test SET add='ON' WHERE id='$idt'. | |
|
|
|
|
|
|
|
для: Лена
(31.01.2010 в 21:25)
| | несколько неожиданный шаг.
А если между запросами параллельному процессу поплохеет? | |
|
|
|
|
|
|
|
для: Trianon
(31.01.2010 в 21:38)
| | Я объяснила то, что выше сказал sim5(31.01.2010 в 17:58), потому как сама тоже так делаю.
Ну автор же нигде не указывал, что у него есть параллельные процессы.
Если не обнулять, то тогда перемешаются все чекбоксы. | |
|
|
|
|
|
|
|
для: Лена
(31.01.2010 в 21:51)
| | Обнулять конечно же нужно.
Но ведь не все флажки, а только те, которые не пришли в списке входа.
Из всех возможных к расстановке в форме (при постраничной навигации по списку элементов - не самый прозрачный аспект.)
А то, что параллельные процессы есть, в web-программировании как-то само собой :)
Не то что бы в данном случае это было такой уж большой бедой.
Но если есть возможность написать аккуратно - почему не написать? | |
|
|
|
|
|
|
|
для: Trianon
(31.01.2010 в 21:54)
| | Согласна. Честно говоря, обнуляла все подряд, а потом отмечала только те, которые пришли отмеченными.
> (при постраничной навигации по списку элементов - не самый прозрачный аспект.)
Вот это дополнение непонятно. Почему не самый прозрачный? | |
|
|
|
|
|
|
|
для: Лена
(31.01.2010 в 22:03)
| | Типичная ситуация. У Вас сотня товаров в таблице.
И форма правки с постраничкой по 20 товаров. ключи без прорех, допустим.
Находясь на 3-й странице вы увидели помеченными 4-й десяток и без отметок - 5-й .
Сняли отметку 42, 48 товаров, пометили 55, 58й.
Если обнулить в таблице всё кроме 41,43,44,45,46,47,49,50,55,58 товаров,
то исказятся данные не только на этой странице, но и на остальных. | |
|
|
|
|
|
|
|
для: Trianon
(31.01.2010 в 22:12)
| | Я не могу понять, какая разница, на какой я буду странице, если в базу я все равно передаю только отмеченные чекбоксы. База не знает, сколько у меня страниц и как на них расположены элементы с чекбоксами, постраничка - это уже работа другого сервера, база "видит" только массив отмеченных чекбоксов.
Постараюсь завтра найти время и попробовать - сделаю две страницы и на них - элементы с чекбоксами и сама посмотрю. Доверяй, но проверяй :) Тем более, когда не верится. | |
|
|
|
|
|
|
|
для: Лена
(31.01.2010 в 22:24)
| | Еще веселее, когда размер страницы каждый пользователь вправе указывать в настройках профиля индивидуально. | |
|
|
|
|
|
|
|
для: Trianon
(31.01.2010 в 22:33)
| | Обещала посмотреть - посмотрела. И попробовала :)
Взяла для примера список модулей сайта. Напротив каждого названия модуля - чекбокс, который показывает статус модуля. Список расположен на нескольких страницах, я поставила по 5 названий на страницу. Получается, отмечаешь чекбоксы на одной странице - на других страницах все обнуляется. А нам это не нужно.
Значит, нужно обнулять чекбоксы только на той странице, где мы находимся.
Мы запоминаем в массив все id`ы модулей, которые выводятся на данной странице.
Далее получаем массив $_POST['modules'] c отмеченными чекбоксами и исключаем из массива id`ов модулей совпавшие значения $_POST. Все, что осталось - обнуляем. Если ничего не осталось - ничего не обнуляем, для чего делаем соответствующую проверку.
Код - ниже. Писала исходя из экономии времени, поэтому логику и представление не разделяла, а линейку навигатора честно содрала у софттайма, потому как в моей линейке больше кода.
Обработчик: mod.php
<?php
include("configs/dbopen.php");
if(isset($_POST['Mod'])){
$itemsOnPage = 5;
$page = isset($_GET['one_page']) ? (int)$_GET['one_page'] : 1;
$result1 = mysql_query("SELECT COUNT(*) FROM modules");
$posts = mysql_result($result1,0);
$total = intval(($posts - 1)/$itemsOnPage) + 1;
$from = $page * $itemsOnPage - $itemsOnPage;
if($page > $total) $page = $total;
$qu = "SELECT * FROM modules LIMIT " . $from . "," . $itemsOnPage;
$result = mysql_query($qu);
if(!$result) exit("Error in" . $qu . mysql_error());
while ($row = mysql_fetch_assoc($result)){
$ids[] = $row['mod_id']; //все id`ы, которые выводятся на данной странице
}
$str = '';
$arr = array_flip($ids); //переворачиваем массив, нам нужны ключи
foreach($arr as $k=>$v){//сравниваем ключи $_POST['modules'](массив отмеч. чекбоксов) и ключи $ids
if(!array_key_exists($k,$_POST['modules']))
$str .= $k . ",";
}
//проверяем, отмечены ли все чекбоксы
if(preg_match("/[0-9]+/su",$str)){
$q = "UPDATE modules SET visib = 0
WHERE mod_id IN (" . mb_substr($str,0,-1) . ")";
$r = mysql_query($q);
if(!$r) exit("Error in" . $q . mysql_error());
}
foreach ($_POST['modules'] as $item=>$value) {
$sql = "UPDATE modules SET visib = " . $value . " WHERE mod_id =" . $item;
$res = mysql_query($sql);
if(!$res) exit("Error in " . $sql . mysql_error());
}
include('mod_pager.php');
include('page_nav.php');
}else{
include('mod_pager.php');
include('page_nav.php');
}
?>
|
mod_pager.php
<?php
$itemsOnPage = 5;
$page = isset($_GET['one_page']) ? (int)$_GET['one_page'] : 1;
$result1 = mysql_query("SELECT COUNT(*) FROM modules");
$posts = mysql_result($result1,0);
$total = intval(($posts - 1)/$itemsOnPage) + 1;
$from = $page * $itemsOnPage - $itemsOnPage;
if($page > $total) $page = $total;
$q = "SELECT * FROM modules LIMIT " . $from . "," . $itemsOnPage;
$result = mysql_query($q);
if(!$result) exit("Error in $q: ". mysql_error());
echo "<table width=100% border='1px' class = 'admin_table'>
<tr>
<td>Название модуля</td>
<td>Статус</td>
</tr>";
while ($row = mysql_fetch_assoc($result)){
//отмеченные чекбоксы
if($row['visib'] == 1) $check = 'checked';
else $check = '';
//форма должна обрабатываться на разных страницах
if($page>0) $query = "?one_page=" . $page;
else $query = '';
//форма
echo "<form action='mod.php" . $query . "' method='post'>";
echo "<tr>
<td>". $row['mod_name'] . "</td>
<td><input type='checkbox' name='modules[" . $row['mod_id'] . "]' value='1'" . $check . ">
</td>";
echo "</tr>";
}
echo "<tr>
<td colspan=3><input type='submit' value='Подключить/отключить модуль' name = 'Mod'></td>
</tr>
</form></table>";
?>
|
page_nav.php
<?php
if ($page != 1) $pervpage = "<a href='?one_page=1'><<</a>
<a href='?one_page=" . ($page - 1) ."'><</a>";
if ($page != $total) $nextpage = "<a href='?one_page=" . ($page + 1) . "'>></a>
<a href='?one_page=" .$total. "'>>></a>";
if($page - 2 > 0) $page2left = "<a href='?one_page=". ($page - 2) ."'>". ($page - 2) ."</a> | ";
if($page - 1 > 0) $page1left = "<a href='?one_page=" . ($page - 1) ."'>". ($page - 1) ."</a> | ";
if($page + 2 <= $total) $page2right = " | <a href='?one_page=" . ($page + 2) ."'>". ($page + 2) ."</a>";
if($page + 1 <= $total) $page1right = " | <a href='?one_page=" . ($page + 1) ."'>". ($page + 1) ."</a>";
echo $pervpage.$page2left.$page1left.'<b>'.$page.'</b>'.$page1right.$page2right.$nextpage;
?>
|
| |
|
|
|
|
|
|
|
для: Лена
(02.02.2010 в 10:52)
| | Есть функции пересечения массивов. | |
|
|
|
|
|
|
|
для: sim5
(02.02.2010 в 11:01)
| | Функции пересечения массивов, мне кажется, здесь не подошли бы...
Потому как мне надо пересечение ключей, а не значений массивов. | |
|
|
|
|
|
|
|
для: Лена
(02.02.2010 в 11:31)
| | Чем же они не подошли бы? Их меджу прочим не 1 и не 2 ;-) | |
|
|
|
|
|
|
|
для: sim5
(02.02.2010 в 11:40)
| | Увидела. array_diff_key() думаю, подойдет :) Спасибо. | |
|
|
|
|
|
|
|
для: Лена
(02.02.2010 в 11:46)
| | теперь с учетом (31.01.2010 в 22:33)
:)
подсказка.
Потребуется одно поле Hidden | |
|
|
|
|
|
|
|
для: Лена
(31.01.2010 в 21:25)
| | Да это сделал, еще вначале, сперва все обнуляю, и заношу только те которые были выбраны, вроде все норм пашет =) | |
|
|
|
|
|
|
|
для: Ванек2010
(01.02.2010 в 00:19)
| | Ну работает и слава богу. Но возможно, что записи, значения которых определяют чекбоксы, это постоянно упорядоченный набор, и в таком случе, можно работать с битовым набором (одним для всех) определящим состояние чекбоксов, установку/сброс битов которого производить логической операцией XOR. | |
|
|
|