【问题标题】:Prevent duplication in a PHP filter防止 PHP 过滤器中的重复
【发布时间】:2021-01-29 18:10:09
【问题描述】:

所以我的过滤系统还有另一个问题。当我从我拥有的第一个下拉列表中选择一个选项时,我得到了我的过滤结果。但我也得到了过滤结果下方的一个块,在该块中我可以从第二个下拉列表(重复)中看到我的选项,并且在下面我再次拥有数据库中的所有结果。我怎样才能防止这种情况发生?

这是我的 index.php

<!doctype html>
<html lang="de">
<head>

<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

<!-- Stylesheets -->
<link rel="stylesheet" href="css/style.css">
<link rel="stylesheet" 
href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.3/css/bootstrap.min.css" 
integrity="sha384-TX8t27EcRE3e/ihU7zmQxVncDAy5uIKz4rEkgIXeMed4M0jlfIDPvg6uqKI2xXr2" 
crossorigin="anonymous">

<!-- jQuery -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script src="js/jquery.min.js"></script>
<script>


  
  $(document).ready(function(){

    // Live anzeigen der 2. Ebene + 1 Ebene Ergebnisse
    $('#category').on('change', function(){
      var categoryID = $(this).val();
      if(categoryID){
        $.ajax({
          type:'POST',
          url:'ajaxdata.php',
          data:'category_id='+categoryID,
          success:function(html){
            $('#subcategory').html(html);
            $('#partner').html(html);
            $('#subcategory').prop('disabled', false);
          }
        });
      } else {
        $('#subcategory').html('<option value="">Zuerst Überkategorie auswählen!</option>');
      }
    }); 

    // Live Anzeigen der 3. Ebene + 2. Ebene Ergebnisse
    $('#subcategory').on('change', function(){
      var subcategoryID = $(this).val();
      if(subcategoryID){
        $.ajax({
          type:'POST',
          url:'ajaxdata.php',
          data:'subcategory_id='+subcategoryID,
          success:function(html){
            $('#subcategory2').html(html);
            $('#partner').html(html);
            $('#subcategory2').prop('disabled', false);
          }
        });
      } else {
        $('#subcategory2').html('<option value="">Zuerst Unterkategorie auswählen! 
    </option>');
      }
    });

    // Live anzeigen der 3. Ebene Ergebnisse
    $('#subcategory2').on('change', function(){
      var subcategory2ID = $(this).val();
      if(subcategory2ID){
        $.ajax({
          type:'POST',
          url:'ajaxdata.php',
          data:'subcategory2_id='+subcategory2ID,
          success:function(html){
            $('#partner').html(html);
          }
        });
      } else {
        $('#partner').html('<h1>Zuerst Unterkategorie auswählen!</h1>');
      }
    });
  });

</script>

</head>
<body>
<?php

  // Include connection.php
  include_once 'dbconfig.php';

  // Fetch all the category data
  $query = "SELECT * FROM categories WHERE status = 1 ORDER BY category_name ASC";
  $result = $connect->query($query);

?>

<!-- Category dropdown -->
<div class="container">
  <div class="row">
    

      <form action="" method="post">
        <div class="col">
          <select id="category" name="category" class="dropdown">

            <?php

              if($result->num_rows > 0){
                while($row = $result->FETCH_ASSOC()){
                  echo '<option value="'.$row['category_id'].'">'.$row['category_name'].'</option>';

                }
              } else {
                echo '<option value="">Nicht verfügbar!</option>';
              }
            ?>
          </select>
        </div>
        
        <div class="col">
          <!-- Subcategory dropdown -->
          <select id="subcategory" name="subcategory" class="dropdown" disabled>
            <option value="">Kategorie auswählen!</option>
          </select>
        </div>

        <div class="col">
          <!-- 2nd subcategory dropdown -->
          <select id="subcategory2" name="subcategory2" class="dropdown" disabled>
            <option value="">Kategorie auswählen!</option>
          </select>
        </div>
        
      </form>

    
  </div>
</div>

  <!-- Show all results -->
  <div id="all_results">
      <? /*
      $query = "SELECT * FROM partner WHERE status = 1 ORDER BY partner_name ASC";
      $result = $connect->query($query);
      if ($result->num_rows > 0){
      } */
      ?>
  </div>



<!-- Partner results -->
<div id="partner">
  <?php

    if($result->num_rows > 0){
      while($row = $result->FETCH_ASSOC()){
        ?>
        <div>
          <h1><? echo $row['partner_name'] ?></h1><br>
          <img src="<? echo $row['partner_logo'] ?>"><br>
          <a href="<? echo $row['partner_link'] ?>">Zum Unternehmen!</a>
        </div>
        <?php 
      }
    } else {
      echo '<p>Nichts gefunden!<p>';
    }
   ?>
</div>


<!-- jQuery library -->
<script src="js/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>

这是我的 ajaxdata.php:

<?php

include_once 'dbconfig.php';

//Dropdown No. 1
if(!empty($_POST['category_id']))
{

  // Anzeigen von Ergebnisse - 1. Ebene
  $query = "SELECT * FROM partner WHERE category_id = ".$_POST['category_id']." AND status = 1 
ORDER BY partner_name ASC";
  $result = $connect->query($query);

  if($result->num_rows > 0)
  {
    while($row = $result->FETCH_ASSOC())
    {
    ?>        
      <div class="div_results">
        <h1><? echo $row['partner_name'] ?></h1><br>
        <img src="<? echo $row['partner_logo'] ?>"><br>
        <a href="<? echo $row['partner_link'] ?>">Zum Unternehmen!</a>
      </div>
    <?php
    }
  }

  // Anzeigen der Kategorien der 2. Ebene
  $query = "SELECT * FROM subcategories WHERE category_id = ".$_POST['category_id']." AND status = 1 ORDER BY subcategory_name ASC";
  $result = $connect->query($query);

  if($result->num_rows > 0)
  {
    echo '<option value="">Kategorie auswählen!</option>';

    while($row = $result->FETCH_ASSOC())
    {
      echo '<option value="'.$row['subcategory_id'].'">'.$row['subcategory_name'].'</option>';
    }
  } 

  // Anzeigen aller Ergebnisse
  $query = "SELECT DISTINCT * FROM partner WHERE status = 1 ORDER BY partner_name ASC";
  $result = $connect->query($query);

  if($_POST["category_id"] != "Alle")
  {
    while($row = $result->FETCH_ASSOC())
    {
    ?>        
      <div class="div_results">
        <h1><? echo $row['partner_name'] ?></h1><br>
        <img src="<? echo $row['partner_logo'] ?>"><br>
        <a href="<? echo $row['partner_link'] ?>">Zum Unternehmen!</a>
      </div>
    <?php
    }
  }   
  else {
    echo '<option value="">Nothing found!</option>';
  }
}

// Dropdown No. 2
elseif(!empty($_POST['subcategory_id']))
{

  // Anzeigen von Ergebnisse - 2. Ebene
  $query = "SELECT * FROM partner WHERE subcategory_id = ".$_POST['subcategory_id']." AND 
status = 1 ORDER BY  partner_name ASC";
  $result = $connect->query($query);

  if($result->num_rows > 0)
  {
    while($row = $result->FETCH_ASSOC())
    {
    ?>
    
      <div>
        <h1><? echo $row['partner_name'] ?></h1><br>
        <img src="<? echo $row['partner_logo'] ?>"><br>
        <a href="<? echo $row['partner_link'] ?>">Zum Unternehmen!</a>
      </div>
    <?php
    }
  }

  // Anzeigen der Kategorien der 3. Ebene
  $query = "SELECT * FROM subcategories2 WHERE subcategory_id = ".$_POST['subcategory_id']." 
AND status = 1 ORDER BY subcategory2_name ASC";
  $result = $connect->query($query);

  if($result->num_rows > 0)
  {
    echo '<option value="">Untekategorie auswählen!</option>';

    while($row = $result->FETCH_ASSOC())
    {
      echo '<option 
value="'.$row['subcategory2_id'].'">'.$row['subcategory2_name'].'</option>';
    }
  }
  else {
    echo '<option value="">Nichts gefunden!</option>';
  }
}


// Dropdown No. 3
elseif(!empty($_POST['subcategory2_id'])){

// Anzeigen von Ergebnisse - 3. Ebene (Letzte Ebene)
$query  = "SELECT * FROM partner WHERE subcategory2_id = ".$_POST['subcategory2_id']." AND status = 1 ORDER BY partner_name ASC";
$result = $connect->query($query);

if($result->num_rows > 0){

  while($row = $result->FETCH_ASSOC()){
    ?>
    <div>
      <h1><? echo $row['partner_name'] ?></h1><br>
      <img src="<? echo $row['partner_logo'] ?>"><br>
      <a href="<? echo $row['partner_link'] ?>">Zum Unternehmen!</a>
    </div>
    <?php
  }
} else {
  echo 'Nothing found!';
}
}
?>

我做错了什么,所以这会在我过滤时显示所有内容

【问题讨论】:

  • &lt;script src="js/jquery.min.js"&gt;&lt;/script&gt; &lt;script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"&gt;&lt;/script&gt; 没有意义——你不需要加载 jQuery 两次。 (这不是您问题中问题的根源,但它肯定是不必要且效率低下的,有时它实际上会导致问题)。只保留其中一条,而不是两条。
  • 但是是本地的,所以当我想自己写点什么的时候呢?
  • 对不起,我不明白你的意思。它们都是同一个文件的副本。你只需要其中之一。不管它是否在您的本地服务器上,您的网页并不关心它来自哪里,只要它可以成功加载它。一旦加载,它的来源就无关紧要了,它的行为是一样的。
  • 无论如何 - 我编辑了您的帖子,为您的 ajaxdata.php 添加了适当的缩进和间距,因此我们可以更轻松地查看代码流。以前很难读。一旦我这样做了,很明显在if(!empty($_POST['category_id'])) 区域内,您正在运行SELECT * FROM partner... 查询的两个版本,并从两者输出结果。第一个版本被过滤,但第二个版本没有。我不知道你为什么这样做。这似乎没有任何意义,但很明显这是问题的根源。
  • 那么我怎样才能最好地解决它?

标签: php sql database filter


【解决方案1】:

对于第一个问题(返回一组未过滤的结果以及过滤后的结果集),只是您正在运行 SELECT * FROM partner... 查询的两个版本,并从两者输出结果。第一个版本被过滤,但第二个版本没有。您只需要删除第二个版本 - 不清楚为什么要这样开始。

对于第二个问题(在结果之后输出下拉选项),问题在于您只是在输出一大串 HTML。然后您编写了$('#subcategory').html(html); $('#partner').html(html);,它试图将相同的单个 HTML 流放入页面的两个部分!第一个命令可能无法完全正常工作,因为您试图将 div 放入选择中。第二个打印 PHP 输出的所有内容 - 它无法告诉您要在那里打印哪个位,以及哪个位是用于下拉菜单的。你没有给它区分的方法。

从 PHP 返回一个 JSON 对象会更有意义,它具有两个属性 - 一个属性包含用于搜索结果的 HTML,另一个包含用于下拉列表的 HTML。然后 Javascript 可以轻松地将正确的位分别读取到页面的每个部分中。

我认为这样的事情应该可以工作(尽管显然我很难测试它):

JavaScript:

    $('#category').on('change', function(){
      var categoryID = $(this).val();
      if(categoryID){
        $.ajax({
          type:'POST',
          url:'ajaxdata.php',
          data:'category_id='+categoryID,
          dataType: "json",
          success:function(response){
            $('#subcategory').html(response.subcategories);
            $('#partner').html(response.results);
            $('#subcategory').prop('disabled', false);
          }
        });
      } else {
        $('#subcategory').html('<option value="">Zuerst Überkategorie auswählen!</option>');
      }
    }); 

PHP:

//Dropdown No. 1
if(!empty($_POST['category_id']))
{

  // Anzeigen von Ergebnisse - 1. Ebene
  $query = "SELECT * FROM partner WHERE category_id = ".$_POST['category_id']." AND status = 1 
ORDER BY partner_name ASC";
  $result = $connect->query($query);
  $resultHTML = "";

  if($result->num_rows > 0)
  {
    while($row = $result->FETCH_ASSOC())
    {
      $resultHTML .=        
      '<div class="div_results">
        <h1>'.$row['partner_name'].'</h1><br>
        <img src="'.$row['partner_logo'].'"><br>
        <a href="'.$row['partner_link'].'">Zum Unternehmen!</a>
      </div>';
    }
  }

  // Anzeigen der Kategorien der 2. Ebene
  $query = "SELECT * FROM subcategories WHERE category_id = ".$_POST['category_id']." AND status = 1 ORDER BY subcategory_name ASC";
  $result = $connect->query($query);
  $subCategoryHTML = "";

  if($result->num_rows > 0)
  {
    $subCategoryHTML .= '<option value="">Kategorie auswählen!</option>';

    while($row = $result->FETCH_ASSOC())
    {
      $subCategoryHTML .= '<option value="'.$row['subcategory_id'].'">'.$row['subcategory_name'].'</option>';
    }
  }

  $returnData = array("results" => $resultHTML, "subcategories" => $subCategoryHTML);
  echo json_encode($returnData);
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2020-07-27
  • 1970-01-01
  • 2021-03-22
  • 2020-03-29
  • 2023-03-12
  • 2015-10-27
  • 2019-12-04
  • 1970-01-01
相关资源
最近更新 更多