仍然掌握PHP,并希望获得有关制作此代码循环的最佳方法的一些指导。我有生成html代码的php代码,它使用WHILE命令为我的MySQLi数据库中的每个条目创建一个复选框。我需要用这段代码做类似的事情。
mysqli_select_db($conn,'database_1')or die("Connection Failed");
$check_0 = $_POST['checkbox0'];
$query_0 = "UPDATE test2 SET state = '$check_0' WHERE id = '0'";
mysqli_query($conn, $query_0);
$check_1 = $_POST['checkbox1'];
$query_1 = "UPDATE test2 SET state = '$check_1' WHERE id = '1'";
mysqli_query($conn, $query_1);
$check_2 = $_POST['checkbox2'];
$query_2 = "UPDATE test2 SET state = '$check_2' WHERE id = '2'";
mysqli_query($conn, $query_2);
mysqli_close($conn);
从代码中可以看出,我只需要更新数字,以便下一行代码应该有;
$ check_3,'checkbox3',$ query_3,& id ='3'
如果我可以做类似的事情;
$ check_x其中id = x是理想的,然后循环,而id有一个值。谢谢你的帮助。
编辑1
这是PHP的复选框。代码做了3件事;创建一个复选框,向上面的代码发送复选框检查状态,并将MySQLi数据库的状态应用于复选框。
echo(string) "<form action='includes/checkbox.inc.php' method='post'>";
while($row_3 = mysqli_fetch_array($result_4, MYSQLI_ASSOC)) {
echo "<input type='hidden' name='checkbox";
echo $row_3['id'];
echo "' value='0'><input type='checkbox' name='checkbox";
echo $row_3['id'];
echo "' value='1'";
/*Below section for check status*/
if ($result_4 = $sql_3) {
mysqli_data_seek($result_4, $row_3['id']);
$row_4 = mysqli_fetch_row($result_4);
}
if ($row_4 [0]=="1") {
echo "checked";
} else {
echo " ";
}
/*Above section for check status*/
echo "> Item ";
echo $row_3['id'];
echo "<br>";
}
echo "<input type='submit' name='Submit' value='Submit'>";
echo "</form>";
?>
答案 0 :(得分:1)
以下是如何,首先您需要更改创建复选框的方式:
<input type="checkbox" name="checkbox[1]" />
所以在你的诡计循环中(我只是猜测你没有发布这个),
while({something}){
echo '<input type="checkbox" name="checkbox['.$id.']" />'
}
然后使用正确的结构,它可以使一切变得更加容易:
mysqli_select_db($conn,'database_1')or die("Connection Failed");
$stmt = mysqli_prepare("UPDATE test2 SET state = ? WHERE id = ?");
foreach($_POST["checkbox"] as $key => $value){
$stmt->bind_param("ss", $value, $key);
$stmt->execute();
}
mysqli_close($conn);
将{id}置于[]
内的复选框名称非常重要,否则您将无法将其与ID相关联。
稍后你会发现,如果没有选中复选框,它就不会提交,所以它甚至不会存在于后端。您可以通过在&#34; off&#34;之前放置一个隐藏字段来解决此问题。值&#34;
<input type="hidden" name="checkbox[1]" value="off" />
<input type="checkbox" name="checkbox[1]" value="on" />
这样,如果未选中复选框,则会提交隐藏字段,如果已选中,则会覆盖隐藏字段的值。
您在查询中直接使用$check
也遇到了SQLInjection问题,您应该做一个准备好的语句。我没有使用mysqli(就像过去4年一样)而且我现在只使用PDO,所以希望我能做到这一点。但我甚至不会试图解决安全问题。
作为旁注,在循环外准备查询并在其中执行时,您可以获得更好的性能。
如果不是,我还强烈建议启用错误报告:
<?php
error_reporting(-1);
ini_set('display_errors', 1);
<强>更新强>
您应该可以将括号放在[]
while($row_3 = mysqli_fetch_array($result_4, MYSQLI_ASSOC)) {
/*Below section for check status*/
if ($result_4 = $sql_3) {
mysqli_data_seek($result_4, $row_3['id']);
$row_4 = mysqli_fetch_row($result_4);
}
$checked = $row_4[0] == 1 ? "checked='checked' " : '';
/*Above section for check status*/
echo "<input type='hidden' name='checkbox[{$row_3['id']}]' value='0'>":
echo "<input type='checkbox' name='checkbox[{$row_3['id']}' value='1' {$checked}>";
echo "Item ";
...
无论如何,我重组了你的代码。我不能像你那样让自己变得非常难以阅读。可读性总是#1,然后是#2安全性,然后是#3功能,#4性能。如果您无法浏览代码并告诉它正在做什么,那么没有其他问题。
"words {$var}"
只是在不使用引号的情况下执行"words ".$var."..."
的另一种方式,它只适用于双引号思想。实际上双引号字符串你可以做"words $var"
但是又有可读性。
至于[]
类型系统的逻辑如何工作,如果你的意思是它如何工作(而不是如何工作),简短的答案是,这只是它的工作方式。你只需要name="checkbox[]"
,但是你必须使用id
作为值并限制你可以做的事情。更不用说$id
似乎更适合作为关键。
希望有所帮助。
答案 1 :(得分:0)
您可以使用while循环或for循环来执行此操作。我更喜欢for循环:
$i = 0;
for($i < 10){
$var = 'checkbox'.$i;
$db = 'test'.$i;
$check = $_POST[$var];
$query = "UPDATE $db SET state = '$var' WHERE id = $i";
mysqli_query($conn, $query);
$i++;
}