【问题标题】:retrieving results from mySQL using options from selected check boxes使用选定复选框中的选项从 mySQL 检索结果
【发布时间】:2012-12-10 05:41:29
【问题描述】:

我有一个简单的 PHP 表单,有 4 个复选框。用户可以选择 0-4 个复选框,根据他们的选择,结果应该会有所不同。

基本上,四个复选框代表一所大学的四个校区 - 校区 A、B、C、D。并假设如果用户选择 2 个校区说 A 和 C。那么我想根据选择查询数据库并检索与这两个校区 A 和 C 对应的课程。如果用户只选择一个校区,那么我想检索课程在那个单一的校园里。

在 mySQL 上,我有一个具有以下架构(ID、校园名称、城市、州)的 Location 表,其中 ID 是主键。我还有一个课程表,其架构为 Course(ID,CourseName,LocationID,Seatsleft)。 ID为主键,LocationID为外键,引用Location表的ID。

我的PHP代码如下:

这是我的代码的更新版本。

选择不同校区的 PHP 表单复选框

<body>

<?php
require 'connection.php';


    if(isset($_POST['formSubmit'])) 
    {
        $aCampus = $_POST['campus'];



        if(empty($aCampus)) 
        {
            echo("<p>You didn't select any campus.</p>\n");
        } 
        else 
        {
            $N = count($aCampus);

            echo("<p>You selected $N campus(s): ");
            for($i=0; $i < $N; $i++)
            {
                echo($aCampus[$i] . " ");
            }
            echo("</p>");
        }

    }

    function IsChecked($chkname,$value)
    {
        if(!empty($_POST[$chkname]))
        {
            foreach($_POST[$chkname] as $chkval)
            {
                if($chkval == $value)
                {
                    return true;
                }
            }
        }
        return false;
    }

    $where="1";

    if(!empty($_POST['campus'])){
    foreach ($_POST['campus'] as $campus){

       $where=" LocationID='". $campus."'";
       }
    }

//$query = "SELECT `Name` FROM `course` WHERE LocationID=1";
$query="SELECT `Name` FROM  `course` WHERE 1 AND (".$where.")";


if ($query_run = mysql_query($query)) {

while ($query_row = mysql_fetch_assoc($query_run)) {

$coursename =$query_row['Name'];
echo $coursename. '<br/>';

}
} else {
echo mysql_error();

}



?>

<form action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>" method="post">
    <p>
        Which campus courses do you want to get access to?<br/>
        <input type="checkbox" name="campus[]" value=1 />Campus A<br />
        <input type="checkbox" name="campus[]" value=2 />Campus B<br />
        <input type="checkbox" name="campus[]" value=3 />Campus C<br />
        <input type="checkbox" name="campus[]" value=4 />Campus D

    </p>

    <input type="submit" name="formSubmit" value="Submit" />
</form>


</body>
</html>

我的问题是如何从我的 PHP 表单中获取选项并查询数据库以仅从选定的校园检索课程?

【问题讨论】:

标签: php mysql


【解决方案1】:

请尝试以下简单的查询创建者逻辑。

    $whereArr =Array();
    $whereArr[] = 1;
    if(!empty($_POST['campus'])){
    foreach ($_POST['campus'] as $campus){
        $whereArr[]="  LocationID LIKE ',". $campus.",'";
       }
    }
   $query="SELECT `Name` FROM  `course` WHERE 1 AND(".implode(" OR ",$whereArr)." )";

以上代码适用于以下记录:

289,"Math","2,3,",67

【讨论】:

  • 不好的例子。容易受到注入攻击。
  • 使用mysql_real_escape_string进行注入攻击
  • Hey Uttam 它适用于单选!但在选择多个校区时不会取消课程!
  • 嘿@UttamKadam !感谢您的输入。看看我的代码的更新版本..
  • $whereArr =Array(); $whereArr[] = 1; if(!empty($_POST['campus'])){ foreach ($_POST['campus'] as $campus){ $whereArr[]=" LocationID='". $校园。",'"; } } $query="SELECT Name FROM course WHERE 1 AND(".implode(" OR ",$whereArr)." )";
【解决方案2】:

在这种情况下,我会将校园作为逗号分隔的字符串存储在数据库中。然后就可以使用mySQL中的FIND_IN_SET()函数进行查询了

例如

课程记录

203,"Biology","1,2,4",34

那么你可以

SELECT * FROM course WHERE FIND_IN_SET(4,locationid)

这将为您提供“集合”中具有4 的所有记录

【讨论】:

    【解决方案3】:

    类似这样的:

    $validoptions = array('A','B','C','D');
    $allvalid = true;
    foreach ($_POST['campus'] as $campus){ 
        if (!in_array($campus,$validoptions)) $allvalid = false;
    }
    if (!$allvalid) {
        echo 'Wrong campuses selected. Try again.';
        exit;
    }
    $query = 'SELECT * FROM `Courses` WHERE ';
    $query .= 'LocationID = \''.implode('\' OR LocationID = \'',$campuses).'\'';
    $link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
    if (!$link) die('Could not connect: ' . mysql_error());
    mysql_select_db("databasename");
    $res = mysql_query($query);
    $data = array();
    if ($res && mysql_num_rows()) {
         $data = array();
         while($d = mysql_fetch_array($res)) {
             $data[] = $d;
         }
    }
    if (count($data) > 0) {
        echo 'No courses found !';
    }else {
        echo 'Courses found : ';
        print_r($data);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多