Перейти к содержимому

Сервис обмена электронных валют


Checkbox и PHP

#1 Banderas

Banderas
  • Пользователь
  • 1 168 сообщений
  • Репутация: 1
0

Отправлено 12 Февраль 2011 - 01:33

Здрасте! Захотел реализовать удаление выбранных статей. Конечно же надо использовать checkbox, но я не знаю как правильно его задать...
Форма вроде правильно написана
		$articles = mysql_query("SELECT id, title FROM articles", $db);
$myrow = mysql_fetch_array($articles);
echo "<form action='hendler_mdf_articles.php' method='post'>";
do {
printf ("<input type='checkbox' name='checkbox' value='%s' /> %s </br>", $myrow['id'], $myrow['title']);
}
while ($myrow = mysql_fetch_array($articles));
echo "</br><input type='submit' value='Удалить выбранные статьи' /></form>";

Обработчик даже не знаю как написать. Алгоритм такой:
1) принимаю массив checkbox (он должен быть массивом) в котором value = id статьи
2) сравниваю value с id из базы
3) если идентичны - удаляю

Думаю, что такой способ не рационален. Но для начала задам вопрос "почему у меня checkbox не массив"?

 

 

  • 0


#2 surfer

surfer
  • Заблокированные
  • 1 956 сообщений
  • Репутация: 71

Отправлено 12 Февраль 2011 - 01:37

потому что читать книжки надо и изучить материал про массивы
name='checkbox[]'
  • 0

#3 Banderas

Banderas
    Topic Starter
  • Пользователь
  • 1 168 сообщений
  • Репутация: 1

Отправлено 12 Февраль 2011 - 01:54

Спасибо, я перечитал несколько статей по чекбоксу, но нигде не написано зачем [], хотя я скобки видел, думал что у меня неотобразился символ)))
значит сейчас форма

 $articles = mysql_query("SELECT id, title FROM articles", $db);
$myrow = mysql_fetch_array($articles);
echo "<form action='hendler_mdf_articles.php' method='post'>";
do {
printf ("<input type='checkbox' name='checkbox[]' value='%s' /> %s </br>", $myrow['id'], $myrow['title']);
}
while ($myrow = mysql_fetch_array($articles));
echo "</br><input type='submit' value='Удалить выбранные статьи' /></form>";

обработчик
 <?php
$articles = mysql_query("SELECT id, title FROM articles", $db);
$myrow = mysql_fetch_array($articles);
isset($_POST['checkbox']) ? $id=$_POST['checkbox'] : '';
foreach ($id as $value) {
$value = intval($value);
do {
if ($value=$myrow['id']) {
mysql_query("DELETE FROM articles WHERE id='$value'", $db);
echo "</br>Запись удалена!";
}
}
while ($myrow = mysql_fetch_array($articles));
}
?>

Но почему удаляет все статьи, а не выбранные?


  • 0


#4 surfer

surfer
  • Заблокированные
  • 1 956 сообщений
  • Репутация: 71

Отправлено 12 Февраль 2011 - 02:02

патаму что я тебе сказал что читать?
сделай print_r($_POST['checkbox'])
и print_r($id)
что там?
  • 0

#5 Banderas

Banderas
    Topic Starter
  • Пользователь
  • 1 168 сообщений
  • Репутация: 1

Отправлено 12 Февраль 2011 - 02:06

Идентичны!

Array ( [0] => 18 [1] => 15 )
---------------
Array ( [0] => 18 [1] => 15 )

Код
 isset($_POST['checkbox']) ? $id=$_POST['checkbox'] : '';
print_r ($_POST['checkbox']);
echo '</br>---------------</br>';
print_r ($id);

  • 0


#6 surfer

surfer
  • Заблокированные
  • 1 956 сообщений
  • Репутация: 71

Отправлено 12 Февраль 2011 - 02:33

что так не догадался?
а отлаживать так и научился?
зачем тебе вложенные циклы?
		foreach ($id as $value) {
$value = intval($value);
mysql_query("DELETE FROM articles WHERE id='$value'", $db);
echo "</br>Запись удалена!";
}

  • 0

#7 Banderas

Banderas
    Topic Starter
  • Пользователь
  • 1 168 сообщений
  • Репутация: 1

Отправлено 12 Февраль 2011 - 10:01

Я уже понял о чем ты...
Сделал вложенный цикл, потому что массив $id может быть $id=[3][5][8], а массив $myrow[id]=[3][5][6][8][12][17];
Работаем по циклу....
3 -> 3 - удалили
5 -> 5 - удалили
8 -> 6 - не удалили
Массив $id закончился, выходим из цикла. Если сделать вложенный цикл, то каждый элемент массива $id будет сравниваться с каждым элементом массива $myrow['id']

пс. усе, понял о чем ты, все правильно. Мы вывели id из базы, потом передали их обработчику, который удаляет id, что нам передал чекбокс. Проверка не требуется, id для удаления переданы четко и ясно. Нужно просто их подставить в функцию mysql_query
  • 0


#8 surfer

surfer
  • Заблокированные
  • 1 956 сообщений
  • Репутация: 71

Отправлено 12 Февраль 2011 - 10:16

ну и ладушки, рад что ты понял, после формы тв получил готовый, просто надо удалить записи с id равными значениям элементов массива ;)
  • 0

#9 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 13 Февраль 2011 - 12:59

Banderas, Жесть ну и кодик ;)
Во-первых, какие вложенные массива типа $id=[3][5][8], покажу на примере:
1) Массив с данными (тот что получается у нас при передаче формы)
Array (
   0 => 3,
   1 => 5,
   2 => 8,
   .....
   N => [id]
);
2) Вложенные массивы, это массив в массиве, например
Array (
   0 => Array (...),
   1 => 5,
   2 => Array (...),
   .....
   N => [id]
);

Во-вторых, с форматом checkbox[] можно провести ассоциацию с PHP-кодом:
$checkbox = array(); // определяем массив
$checkbox[] = 3; // добавляем значение 3 в конец массива $checkbox
$checkbox[] = 5; // добавляем значение 5 в конец массива $checkbox
$checkbox[] = 8; // добавляем значение 8 в конец массива $checkbox

На выходе получим массив представленный в первом примере выше.

В-третьих, зачем такие сложности с перебором присланных ID. Вообщем если мы организуем управление скриптом, явно в эту часть скрипта будет допущен пользователь, который не собирается ломать скрипт, поэтому входящие данные можно не проверять, ну конечно на всякий случай можно и обезопаситься и просто прогнать присланные $checkbox через intval();
Мы удаляем данные, а не перебираем все существующие это не нужно. Нам нужно просто взять и удалить из базы те данные, id которых нам передали. Не нужно даже заботиться о проверке наличия этих данных в таблице, если их нет, ничего страшного не произойдет.
<?php
$ids = $_POST['checkbox'];

// перебираем присланные id и делаем их безопасными
foreach($ids as $index => $id)
$ids[$index] = intval($id);

$ids = implode(",", $ids); // объединяем все id в массиве в строку формата "3,5,8,...,N"
$mysql_query("DELETE FROM table WHERE id IN ({$ids})"); // удаляем записи из таблицы table, id которых перечислены в скобках
?>

  • 0

#10 Tixiy

Tixiy
  • Пользователь
  • 5 сообщений
  • Репутация: 0

Отправлено 02 Май 2011 - 15:30

Всем здрасьте. Подскажите, пожалуйста, как сделать такую вещь: Имеется три файла с содержинием песен для каждого диска соответственно. Очень хочется сделать на сайте, чтобы люди выбрав один диск, видели содержимое его, если снимут галочку, то содержимое становится невидимым, чтобы не мешаться. И так на одной страничке совместить три диска, чтоб страничка динамически изменялась в соответствии с выбором пользователя. Возможно это ерундовая задача, но я еще полный ноль в этом деле, только учусь. Помогите, плиз.
  • 0

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Оформление форума – IPBSkins.ru