【问题标题】:Loop and Undefined index php循环和未定义的索引php
【发布时间】:2012-04-06 00:30:27
【问题描述】:

这是我第一次使用 PHP,我从 w3school 学习一切。 我的问题:

1 循环

我有一个座位预订数据库,例如:A1 A2 A3 A4 A5

我尝试做一些循环来减少相同代码的重复,但失败了。

2 未定义的复选框索引。

我做了一些复选框,但出现错误:如果我提交表单时未选中某些复选框,则未定义索引。我用谷歌搜索,但我不知道如何用他们的解决方案更改我的编码,因为我不了解他们的解决方案。

下面是我的代码。

    <html>

<?php

    $connect = mysql_connect("localhost","root","") or die ("Coulnt connect!");
    mysql_select_db("book") or die ("Couldnt find db");

    $A1 = 'enable';
    $A2 = 'enable';
    $A3 = 'enable';
    $A4 = 'enable';
    $A5 = 'enable';

    $query = mysql_query("SELECT * FROM seats WHERE Seat_Number = 1 AND Alphabet = 'A'");
    $row = mysql_fetch_array($query);
    $check = $row['Availability'];

    if($check >0)
    {
        $A1 = 'disabled';
    }

    $query = mysql_query("SELECT * FROM seats WHERE Seat_Number = 2 AND Alphabet = 'A'");
    $row = mysql_fetch_array($query);
    $check = $row['Availability'];

        if($check >0)
    {
        $A2 = 'disabled';
    }


    $query = mysql_query("SELECT * FROM seats WHERE Seat_Number = 3 AND Alphabet = 'A'");
    $row = mysql_fetch_array($query);
    $check = $row['Availability'];

    if($check >0)
    {
        $A3 = 'disabled';
    }

        $query = mysql_query("SELECT * FROM seats WHERE Seat_Number = 4 AND Alphabet = 'A'");
    $row = mysql_fetch_array($query);
    $check = $row['Availability'];

    if($check >0)
    {
        $A4 = 'disabled';
    }

    $query = mysql_query("SELECT * FROM seats WHERE Seat_Number = 5 AND Alphabet = 'A'");
    $row = mysql_fetch_array($query);
    $check = $row['Availability'];

    if($check >0)
    {
        $A5 = 'disabled';
    }


    if(isset($_POST ['submit']))
    {

        $ch1 = $_POST["ch1"];
        $ch2 = $_POST["ch2"];
        $ch3 = $_POST["ch3"];
        $ch4 = $_POST["ch4"];
        $ch5 = $_POST["ch5"];


        if(isset($_POST['ch1'])) 
        {
            echo 'You have select ch1';
            mysql_query("UPDATE seats SET Availability = 1 WHERE Alphabet = 'A' AND Seat_Number = 1");
        }

        if(isset($_POST['ch2'])) 
        {
            echo 'You have select ch2 <br>';
            mysql_query("UPDATE seats SET Availability = 1 WHERE Alphabet = 'A' AND Seat_Number = 2");
        }

        if(isset($_POST['ch3'])) 
        {
            echo 'You have select ch3 <br>';
            mysql_query("UPDATE seats SET Availability = 1 WHERE Alphabet = 'A' AND Seat_Number = 3");
        }

        if(isset($_POST['ch4'])) 
        {
            echo 'You have select ch4 <br>';
            mysql_query("UPDATE seats SET Availability = 1 WHERE Alphabet = 'A' AND Seat_Number = 4");
        }

        if(isset($_POST['ch5'])) 
        {
            echo 'You have select ch5 <br>';
            mysql_query("UPDATE seats SET Availability = 1 WHERE Alphabet = 'A' AND Seat_Number = 5");
        }

        }

?>

<center>
<body>

<form method="post" >

  <p>

    <input name="ch1" type="checkbox" id="A1" value="A1"<?php echo $A1; ?>/>
    <input name="ch2" type="checkbox" id="A2" value="A2"<?php echo $A2; ?>/>
    <input name="ch3" type="checkbox" id="A3" value="A3"<?php echo $A3; ?>/>
    <input name="ch4" type="checkbox" id="A4" value="A4"<?php echo $A4; ?>/>
    <input name="ch5" type="checkbox" id="A5" value="A5"<?php echo $A5; ?>/>


 </p>

<input type='submit' name='submit' value='Book Selected !' />
<input name="none" type="reset" value="Clear">

</form>
</body>
</center>
</html>

【问题讨论】:

  • im learning everything from w3school - bad idea!
  • @DaveRandom 刚开始真的还不错。
  • @Jleagle 向初学者教授坏习惯会将坏习惯传播给非初学者。按你的意思开始。
  • 旁注:如果您一遍又一遍地复制/粘贴代码并更改 2-3 个字符,则可以用更少的时间完成。
  • 错误:未定义的索引来自提交时未选中的复选框。所以 DaveRandom 建议删除代码解决错误。现在有人可以帮我解决循环吗?如果我有 50 个座位,重复相同的代码会很乏味。

标签: php loops checkbox


【解决方案1】:

这里有一些关于循环和函数的帮助:

    $A1 = 'enable';
    $A2 = 'enable';
    $A3 = 'enable';
    $A4 = 'enable';
    $A5 = 'enable';

    $seats = array(1,2,3,4,5);

    function check_availability($seat)
    {
        $query = mysql_query("SELECT * FROM seats WHERE Seat_Number = $seat AND Alphabet = 'A'");
        $row = mysql_fetch_array($query);
        $check = $row['Availability'];

        if($check >0)
        {
            return 'disabled';
        }
        else{
            return 'available';
        }

    }

此功能的作用是为您检查座位并相应地返回禁用或可用。我们可以这样称呼它:

foreach($seats as $seat){
         ${'A'.$seat} = check_availability($seat);
    }

此代码将函数的返回值分配给 $A1、$A2 等... 这是 POST 的循环:

if(isset($_POST ['submit']))
    {
        for($e=1 ; $e <=5 ; $e++){
            if(isset($_POST['ch'.$e])) 
            {
                echo 'You have select ch'.$e;
                mysql_query("UPDATE seats SET Availability = 1 WHERE Alphabet = 'A' AND Seat_Number = $e");
            }

        }
    }

基本上我们重复检查 isset() 5 次 - var $e 从 1 开始,然后比较它是否仍然小于或等于 5,如果不是则增加 1

同时我们在mysql查询中使用$e来改变座位号。

【讨论】:

  • 好的,谢谢你的代码。我对其进行了测试,它奏效了。我知道 $seats = array(1,2,3,4,5);是为循环过程创建数组。但我不明白变量 $seat 的使用。可以解释一下 $seat 从哪里获取价值以及为什么使用 $seat 而不是 $seats?
  • for check_availability() 函数——不管你怎么称呼它,我们都可以叫它$w,它纯粹是为了代码的可读性。但是在 foreach 循环中$seat 是数组$seats 中的一项,我也可以称它为$b。您可能想阅读 manul for foreach 以更好地理解它php.net/manual/en/control-structures.foreach.php
  • 好的,谢谢你的手册,我会在这之后阅读它。谢谢大家提供的代码。非常欣赏它。 :D
【解决方案2】:

删除错误所需要做的就是删除此块:

    $ch1 = $_POST["ch1"];
    $ch2 = $_POST["ch2"];
    $ch3 = $_POST["ch3"];
    $ch4 = $_POST["ch4"];
    $ch5 = $_POST["ch5"];

无论如何它并没有做任何有用的事情 - 你永远不会在代码中的任何地方使用变量 $ch1 等。

如果您确实想保留变量,您可以将各个行移动到相关的 if (isset()) 块 - 如果您这样做,您将不会在检查它们是否存在之前尝试使用 $_POST 键设置。

【讨论】:

  • 在进行验证/剥离等时将值分配给 $ch1 会更好,首先你不会在整个页面上得到很多 _POST[''],其次访问 post 变量比访问慢直接一个变量(尽管在本例中这不是问题)
  • @encodes accessing a post variable is slower 对我来说听起来像是过早的优化。虽然我同意你的观点。
  • 来源:accessing a post variable is slower than accessing a variable directly?
  • @Blake 我怀疑这是真的,因为它是数组访问,它肯定是较慢的(在大规模上,例如非常多维的数组),但只​​是非常轻微,所以稍微有点无关紧要。虽然这也只是猜测。
  • @DaveRandom 我完全支持有意义的 php 优化,即:phpbench.com(我最喜欢的部分是循环)——但更多的是为了人类可读性。我试图弄清楚某人所引用的到底是什么,所花费的时间比计算机评估它的 2 纳秒要多得多。供人类阅读的代码,然后针对计算机资源进行优化。不是相反。
【解决方案3】:

我认为问题在于您检查 post 变量,您需要将其放入 isset 或类似的东西中

例如 $ch1 = 空; if(isset($_POST['ch1']){ $ch1 = $_POST['ch1']; }

这样,如果未设置数组的 ch1 部分并抛出未定义的索引异常,它将不会尝试访问。希望解释也有助于了解您哪里出错了。

您需要为每个 _POST 执行此操作

【讨论】:

  • 感谢您的回复,但这是我在 google 时找到的最多的代码。但不幸的是我不理解它,因为我是 php 的新手,我不知道如何用这段代码改变我的编码。
  • 如果您尝试访问一个元素一个不存在的数组,那么它会导致错误。如果未发布 ch1 $_POST['ch1'] 未设置并因此引发错误,您需要做的是检查 post 变量是否已设置,然后将其分配给您的局部变量。 php 有一个名为 isset 的函数,你只需执行 if(isset($_POST['ch1']){ /*code */} if ch1 is not set 它不会运行 /*code */ 位因此避免错误
【解决方案4】:

复选框的未定义索引可以通过简单地使用来消除

$ch1 = isset($_POST["ch1"])?$_POST['ch1']:null;
$ch2 = isset($_POST["ch2"])?$_POST['ch2']:null;
$ch3 = isset($_POST["ch3"])?$_POST['ch3']:null;
$ch4 = isset($_POST["ch4"])?$_POST['ch4']:null;
$ch5 = isset($_POST["ch5"])?$_POST['ch5']:null;

而不是使用

$ch1 = $_POST["ch1"];
$ch2 = $_POST["ch2"];
$ch3 = $_POST["ch3"];
$ch4 = $_POST["ch4"];
$ch5 = $_POST["ch5"];

对于您的下一个关于循环的查询,您可以使用

<?php
$A[1] = 'enable';
$A[2] = 'enable';
$A[3] = 'enable';
$A[4] = 'enable';
$A[5] = 'enable';
for ($i=1, $i<=5, $i++) {
 $query = mysql_query("SELECT * FROM seats WHERE Seat_Number = ". $i ." AND Alphabet = 'A'");
 $row = mysql_fetch_array($query);
 $check = $row['Availability'];

    if($check >0)
    {
        $A[$i] = 'disabled';
    }
}
?>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    • 1970-01-01
    • 2013-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多