Хорошо, я знаю, что это ответили несколько раз, но я просто не могу заставить себя работать!
У меня есть 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, поэтому я не знаю, какой именно индекс, а затем на какой неделе я должен обновлять
Я добавил некоторые действительно хакерские способы сделать обновление. Вы должны остерегаться 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 } ?> /> <?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" /> Week2 <input type="checkbox" id="Week2" name="row1[]" value="2" /> Week3 <input type="checkbox" id="Week3" name="row1[]" value="3" /> Week4 <input type="checkbox" id="Week4" name="row1[]" value="4" /> Week5 <input type="checkbox" id="Week5" name="row1[]" value="5" /> Week6 <input type="checkbox" id="Week6" name="row1[]" value="6" /> Week7 <input type="checkbox" id="Week7" name="row1[]" value="7" /> Week8 <input type="checkbox" id="Week8" name="row1[]" value="8" /> </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" /> Week2 <input type="checkbox" id="Week2" name="row2[]" value="2" /> Week3 <input type="checkbox" id="Week3" name="row2[]" value="3" /> Week4 <input type="checkbox" id="Week4" name="row2[]" value="4" /> Week5 <input type="checkbox" id="Week5" name="row2[]" value="5" /> Week6 <input type="checkbox" id="Week6" name="row2[]" value="6" /> Week7 <input type="checkbox" id="Week7" name="row2[]" value="7" /> Week8 <input type="checkbox" id="Week8" name="row2[]" value="8" /> </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" /> Week2 <input type="checkbox" id="Week2" name="row3[]" value="2" /> Week3 <input type="checkbox" id="Week3" name="row3[]" value="3" checked="checked" /> Week4 <input type="checkbox" id="Week4" name="row3[]" value="4" /> Week5 <input type="checkbox" id="Week5" name="row3[]" value="5" /> Week6 <input type="checkbox" id="Week6" name="row3[]" value="6" /> Week7 <input type="checkbox" id="Week7" name="row3[]" value="7" /> Week8 <input type="checkbox" id="Week8" name="row3[]" value="8" /> </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" /> Week2 <input type="checkbox" id="Week2" name="row4[]" value="2" /> Week3 <input type="checkbox" id="Week3" name="row4[]" value="3" checked="checked" /> Week4 <input type="checkbox" id="Week4" name="row4[]" value="4" /> Week5 <input type="checkbox" id="Week5" name="row4[]" value="5" checked="checked" /> Week6 <input type="checkbox" id="Week6" name="row4[]" value="6" /> Week7 <input type="checkbox" id="Week7" name="row4[]" value="7" /> Week8 <input type="checkbox" id="Week8" name="row4[]" value="8" /> </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" /> Week2 <input type="checkbox" id="Week2" name="row5[]" value="2" /> Week3 <input type="checkbox" id="Week3" name="row5[]" value="3" checked="checked" /> Week4 <input type="checkbox" id="Week4" name="row5[]" value="4" /> Week5 <input type="checkbox" id="Week5" name="row5[]" value="5" checked="checked" /> Week6 <input type="checkbox" id="Week6" name="row5[]" value="6" /> Week7 <input type="checkbox" id="Week7" name="row5[]" value="7" checked="checked" /> Week8 <input type="checkbox" id="Week8" name="row5[]" value="8" /> </div><br/><br/> <input name="update" type="submit" id="update" value="Update"> </form>
редактировать
Я вернулся к этому ответу, чтобы что-то сказать, и я просто понял, что повторно использовал значения ID
для флажков. Это не было проблемой в этой ситуации, но это всегда плохая практика. Каждый флажок должен иметь уникальный идентификатор на странице. Итак, это должно быть id="row1week1"
, id="row1week2"
… id="row8week1"
… id="row8week8"
.