PHP$\会话获取PHP通知:未定义索引

PHP$\会话获取PHP通知:未定义索引,php,pdo,Php,Pdo,我有以下通过PDO从SQL获取数据的PHP代码: $dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); $tableName = 'categories'; ob_start(); session_start(); //Get values from table $sqlprimaryCategory = $dbh->prepare("SELECT *

我有以下通过PDO从SQL获取数据的PHP代码:

  $dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
    $tableName = 'categories';

    ob_start();
    session_start(); 


    //Get values from table
    $sqlprimaryCategory = $dbh->prepare("SELECT * FROM $tableName GROUP BY primary_category");
    $sqlprimaryCategory->execute();
    echo '<form id="form1" action="" method="post">';
    echo '<select name="primary_category" size = "4" onChange="document.getElementById(\'form1\').submit();"> ';
    while ($resultprimary = $sqlprimaryCategory->fetch()) {
        echo '<option value="';
        echo $resultprimary['primary_category'];
        echo '">';
        echo $resultprimary['primary_category'];
        echo '</option>'; 
    }
    echo '</select>'; 
    //echo '<input type="submit" name="primary_category_button" id="primary_category_button" value="Submit">';
    echo '</form>'; 


    if (isset($_POST['primary_category'])) {
        $_SESSION['primary_category'] = $_POST['primary_category'];
        //unset($_SESSION['secondary_category']);
        //unset($_SESSION['tertiary_category']);

    }

    //Get values from table
    $sqlSecondaryCategory = $dbh->prepare("SELECT * FROM $tableName WHERE primary_category = :primary_category GROUP BY secondary_category");
    $sqlSecondaryCategory->execute(array(':primary_category'=>$_SESSION['primary_category']));
    echo '<form id="form2" action="" method="post">';
    echo '<select name="secondary_category" size = "4" onChange="document.getElementById(\'form2\').submit();"> ';
    while ($resultSecondary = $sqlSecondaryCategory->fetch()) {
        echo '<option value="';
        echo $resultSecondary['secondary_category'];
        echo '">';
        echo $resultSecondary['secondary_category'];
        echo '</option>'; 
    }
    echo '</select>'; 
    //echo '<input type="submit" name="secondary_category_button" id="secondary_category_button" value="Submit">';
    echo '</form>'; 


    if (isset($_POST['secondary_category'])) {
        $_SESSION['secondary_category'] = $_POST['secondary_category'];
        //unset($_SESSION['tertiary_category']);

    }


    //Get values from table
    $sqlTertiaryCategory = $dbh->prepare("SELECT * FROM $tableName WHERE secondary_category = :secondary_category GROUP BY tertiary_category");
    $sqlTertiaryCategory->execute(array(':secondary_category'=>$_SESSION['secondary_category']));
    echo '<form id="form3" action="" method="post">';
    echo '<select name="tertiary_category" size = "4" onChange="document.getElementById(\'form3\').submit();"> ';
    while ($resultSecondary = $sqlTertiaryCategory->fetch()) {
        echo '<option value="';
        echo $resultSecondary['tertiary_category'];
        echo '">';
        echo $resultSecondary['tertiary_category'];
        echo '</option>'; 
    }
    echo '</select>'; 
    //echo '<input type="submit" name="tertiary_category_button" id="tertiary_category_button" value="Submit">';
    echo '</form>'; 


    if (isset($_POST['tertiary_category'])) {
        $_SESSION['tertiary_category'] = $_POST['tertiary_category'];
        unset($_SESSION['tertiary_category']);

    }





    if (isset($_POST['primary_category']) OR isset($_POST['secondary_category']) OR isset($_POST['tertiary_category'])) {
        echo $_SESSION['primary_category'];
        echo $_SESSION['secondary_category'];
        echo $_SESSION['tertiary_category'];
    }
$dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_模式,PDO::FETCH_ASSOC);
$tableName='categories';
ob_start();
会话_start();
//从表中获取值
$sqlprimaryCategory=$dbh->prepare(“按主类别从$tableName组中选择*);
$sqlprimaryCategory->execute();
回声';
回声';
而($resultprimary=$sqlprimaryCategory->fetch()){
回声';
echo$resultprimary['primary_category'];
回声';
}
回声';
//回声';
回声';
如果(isset($_POST['primary_category'])){
$_SESSION['primary_category']=$_POST['primary_category'];
//取消设置($_会话['secondary_category']);
//未设置($_会话['第三类]);
}
//从表中获取值
$sqlSecondaryCategory=$dbh->prepare(“从$tableName中选择*,其中主\u类别=:按次\u类别划分的主\u类别组”);
$sqlSecondaryCategory->execute(数组(':primary\u category'=>$\u会话['primary\u category']);
回声';
回声';
而($resultSecondary=$sqlSecondaryCategory->fetch()){
回声';
echo$resultSecondary['secondary_category'];
回声';
}
回声';
//回声';
回声';
如果(isset($_POST['secondary_category'])){
$_会话['secondary_category']=$_POST['secondary_category'];
//未设置($_会话['第三类]);
}
//从表中获取值
$sqlTertiaryCategory=$dbh->prepare(“从$tableName中选择*,其中二级\类别=:按三级\类别划分的二级\类别组”);
$sqlTertiaryCategory->execute(数组(':secondary\u category'=>$\u会话['secondary\u category']);
回声';
回声';
而($resultSecondary=$sqlTertiaryCategory->fetch()){
回声';
echo$resultSecondary[“第三类”];
回声';
}
回声';
//回声';
回声';
如果(isset($_POST['treative_category'])){
$_SESSION['treative_category']=$_POST['treative_category'];
未设置($_会话['第三类]);
}
如果(isset($_POST['primary_category'])或isset($_POST['secondary_category'])或isset($_POST['secondary_category'])){
echo$_会话[“主要类别];
echo$_会话[“次要类别];
echo$_会话[“第三类”];
}

上面是一个下拉菜单。第二个html下拉列表显示基于第一个选择的内容,而第三个下拉列表显示基于第二个下拉列表选择的内容。如何修复代码以删除错误?

如果未发布第二个类别,则它不在
会话中,因此您将无法访问它

在第三个请求语句中使用它之前,您可以通过检查
$\u会话['secondary\u category']
是否已设置来修复它

if (isset($_POST['secondary_category'])) {
    $_SESSION['secondary_category'] = $_POST['secondary_category'];
    unset($_SESSION['tertiary_category']);
}elseif (!isset($_SESSION['secondary_category'])){
    $_SESSION['secondary_category'] = null;
}
if(isset($\u POST['treative\u category'])){
$_SESSION['treative_category']=$_POST['treative_category'];
//取消设置($_会话['Triterial_category']);<为什么在分配后立即取消设置?(注释掉)
}
//将“或”更改为“和”,因为只有在所有设置都已设置的情况下,回音才会工作。
如果(isset($_POST['primary_category'])和isset($_POST['secondary_category'])和isset($_POST['secondary_category'])){
echo$_会话[“主要类别];
echo$_会话[“次要类别];
echo$_会话[“第三类”];
}
//如果要打印出存在的,请为每个类别分别创建If语句以查看它们是否存在,或者为它们指定一个空值,而不是取消设置它们。

$\u POST['secondary\u category']
还是
$\u SESSION['secondary\u category']
?您的第一个代码段显示的是
$\u POST
,但您的较大代码段显示的是
$\u SESSION
。这是$\u SESSION['secondary\u category'],我在问题中对其进行了解释,我没有看到您的
SESSION\u start()
。你记得把它放在你的页面顶部吗?@johncode很可能是因为他使用的是
$\u SESSION['primary\u category']
我在我的问题中发布了完整的代码为什么$\u SESSION['secondary\u category']=-1;不能改为null吗?不,null什么都不是。如果为空,则密钥不存在。还没定。实际上,将某些内容设置为null就像对其使用
unset()
函数一样。和-1,因为显然没有类别具有此id,所以您的mysql请求将不返回任何内容。这仍然是一个黑客攻击,你宁愿检查密钥是否存在,并相应地执行或不执行mysql请求。我将你的-1(因为它被回送)替换为null,并且你的代码似乎工作正常-没有显示错误。我的错,密钥实际上仍然存在,但是
isset
将为该密钥返回false。所以,是的,您很好地将会话类别设置为null。
if (isset($_POST['tertiary_category'])) {
    $_SESSION['tertiary_category'] = $_POST['tertiary_category'];
    //unset($_SESSION['tertiary_category']); < why unset right after assigning? (COMMENT OUT)

}




//Change OR's to AND's because the echo's will only work if all of them are set.
if (isset($_POST['primary_category']) AND isset($_POST['secondary_category']) AND isset($_POST['tertiary_category'])) {
    echo $_SESSION['primary_category'];
    echo $_SESSION['secondary_category'];
    echo $_SESSION['tertiary_category'];
}
// If you want to print out the ones that exist, make separate if statements for each category to see if they exist, or give them a blank value instead of unsetting them.