Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Массовая обработка checkbox. КАК УЗНАТЬ id СТРОКИ
 
 автор: virtus1k   (10.10.2008 в 18:57)   письмо автору
14.8 Кб
 
 

Одни мучения :(
Не могу найти способ сделать следующее (СМОТРИТЕ ВЛОЖЕНЫЙ ФАЙЛ /вложеный файл/)
Необходимо изменить в mysql строки, которые будут отмечены чекбоксами (СТОЛБИК - ТОП), т.е. выделил какие нужно строки и в mysql базе значение поменялось с "0" на "1" или наоборот. Так вот вопрос в том, что не могу я понять - как мне узнать ID именно той строки в которой у меня происходят изменения :( К примеру массовое удаления - я легко делаю, а вот что бы UPDATE сделать - мне нужно знать какие строки затрагиваются и какие к ним ID.
Думаю, кто-то уже решал подобное. Подскажие куда копать или пример кода.
БОЛЬШОЕ СПАСИБО. Очень на Вас надеюсь

  Ответить  
 
 автор: sim5   (10.10.2008 в 19:00)   письмо автору
 
   для: virtus1k   (10.10.2008 в 18:57)
 

Укажите значения чекбоксам равные id записям в таблице.

  Ответить  
 
 автор: White_Owl   (10.10.2008 в 19:11)   письмо автору
 
   для: virtus1k   (10.10.2008 в 18:57)
 

Ну смотри. У тебя же в базе есть строки твои. К примеру запрос
В таблице lines есть два поля id и name

SELECT * FROM lines 


Тебе вернётся массив где и будут твои id и имена линий
Потомо в цикле формируешь свою таблицу


<?php
foreach ($lines as $id=>$line_name):
?>
<checkbox name='line_id[<?=$id?>]' value='1' /> <?=$line_name?>
<?php
endforeach;
?>

Имя чекбокса должно быть именно таким чтобы потом при отправке формы у тебя получился массив из обтмеченных чекбоксов. А потом просто в цикле перебираешь этот массив подставляя в условие WHERE в SQL запросе нужный тебе id.

примерно так


UPDATE lines SET active = '1' WHERE lines.id = <?php $line[id]?>

  Ответить  
 
 автор: sim5   (10.10.2008 в 19:16)   письмо автору
 
   для: White_Owl   (10.10.2008 в 19:11)
 

>Имя чекбокса должно быть именно таким

Не обязательно, это может быть просто массив, а его значения равны id записей. Неотмеченные чекбоксы не приходят на сервер.

  Ответить  
 
 автор: virtus1k   (10.10.2008 в 19:20)   письмо автору
 
   для: virtus1k   (10.10.2008 в 18:57)
 

Большое спасибо, НО :)

sim5 если я укажу значение чекбоксам равным id - как я потом разберу там "0" или "1" стоял и стоит :) ??

White_Owl
Ага, а если у меня изначально стоял чекбокс - а я захотел убрать его у половины, а у другой половины оставить???

  Ответить  
 
 автор: sim5   (10.10.2008 в 19:27)   письмо автору
 
   для: virtus1k   (10.10.2008 в 19:20)
 

Как это вы укажите чекбоксам равные ID? У вас что в таблице есть записи с одинаковыми ID?

  Ответить  
 
 автор: virtus1k   (10.10.2008 в 19:36)   письмо автору
 
   для: sim5   (10.10.2008 в 19:27)
 

Нет :) неверное выразился... ID понятное дело будут уникальными... Вот написал пример кода который выгружается:

<form>
id 1 - <input type=checkbox name=top[] checked value=1>
id 2 - <input type=checkbox name=top[] value=0>
id 3 - <input type=checkbox name=top[] value=0>
id 4 - <input type=checkbox name=top[] checked value=1>
id 5 - <input type=checkbox name=top[] checked value=1>
</form>

как видим если 1 - то включен - если 0, то выключен - из этого я получаю массив $_POST[top]
но как мне узнать, что пользователь отметил id 2 (т.е. 0 должен превратится в 1) и снял галки с 4 и 5 (т.е. 1 в 0)
Как мне узнать :) ID для обновления - ну хоть убей не понимаю :(

  Ответить  
 
 автор: sim5   (10.10.2008 в 19:43)   письмо автору
 
   для: virtus1k   (10.10.2008 в 19:36)
 

<?
print "<pre>";
print_r($_POST);
print 
"</pre>";
?>
<form action="" method="post"> 
id 1 - <input type=checkbox name=top[] checked value=15> 
id 2 - <input type=checkbox name=top[] value=167> 
id 3 - <input type=checkbox name=top[] value=234> 
id 4 - <input type=checkbox name=top[] checked value=11> 
id 5 - <input type=checkbox name=top[] checked value=123>
<input type="submit" value="Send"> 
</form>

Где значениям чекбоксов даны не 1 и 0 (включено/выключено), а ID записей. Выполните этот пример, что вы получите? Вы получите только выбранные чекбоксы, а значит вы будете знать ID выбранных записей для обновления или чего-то иного.

  Ответить  
 
 автор: virtus1k   (10.10.2008 в 21:22)   письмо автору
 
   для: sim5   (10.10.2008 в 19:43)
 

Привильно - но тут же Вы говорите о ВЫБРАНЫХ - таким образом я получу выбраные ID согласен. Но как мне получить ID тех у которых checked был снят ??? т.е. было 1, а стало 0
т.к. у меня будут и 1 и 0 в перемешку

  Ответить  
 
 автор: sim5   (10.10.2008 в 22:02)   письмо автору
 
   для: virtus1k   (10.10.2008 в 21:22)
 

Установить сначала всем записям 0, а потом уже выбранным 1. Если все таки охота знать о выборе/невыборе всех чекбоксов, то это можно сделать, только передав на сервер маску их состояний. Но это уже надо задействовать JS, так как невыбранные чекбоксы на сервер не передаются. Если без JS, то тогда каждой записи дожны соотвествовать две зависимых радиокнопки, одна со значением 0, другая 1.

  Ответить  
 
 автор: virtus1k   (10.10.2008 в 22:08)   письмо автору
 
   для: sim5   (10.10.2008 в 22:02)
 

Спасибо! За ночь все обдумаю :)

  Ответить  
 
 автор: virtus1k   (11.10.2008 в 12:44)   письмо автору
 
   для: sim5   (10.10.2008 в 22:02)
 

вообщем сделал я так, что name=top[] value=row[id]
и таким способом я получаю все отмеченые ID и при обновлении ставлю 1 в нужное мне поле.
Но теперь - когда мне нужно снять галки - (они ж не идут на сервер) - вообщем не могу получить те поля - которые мне нужно отметить, что б 0 поставить.
Каким образом мне это сделать?

  Ответить  
 
 автор: sim5   (11.10.2008 в 12:52)   письмо автору
 
   для: virtus1k   (11.10.2008 в 12:44)
 

Да, галочки не туда и обратно не идут, их браузер "рисует" :)
У вас есть таблица, в которой есть поле, например, `sel`, которое и может иметь значение 0 или 1. При получении выбранных чекбоксов, прежде чем обновить значения этих полученных id записей, обнулите (установите в 0) значения поля `sel` у всех записей. А затем UPDATE ... SET sel = 1, для полученных их формы id записей (выбранных чекбоксов).
Или вы о другом?

  Ответить  
 
 автор: virtus1k   (11.10.2008 в 13:14)   письмо автору
 
   для: sim5   (11.10.2008 в 12:52)
 

у всей таблицы не могу обнулить это поле, к сожалению т.к. в таблице может быть много записей - а на экран я выведу только 10 к примеру :) - вот разме, что обнулить эти 10, а потом писать в них :) НО это не дело - такой способ не подходит :(
я передаю на js значение невыбраных полей у меня получается id_0=1; id_1=1; id_2=0; id_3=1; id_5=0; только как мне теперь сопоставить и записать их в базу?

  Ответить  
 
 автор: sim5   (11.10.2008 в 13:19)   письмо автору
 
   для: virtus1k   (11.10.2008 в 13:14)
 

Ну если вы передаете записи для изменения по 10 штук, и не случайным выбором, а сортированные, то есть начиная с 1 и по nn, то вы всегда будете знать id последней записи из этой десятки $max = max($_POST['name']) и первой $min = min($_POST['name']). Теперь вы можете обнулить поля для записей у которых id <= $max и id >= $min . Какие проблемы?

Зачем вам передавать значение 0 или 1 для этих полей? Вы, выдавая, список полей пользователю, получаете значение из базы - у полей, которые имеют 1, указывайте checked="checked", вот и получит пользователь "визуальную картину" состояния в базе этих полей. Ну а далее, как я вам рассказывал выше. Забудьте вы об этих 0 и 1 для value, пишите в них id полей записи в таблице.

  Ответить  
 
 автор: virtus1k   (11.10.2008 в 14:05)   письмо автору
 
   для: sim5   (11.10.2008 в 13:19)
 

ну как зачем :)
смотрите. Я вывожу пользователю товары с нужной категории... У всех изначально стоят галки (checked) Пользователю нужно, что бы к примеру 6 из 100 снять галки - т.е. мне нужно сделать UPDATE у 6 товаров у которых сняты галки.
Обнулять все товары не хочется из этой категории - а потом ставить тем галки которые передаются...
Есть другой способ?

  Ответить  
 
 автор: Trianon   (11.10.2008 в 14:13)   письмо автору
 
   для: virtus1k   (11.10.2008 в 14:05)
 

Если Вы изначально ставили галки на сотню товаров, а от пользователя получили только 94 галки, то вычтя из исходного множества(100) полученное(94), Вы и получите набор из тех шести галок, товары по которым нужно изменить.

  Ответить  
 
 автор: sim5   (11.10.2008 в 14:17)   письмо автору
 
   для: virtus1k   (11.10.2008 в 14:05)
 

Первое. Я не верно вам сказал выше - с помошью min/max вы не узнаете, так как они могут быть не выбраны. Но если вы выводите постранично, то вы знаете смещение, так что трудностей быть не должно с определением записей для обнуления.

Второе. А не лучше ли отдавать пользователю товары как не выбранные? Это с чего вы решили, что я "на радостях" заберу у вас все предложенные 100? А если пользователь по ошибке нажмет SUBMIT так и не успев снять "галочки" с ненужного? Это вобще странный подход, равноценный тому, который мне когда-то заказчик навязывал - галочка "Подписаться на рассылку" должна быть по умолчанию отмечена. Как бы не так, почтовый ящик пользователя, это его собственность, а не собственность владельца сайта. Так и вам бы стоило исходить из того, что кошелек пользователя принадлежит ему, а не вам, и он вправе решать что выбрать, что нет, и по умолчанию "все товары выбраны", это с вашей стороны, ну если не "хамство", то просто не уважение к покупателю.

Третье. Если это не выбор товара пользователем для покупки, то что значит обнулить/выбрать? Вы администратор магазина, вы можете снять/добавить товар в категории, но делается это полем никак недоступным для пользователя.

Объясните сперва саму суть операций, для чего они служат? Видимо надо с этого начать .

  Ответить  
 
 автор: virtus1k   (11.10.2008 в 15:23)   письмо автору
93.3 Кб
 
   для: sim5   (11.10.2008 в 14:17)
 

Так. Сорри, запутал Вас совсем :)
Взгляните http://softtime.ru/forum/files/58761-20081010185759.gif ЭТО АДМИНКА - только админ может там что-то делать.
Значит задача.... дать админу право массово оперировать с товарами. Массовое удаление - я сделал, труда не соствавило. Теперь мне нужно сделать массовое скрытие/отобажение, вывод в TOP/ ввод в TOP ну и вывод и ввод NEW
Так вот. Как показано на скриншоте - пользователь отмечает нужные ему товары галками - кликает выполнить и они все становятся TOP.
ВТОРОЙ СКРИНШОТ (ВО ВЛОЖЕНИИ этого поста http://softtime.ru/forum/files/58761-20081011152318.jpg) показывает, что потом, пользователь захочет (через какое-то время) вывести с TOP нужные ему товары. Он должен снять галки там где он захочет - и значение в базе должно поменятся!
Поставить - поставил - снять не знаю как :)
Надеюсь все понятно пояснил!

  Ответить  
 
 автор: sim5   (11.10.2008 в 15:59)   письмо автору
 
   для: virtus1k   (11.10.2008 в 15:23)
 

Вопрос - вы выводите список товаров постранично? Если да, то как?

  Ответить  
 
 автор: virtus1k   (11.10.2008 в 16:06)   письмо автору
 
   для: sim5   (11.10.2008 в 15:59)
 

Нет. Не постранично. Товары выводятся фильтрами т.е. вывести товары категории X где есть фото или вывести товары категории Х где нет фото и т.д.

  Ответить  
 
 автор: sim5   (11.10.2008 в 16:32)   письмо автору
 
   для: virtus1k   (11.10.2008 в 16:06)
 

Если говорить серьезно, то я не вижу никаких проблем и в этом случае. Но коли вы не понимаете как сделать через id хранящиеся в значении, то я уже и не знаю как вам объяснить. Давайте с админ части. Вы можете получить весь список товаров категории, либо постранично (что никак не накладывает ограничений на групповое обновление). Вот в этом списке вы можете только знать, что какой-то товар имеет изображение или нет, но ни вкоем случае не можете в этом списке его изменить/удалить. Но в этом списке вы можете отметить товар как ТОР или дпугое, что собственно не важно. В этом же списке можно и другие подобные операции групповые производить, и делать это проще так, как я вам уже неоднократно говорил. А вот насчет изменений изборажений товаров, и прочих подробностей, так это нужно делать по переходу на другую страницу или в окне, и только для одного товара. То же самое, если вам нужен список товаров с изображениями или без них, то только для того, чтобы производить манипуляции с этими изображениями, а не заниматься ТОРами товаров. Другими словами, нужно разграничивать задачи на групповые и частные, тогда у вас и проблем не будет в админ части.
Что касается пользователя. Если вы ему выводите постранично, то вы строите навигатор страничный, в котором указываете смещение запроса, и знаете, что вывод товаров категории на страницу осуществляется по 10 товаров. Зная смещение (а это id записи в таблице), вы будете знать с какой записи начать сброс параметра, а добавив к смещению 10, узнаете по какую запись производить сброс.
Вы понимаете или нет, что невыбранный чекбокс не придет к вам на сервер? А это означает, что если пользователеь видит неотмеченный чекбокс и не выберет его, то он как был нулем так и останется им - что вас тут может беспокоить при сбросе значения? Вам важно знать только то, что отметил пользователь, а то что он разотметил, вам не придет, не будет такой id записи в массиве вовзвращаемом формой! Очистили значения перед обновлением - значит уже сбросили те чекбоксы, которые разотметил пользователь, останеться только установить в 1 те, что вы получили массивом от пользователя. Ну неужели не понятно?
Если вы плохо разбираетесь в многомерных массивах, то укажите в форме несколько имен чекбоксов (как массивы) для каждой групповой операции (ТОР и т.п.) с соответствующими id записей в атрибутах value. Обрабатывайте каждый массив в отдельности и делайте необходимые изменения в таблице.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования