【问题标题】:SQL Checkbox search which displays list of items that are in my databaseSQL 复选框搜索,显示我的数据库中的项目列表
【发布时间】:2019-06-27 03:54:33
【问题描述】:

我正在设置一个目录页面,该页面根据通过文本字段(有效)和/或复选框(无效)搜索的内容显示不同的锻炼

我不知道是否可以没有提交按钮,但我希​​望它搜索项目并让它搜索多个复选框

我尝试在互联网上寻求帮助,但找不到与我的项目相关的任何内容。

$sqlBrowse = "SELECT * FROM workoutLibrary
                WHERE name LIKE :findInName
                OR bodyPart  LIKE :findInBodyPart
                OR muscleGroup LIKE :findInMuscleGroup
                OR equipment LIKE :findInEquipment
                ORDER BY name";

$searchTerm = '';
$search = '%';
if (isset($_POST['search'])) {
    $searchTerm = $_POST['search'];
    $search = '%' . $searchTerm . '%';
    $stmt = $conn->prepare($sqlBrowse);
    $stmt->bindParam(":findInName", $search);
    $stmt->bindParam(":findInBodyPart", $search);
    $stmt->bindParam(":findInMuscleGroup", $search);
    $stmt->bindParam(":findInEquipment", $search);
    $stmt->execute();
    $exercises = $stmt->fetchAll();
}
else if (isset($_POST['checklist'])) {
    $searchTerm = $_POST['checklist'];
    $search = '%' . $searchTerm . '%';

    $stmt = $conn->prepare($sqlBrowse);
    $stmt->bindParam(":findInEquipment", $search);
    $stmt->execute();
    $exercises = $stmt->fetchAll();
}
?>

HTML:

<form action="directory.php" method="post">
   <input type="checkbox" name="checklist[]" class="check" value="Dumbell"> Dumbbell<br>
   <input type="checkbox" name="checklist[]" class="check" value="kettlebell"> Kettlebell<br>

</form>

      <div class="col-sm-10">
          <h1 class="theTitle"> Workout Directory </h1>
            <div class="d-flex flex-wrap">
              <?php
                foreach ($exercises as $exercise) {
               ?>
                <div class="card" id="workoutCard">
                  <div class="card-header"> <?= $exercise->name ?> </div>
                  <div class="card-body">
                      <div class="thumbnail"> </div>
                        <div class="info">
                          <a id="subTitle">Body Parts:</a> <?= $exercise->bodyPart ?><BR>
                          <a id="subTitle">Muscle Group:</a> <?= $exercise->muscleGroup ?><BR>
                          <a id="subTitle">Equipment Used:</a> <?= $exercise->equipment ?>
                        </div>
                  </div>
                </div>
            <?php
            }
            ?>

我的搜索栏工作得很好,所以我没有显示它的 HTML。 我是初学者,所以我不确定我哪里出错了,我不确定我是否可以在同名变量下有两个 PDO 执行语句。

任何帮助或提示将不胜感激

更新:一个复选框现在将显示所有相关信息(没有清单 []),但其中两个不起作用(我相信我需要清单 [] 使这两个工作) 所以我的新问题是,我该如何做到这一点:

$search = '%' 。 $searchTerm 。 '%';

显示多于一个搜索词

【问题讨论】:

    标签: php html sql pdo


    【解决方案1】:

    我假设您希望在用户选中复选框时回发表单?如果是这样,请在发布表单的复选框中添加点击事件,例如

    <input type="checkbox" name="checklist[]" class="check" onclick='document.forms[0].submit();' value="Dumbell"> Dumbbell<br>
       <input type="checkbox" name="checklist[]" class="check" onclick='document.forms[0].submit();'  value="kettlebell"> Kettlebell<br>
    

    【讨论】:

    • 我刚刚尝试添加 onclick,但它不允许我单击多个复选框,当我只单击一个复选框时没有任何反应。
    • 在这种情况下,添加一个提交按钮
    • 好的,我已经添加了它,现在我收到一条错误消息:Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in /opt/ lampp/htdocs/workoutLibrary/directory.php:35 堆栈跟踪:#0 /opt/lampp/htdocs/workoutLibrary/directory.php(35): PDOStatement->execute() #1 {main} 抛出“$stmt-> execute(); " AND 数组到字符串的转换 " $search = '%' . $searchTerm . '%'; "
    • 为什么两个复选框的名字一样?给他们唯一的名字
    • 因为在我的 PHP 中,我想选择任何清单复选框,例如$searchTerm = $_POST['清单'];所以基本上我想保存变量 searchTerm 下任何复选框的值,以便我可以使用它来搜索 %kettlebell% AND/OR %Dumbbell%
    【解决方案2】:

    数组到字符串的转换错误,是因为表单域中的checklist属性。

    当您在表单中使用 checklist[](它是一个数组)时,您将不得不循环来获取值:

         else if (isset($_POST['checklist'])) {
    
         $searchArray = $_POST['checklist'];
    
         foreach ($searchArray as $searchTerm)
          { 
             $search = '%' . $searchTerm . '%';
             $stmt = $conn->prepare($sqlBrowse);
             $stmt->bindParam(":findInEquipment", $search);
             $stmt->execute();
             $exercises = $stmt->fetchAll();
          }     
    }  
    

    【讨论】:

    • 谢谢 :) 我不知道应该把 foreach 语句放在哪里。但是我没有错误,假设我单击了两个复选框 - 它应该显示两个类别下的所有内容,但它只显示最后一个复选框的信息。我是否需要在我的 foreach 周围添加另一个 foreach ( $exercises as $exercise) {
    猜你喜欢
    • 1970-01-01
    • 2019-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-20
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多