【问题标题】:Selecting from a database in a sub category when a category has been chosen in a form在表单中选择类别时从子类别中的数据库中进行选择
【发布时间】:2012-12-27 16:27:14
【问题描述】:

我目前有这个表格 - 下面是一个 sn-p:

          <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 的子类别?用户选择后?

【问题讨论】:

    标签: php html mysql forms categories


    【解决方案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

    【讨论】:

    • 好吧,这似乎是我出错的地方。所以我应该让它呈现所有数据并在jquery中设置条件?例如,如果我有一个值为 1 的类别和 2 个父 id 为 1 的子类别我将如何让 jquery 显示那些父 id 为 1 的子猫,而不是说那些父 id 为 2 的子类别?用户选择后?
    • 如果您不想使用 AJAX 动态填充 select 语句(这可能是处理此问题的最佳/最干净的方法),那么您只需要设置您的可见性寻找。我会用更大的代码块更新我的答案
    【解决方案2】:

    您要做的是创建一个默认选项并将其值设置为 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
    }
    

    如果是,则获取子结果类别。

    【讨论】:

      猜你喜欢
      • 2015-12-06
      • 1970-01-01
      • 2018-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多