Обновление базы данных SQL с использованием значений флажка

Хорошо, я знаю, что это ответили несколько раз, но я просто не могу заставить себя работать!

У меня есть 8 недель в моей базе данных (настроено как столбцы), и я показываю их значение с помощью php следующим образом

<form method="post" id="updating" action="<?php $_PHP_SELF ?>"> <?php $count = 1; foreach ($results as $v) { while($count<9){ $week = Week.$count; $checkvalue = $v -> $week; ?> Week<?echo $count;?> <input type="checkbox" id="Week<?php echo$count;?>" name="week[]" value="<?php echo $checkvalue;?>" <?php if($checkvalue==1){?> checked="checked" <?php } ?> /> <?php $count++; } } ?> <input name="update" type="submit" id="update" value="Update"> </form> 

Я знаю, что это, вероятно, не так грациозно, как должно быть, но оно выводит правильный HTML для меня и отображает информацию, как она представлена ​​в базе данных.

 <form method="post" id="updating" action=""> Week1 <input type="checkbox" id="Week1" name="week[]" value="1" checked="checked" /> Week2 <input type="checkbox" id="Week2" name="week[]" value="0" /> Week3 <input type="checkbox" id="Week3" name="week[]" value="1" checked="checked" /> Week4 <input type="checkbox" id="Week4" name="week[]" value="1" checked="checked" /> Week5 <input type="checkbox" id="Week5" name="week[]" value="0" /> Week6 <input type="checkbox" id="Week6" name="week[]" value="1" checked="checked" /> Week7 <input type="checkbox" id="Week7" name="week[]" value="1" checked="checked" /> Week8 <input type="checkbox" id="Week8" name="week[]" value="1" checked="checked" /> <input name="update" type="submit" id="update" value="Update"> </form> 

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

 <?php if(isset($_POST['update'])) { $count = 1; if(isset($_POST['week']) && !empty($_POST['week'])) foreach($_POST['week'] as $w){ echo $w; //prints 1 all the time $week = Week.$count; echo $week;//prints out weeks I want to update correctly (database headings) $query = $db->getQuery(true); // Fields to update. $fields = array( $week.'=' . $db->quote( $w )); // Conditions for which records should be updated. $conditions = array( 'UserID='. (int) $user_id); $query->update($db->quoteName('tools_engage'))->set($fields)->where($conditions); $db->setQuery($query); try { $result = $db->query(); // Use $db->execute() for Joomla 3.0. echo ("Values saved and updated </br>"); $count++; } catch (Exception $e) { // Catch the error. } } }?> 

Я делаю это в Joomla, отсюда и странный синтаксис обновления базы данных, но он работает, и я использовал их в другом месте в этой программе, поэтому я знаю, что это не проблема

Как я прокомментировал в коде, неделя array [] просто, кажется, содержит значение 1 для всего, независимо от того, какие ящики проверяю или снимаю. Это приводит к тому, что каждое значение в базе данных обновляется до 1 / true, что явно неверно.

У меня есть подозрение, что проблема заключается в моем выходе HTML для формы обновления, но, похоже, не может ее взломать, любая помощь очень ценится!

Обновление: Хорошо, поэтому, перейдя на предложение nvuono, я обновил свою форму, чтобы быть таким

 <?php $count = 1; foreach ($results as $v) { while($count<9){ $week = Week.$count; $checkvalue = $v -> $week; ?> Week<?echo $count;?> <input type="checkbox" id="Week<?php echo$count;?>" name="week[<?php echo $count;?>]" value="1" <?php if($checkvalue==1){?> checked="checked" <?php } ?> /> <?php $count++; } } ?> в <?php $count = 1; foreach ($results as $v) { while($count<9){ $week = Week.$count; $checkvalue = $v -> $week; ?> Week<?echo $count;?> <input type="checkbox" id="Week<?php echo$count;?>" name="week[<?php echo $count;?>]" value="1" <?php if($checkvalue==1){?> checked="checked" <?php } ?> /> <?php $count++; } } ?> 

Итак, теперь у каждого имени есть индекс в массиве, не так ли? Если это так,

 if(isset($_POST['update'])) 

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

то есть. Моя логика заключалась бы в том, что он печатает 1,0,0,1,0,0,0 (в блоке 1 и 4 проверен) или что когда-либо проверяется. Но вместо этого он просто распечатывает 1,1, поэтому я не знаю, какой именно индекс, а затем на какой неделе я должен обновлять

Solutions Collecting From Web of "Обновление базы данных SQL с использованием значений флажка"

Я добавил некоторые действительно хакерские способы сделать обновление. Вы должны остерегаться SQL Injection и других плохих вещей при использовании post … убедитесь, что вы всегда проверяете и дезактивируете свои данные. «Хакерный» способ работает, потому что мы работаем с целыми значениями, и они легко очищаются.

Скриншот:

введите описание изображения здесь

Это моя таблица … Я назвал ее так для stackoverflow …

 +----+-------+-------+-------+-------+-------+-------+-------+-------+ | id | week1 | week2 | week3 | week4 | week5 | week6 | week7 | week8 | +----+-------+-------+-------+-------+-------+-------+-------+-------+ | 1 | | | | | | | | | | 2 | 1 | | | | | | | | | 3 | 1 | | 1 | | | | | | | 4 | 1 | | 1 | | 1 | | | | | 5 | 1 | | 1 | | 1 | | 1 | | +----+-------+-------+-------+-------+-------+-------+-------+-------+ 

Это мой PHP-файл … (вставьте его в пустой PHP-документ для запуска, он самодостаточен, кроме изменения соединения и запроса db)

 <?php $mysqli = new mysqli("localhost", "root", "password", "test"); if (!empty($_POST)) { print "<pre>POST VARS: \n".print_r($_POST,true)."</pre>"; foreach($_POST as $i => $data) { if (substr($i,0,3)=='row' && is_numeric(substr($i,3))) { $row_id = substr($i,3); $data = array_flip($data); $values = array(); for ($x=1; $x<9; $x++) { $values[] = "week$x = ". ((isset($data[$x])) ? '1' : '0'); } $stmt = "\nupdate so ". "\n set ".implode(", \n ",$values). "\n where id = $row_id; \n"; $update = $mysqli->query($stmt); if ($update) { print "Row $row_id updated successfully.<br/>"; } } print "<br/>"; } } $result = $mysqli->query("select * from so"); $mysqli->close(); ?> <form method="post" id="updating" action="<?php $_PHP_SELF ?>"> <?php while($row = $result->fetch_object()) { $count = 1; print "<div style='border:1px solid black; display:inline-block;'>\n"; print "Row ".$row->id."<br/>\n"; while($count < 9) { $week = "week$count"; $checkvalue = $row->{$week}; ?> Week<?php echo $count ?> <input type="checkbox" id="Week<?php echo$count;?>" name="row<?php echo $row->id ?>[]" value="<?php echo $count;?>" <?php if($checkvalue==1){ ?> checked="checked" <?php } ?> />&nbsp;&nbsp;&nbsp; <?php $count++; } print "</div><br/><br/>\n\n\n"; } ?> <input name="update" type="submit" id="update" value="Update"> </form> 

Это $_POST после отправки:

 POST VARS: Array ( [row2] => Array ( [0] => 1 ) [row3] => Array ( [0] => 1 [1] => 3 ) [row4] => Array ( [0] => 1 [1] => 3 [2] => 5 ) [row5] => Array ( [0] => 1 [1] => 3 [2] => 5 [3] => 7 ) [update] => Update ) 

Мой «источник просмотра» формы:

 <form method="post" id="updating" action=""> <div style='border:1px solid black; display:inline-block;'> Row 1<br/> Week1 <input type="checkbox" id="Week1" name="row1[]" value="1" />&nbsp;&nbsp;&nbsp; Week2 <input type="checkbox" id="Week2" name="row1[]" value="2" />&nbsp;&nbsp;&nbsp; Week3 <input type="checkbox" id="Week3" name="row1[]" value="3" />&nbsp;&nbsp;&nbsp; Week4 <input type="checkbox" id="Week4" name="row1[]" value="4" />&nbsp;&nbsp;&nbsp; Week5 <input type="checkbox" id="Week5" name="row1[]" value="5" />&nbsp;&nbsp;&nbsp; Week6 <input type="checkbox" id="Week6" name="row1[]" value="6" />&nbsp;&nbsp;&nbsp; Week7 <input type="checkbox" id="Week7" name="row1[]" value="7" />&nbsp;&nbsp;&nbsp; Week8 <input type="checkbox" id="Week8" name="row1[]" value="8" />&nbsp;&nbsp;&nbsp; </div><br/><br/> <div style='border:1px solid black; display:inline-block;'> Row 2<br/> Week1 <input type="checkbox" id="Week1" name="row2[]" value="1" checked="checked" />&nbsp;&nbsp;&nbsp; Week2 <input type="checkbox" id="Week2" name="row2[]" value="2" />&nbsp;&nbsp;&nbsp; Week3 <input type="checkbox" id="Week3" name="row2[]" value="3" />&nbsp;&nbsp;&nbsp; Week4 <input type="checkbox" id="Week4" name="row2[]" value="4" />&nbsp;&nbsp;&nbsp; Week5 <input type="checkbox" id="Week5" name="row2[]" value="5" />&nbsp;&nbsp;&nbsp; Week6 <input type="checkbox" id="Week6" name="row2[]" value="6" />&nbsp;&nbsp;&nbsp; Week7 <input type="checkbox" id="Week7" name="row2[]" value="7" />&nbsp;&nbsp;&nbsp; Week8 <input type="checkbox" id="Week8" name="row2[]" value="8" />&nbsp;&nbsp;&nbsp; </div><br/><br/> <div style='border:1px solid black; display:inline-block;'> Row 3<br/> Week1 <input type="checkbox" id="Week1" name="row3[]" value="1" checked="checked" />&nbsp;&nbsp;&nbsp; Week2 <input type="checkbox" id="Week2" name="row3[]" value="2" />&nbsp;&nbsp;&nbsp; Week3 <input type="checkbox" id="Week3" name="row3[]" value="3" checked="checked" />&nbsp;&nbsp;&nbsp; Week4 <input type="checkbox" id="Week4" name="row3[]" value="4" />&nbsp;&nbsp;&nbsp; Week5 <input type="checkbox" id="Week5" name="row3[]" value="5" />&nbsp;&nbsp;&nbsp; Week6 <input type="checkbox" id="Week6" name="row3[]" value="6" />&nbsp;&nbsp;&nbsp; Week7 <input type="checkbox" id="Week7" name="row3[]" value="7" />&nbsp;&nbsp;&nbsp; Week8 <input type="checkbox" id="Week8" name="row3[]" value="8" />&nbsp;&nbsp;&nbsp; </div><br/><br/> <div style='border:1px solid black; display:inline-block;'> Row 4<br/> Week1 <input type="checkbox" id="Week1" name="row4[]" value="1" checked="checked" />&nbsp;&nbsp;&nbsp; Week2 <input type="checkbox" id="Week2" name="row4[]" value="2" />&nbsp;&nbsp;&nbsp; Week3 <input type="checkbox" id="Week3" name="row4[]" value="3" checked="checked" />&nbsp;&nbsp;&nbsp; Week4 <input type="checkbox" id="Week4" name="row4[]" value="4" />&nbsp;&nbsp;&nbsp; Week5 <input type="checkbox" id="Week5" name="row4[]" value="5" checked="checked" />&nbsp;&nbsp;&nbsp; Week6 <input type="checkbox" id="Week6" name="row4[]" value="6" />&nbsp;&nbsp;&nbsp; Week7 <input type="checkbox" id="Week7" name="row4[]" value="7" />&nbsp;&nbsp;&nbsp; Week8 <input type="checkbox" id="Week8" name="row4[]" value="8" />&nbsp;&nbsp;&nbsp; </div><br/><br/> <div style='border:1px solid black; display:inline-block;'> Row 5<br/> Week1 <input type="checkbox" id="Week1" name="row5[]" value="1" checked="checked" />&nbsp;&nbsp;&nbsp; Week2 <input type="checkbox" id="Week2" name="row5[]" value="2" />&nbsp;&nbsp;&nbsp; Week3 <input type="checkbox" id="Week3" name="row5[]" value="3" checked="checked" />&nbsp;&nbsp;&nbsp; Week4 <input type="checkbox" id="Week4" name="row5[]" value="4" />&nbsp;&nbsp;&nbsp; Week5 <input type="checkbox" id="Week5" name="row5[]" value="5" checked="checked" />&nbsp;&nbsp;&nbsp; Week6 <input type="checkbox" id="Week6" name="row5[]" value="6" />&nbsp;&nbsp;&nbsp; Week7 <input type="checkbox" id="Week7" name="row5[]" value="7" checked="checked" />&nbsp;&nbsp;&nbsp; Week8 <input type="checkbox" id="Week8" name="row5[]" value="8" />&nbsp;&nbsp;&nbsp; </div><br/><br/> <input name="update" type="submit" id="update" value="Update"> </form> 

редактировать
Я вернулся к этому ответу, чтобы что-то сказать, и я просто понял, что повторно использовал значения ID для флажков. Это не было проблемой в этой ситуации, но это всегда плохая практика. Каждый флажок должен иметь уникальный идентификатор на странице. Итак, это должно быть id="row1week1" , id="row1week2"id="row8week1"id="row8week8" .