重复这个PHP代码的最佳方法

时间:2018-03-12 21:13:52

标签: php

仍然掌握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>";
    ?>

2 个答案:

答案 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++;
}