0

我目前有这个表格 - 下面是其中的一个片段:

          <li>
            <label for="Catid">Pick a Category:</label>
            <select name="Catid">
              <?php
                  $Products = New Products();
                  $Products->form_Cat_Picker();
                ?>
            </select>
          </li>
          <li>
            <label for="Subcatid">Sub Category:</label>
            <select name="Subcatid">
              <?php
                  $Products = New Products();
                  $Products->form_Subcat_Picker();
                ?>
            </select>

好的,然后这将发送到 products.php,它在 products 类中执行以下操作:

function form_Cat_Picker() {
    $mysqli = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_NAME);
    if (!$mysqli) {
        die('There was a problem connecting to the database.');
    }       
    $catPicker = "SELECT Catid, Catname
            FROM ProductCats
            ORDER BY Catid";
    if ($Result = $mysqli->query($catPicker)){
        if (!$Result) {
            echo 'Could not run query: ' . mysql_error();
            exit;
        }
        else {
            $Result = $mysqli->query($catPicker);
        }
        while ($row = $Result->fetch_assoc()) {
            echo '<option value="'.$row["Catid"].'">'.$row["Catname"]."</option>";
        }
    }
    $mysqli->close();
}
function form_Subcat_Picker() {
    $mysqli = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_NAME);
    if (!$mysqli) {
        die('There was a problem connecting to the database.');
    }       
    $catPicker = "SELECT Subcatid, Subcatname, Parentid
            FROM ProductSubCats
            ORDER BY Subcatid";
    if ($Result = $mysqli->query($catPicker)){
        if (!$Result) {
            echo 'Could not run query: ' . mysql_error();
            exit;
        }
        else {
            $Result = $mysqli->query($catPicker);
        }
        while ($row = $Result->fetch_assoc()) {
            echo '<option value="'.$row["Subcatid"].'">'.$row["Subcatname"]."</option>";
        }
    }
    $mysqli->close();
}

这两者本质上都是从数据库中返回类别和子类别的列表,以填充表单的下拉列表。

问题是,除非在初始下拉框中选择了它们的父类别,否则我不希望出现子类别。我怎样才能做到这一点?我目前在 ProductSubCats 表中有一个额外的列,它是 Parentid,ProductCats 中有一个是 Catid,它们连接起来。

但是我将如何设置一个条件首先创建一个选择选项/值的变量,然后说“这个变量 $selected”。我会知道如何将它传递给该代码并使用条件 WHERE $selected =无论如何,但它已经到了让我感到困惑的地步。谢谢

编辑 - 似乎我的错误在于忘记 php 将在页面加载时运行一次。所以我应该让它呈现所有数据,然后使用 jquery 只显示那些已被选中的数据。但我也应该有一个值 0 和一个空白条目。例如,如果我有一个值为 1 的类别和 2 个父 id 为 1 的子类别我将如何让 jquery 显示那些父 id 为 1 的子猫,而不是说那些父 id 为 2 的子类别?用户选择后?

4

2 回答 2

1

有几种方法可以处理这个问题,但大多数都在前端。

如果您想使用 PHP 执行此操作,则只需检查是否设置了 $_POST['Catid'],并在更改时自动提交第一个类别。您必须对这种行为进行一些编码。

但是,如果您想在不加载页面的情况下完成此操作,则需要使用 AJAX 尝试动态填充第二个选择,或者隐藏/过滤值。无论哪种情况,您都可能希望/需要使用 jQuery 来让您的生活变得更简单。

但是,您似乎忘记了 PHP 是一种服务器端语言。因此,PHP 无法在用户做出选择后填充第二个选择框。Javascript 可以,因为它在浏览器中运行,或者您可以刷新/重新提交页面并获取 POST 数据并使用它,但 PHP 仅在第一次点击页面时“运行一次”,然后生成所有选择/数据.

更新:如果您希望以“快速而肮脏”的方式执行此操作,您可以填充每个子类别选择,并将它们各自放在一个 div 中。然后,给他们一个父类别的 ID,并将他们的可见性设置为 false:

        <div id='parentId1' style="display:none">
        <select name="Subcatid">
          <?php
              $Products = New Products();
              $Products->form_Subcat_Picker();
            ?>
        </select>
        </div>

您现在可以在父选择器中设置 onChange 函数,该函数显示/隐藏适当的其他值$("#parentId" + parentId).show()。这将为您提供很多帮助,但是如果您花时间学习如何进行 AJAX 调用,那么使用 jQuery 很容易做到,并且可能会得到您想要的东西。这是一个很好的 SO 问题,它显示了如何做到这一点: jquery getJson populate Select Menu Question

于 2012-12-27T16:34:34.477 回答
1

您要做的是创建一个默认选项并将其值设置为 0

<select name="main">
    <option value="0">Please Select an Option...</option>
    <option value="1">Option 1</option>
    <option value="2">Option 2</option>
</select>

接下来在您的 php 中,您需要检查用户是否选择了某些内容

$selected = (int)$_POST["main"];
if(!empty($selected)){
    // They selected something other than 0
    // 0 is considered empty
}

如果是这样,请获取子结果类别。

于 2012-12-27T16:39:15.193 回答