【问题标题】:MySql query for multiple selected options in HTML formMySql 查询 HTML 表单中的多个选定选项
【发布时间】:2015-11-03 19:34:12
【问题描述】:

我已经搜索了有关我的问题的类似帖子和信息,但找不到任何对我有很大帮助的帖子和信息。我在网页上有一个包含 5 个下拉菜单的表单,每个下拉菜单都有不同的选项,用户将从每个下拉菜单中选择一个选项,然后点击提交按钮。此时,我想在数据库上运行一个查询,以查找所有“选定”选项的匹配条件。现在我不需要匹配所有字段,因为我只是在测试,所以我只想检查一个字段。我使用的表格是这样的:

<div class="section-two">
    <div class="row bound-box">
        <div class="col-lg-8 col-md-8 col-sm-8 col-lg-offset-2 col-md-offset-2 col-sm-offset-2 main clearfix">
            <form id="nl-form" class="nl-form" action="searchpubs.php" method="post">
            I feel to visit 
            <select id="category">
                <option value="anywhere" selected>anywhere</option>
                <option value="pub">a pub</option>
                <option value="nightclub">a nightclub</option>
                <option value="brewery">a brewery</option>
                <option value="stripclub">a gentleman's club</option>
            </select>
            <br/>that
            <select id="foodDrink">
                <option value="food" selected>serves food</option>
                <option value="drinks">serves drinks only</option>
            </select>
            and has 
            <br/> 
            <select id="extra">
                <option value="poolTable" selected>a pool table</option>
                <option value="danceFloor">a dance floor</option>
                <option value="tv">tv's</option>
                <option value="everything">everything</option>
                <option value="anything">anything</option>
            </select>
            . It's within<br>
            <select id="distance">
                <option value="anyDistance" selected>any distance</option>
                 <option value="5">5 km</option>
                 <option value="10">10 km</option>
                 <option value="15">15 km</option>
                 <option value="20">20 km</option>
            </select>
            from me<br> and is open
            <select id="hours">
                <option value="late" selected>past 12 a.m.</option>
                 <option value="allDay">all day</option>
                 <option value="weekdays">on weekdays</option>
                 <option value="sundays">on sundays</option>
                 <option value="anytime">anytime</option>
            </select>
            <div class="nl-submit-wrap">
                <button class="nl-submit" type="submit">Find Your Pub</button>
            </div>
            <div class="nl-overlay"></div>
            </form>
        </div><!--column-->
    </div><!-- row -->
</div><!--section-two-->

因此,例如,如果用户在选择 ID“foodDrink”下选择了选项“提供食物”,我想在我们的数据库上运行一个查询,以在标记为“食物”的列中搜索包含“是”的任何行“在那一栏中。然后在浏览器中显示所有匹配条件。现在它不需要格式化等,我只想在浏览器中看到它以确保查询有效。任何人都可以帮我解决这个问题,并且可能了解如何在准备好后添加其他查询。

我目前正在像这样连接到我的数据库:

<?php

//DATABASE CONNECTION INFO BELOW:
$hostname="hostname";
$database="dbname";
$username="myusername";
$password="mypassword";

$link = mysql_connect($hostname, $username, $password);
if (!$link) {
    die('Connection failed: ' . mysql_error());
}

$db_selected = mysql_select_db($database, $link);
if (!$db_selected) {
    die ('Can\'t select database: ' . mysql_error());
}

mysql_close($link);

?>

【问题讨论】:

  • 不推荐使用 mysql_* 函数。使用 mysqli 或 PDO,以及准备好的语句。记住bobby tables

标签: php mysql database forms


【解决方案1】:

以下表示存根。我不会为您编写端到端查询。请注意,您的表单在 $_POST 中没有给 PHP 处理程序提供任何内容,因为在这 5 行左右的下拉菜单中缺少 name='xxx'。他们所拥有的只是下拉 ID。

另外,你需要使用 mysql_* 函数以外的东西。那些旧的不推荐使用的函数很容易受到来自互联网上大量源代码的 sql 注入攻击。而且它们不会将查询与参数分开。其中没有准备好的语句绑定,也没有异常处理(我见过使用过,有人纠正我)。所以这些是几个原因,我会停在那里。

所以我把它移到 mysqli。如果您愿意,您也可以选择 PDO。并且您需要使用准备好的语句进行绑定以清理用户输入,以免在未清理的情况下直接对其进行操作。绑定会为您做到这一点。

但以下内容将使您的 POST 回到输出中。相应地进行。

表格

<html>
<body>
<div class="section-two">
    <div class="row bound-box">
        <div class="col-lg-8 col-md-8 col-sm-8 col-lg-offset-2 col-md-offset-2 col-sm-offset-2 main clearfix">
            <form id="nl-form" class="nl-form" action="searchpubs.php" method="post">
            I feel to visit 
            <select id="category" name="category">
                <option value="anywhere" selected>anywhere</option>
                <option value="pub">a pub</option>
                <option value="nightclub">a nightclub</option>
                <option value="brewery">a brewery</option>
                <option value="stripclub">a gentleman's club</option>
            </select>
            <br/>that
            <select id="foodDrink" name="foodDrink">
                <option value="food" selected>serves food</option>
                <option value="drinks">serves drinks only</option>
            </select>
            and has 
            <br/> 
            <select id="extra" name="extra">
                <option value="poolTable" selected>a pool table</option>
                <option value="danceFloor">a dance floor</option>
                <option value="tv">tv's</option>
                <option value="everything">everything</option>
                <option value="anything">anything</option>
            </select>
            . It's within<br>
            <select id="distance" name="distance">
                <option value="anyDistance" selected>any distance</option>
                 <option value="5">5 km</option>
                 <option value="10">10 km</option>
                 <option value="15">15 km</option>
                 <option value="20">20 km</option>
            </select>
            from me<br> and is open
            <select id="hours" name="hours">
                <option value="late" selected>past 12 a.m.</option>
                 <option value="allDay">all day</option>
                 <option value="weekdays">on weekdays</option>
                 <option value="sundays">on sundays</option>
                 <option value="anytime">anytime</option>
            </select>
            <div class="nl-submit-wrap">
                <button class="nl-submit" type="submit">Find Your Pub</button>
            </div>
            <div class="nl-overlay"></div>
            </form>
        </div><!--column-->
    </div><!-- row -->
</div><!--section-two-->
</body>
</html>

searchpubs.php

<?php
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    error_reporting(E_ALL);
    ini_set("display_errors", 1);
    // error reporting is now turned on

    echo "start<br/>";
    try {
        $mysqli= new mysqli('hostname', 'username', 'password', 'dbname');  // change me please
        if ($mysqli->connect_error) {
            die('Connect Error (' . $mysqli->connect_errno . ') '
                . $mysqli->connect_error);
        }
        echo "I am connected and feel happy.<br/>";
?>
<table>
<?php 
    //http://stackoverflow.com/a/9332766/

    foreach ($_POST as $key => $value) {
        echo "<tr>";
        echo "<td>";
        echo $key;
        echo "</td>";
        echo "<td>";
        echo $value;
        echo "</td>";
        echo "</tr>";
    }


?>
</table>
<?php
        // make necessary mysqli queries by BINDING parameters with prepared statements

        // because even though they are from a drop down box, they can be faked

        // and sql injection can and will occur by some fool out there

        //$stmt->close(); 
        $mysqli->close();
    } catch (mysqli_sql_exception $e) { 
        throw $e; 
    } 
?>

浏览器输出(成功时)

start
I am connected and feel happy.
category    anywhere
foodDrink   drinks
extra   poolTable
distance    10
hours   late

尝试/捕捉,错误

以下是可能出现错误之一的输出:

致命错误:未捕获的异常“mysqli_sql_exception”和消息“A” 连接尝试失败,因为连接方没有正确 一段时间后响应,或建立连接失败 因为连接的主机没有响应。 ' 在 C:\Apache24\htdocs\searchpubs.php:9 堆栈跟踪:#0 C:\Apache24\htdocs\searchpubs.php(9): mysqli->mysqli('ibm.com', 'LordBenson', 'billybob', 'db666') #1 {main} 投入 C:\Apache24\htdocs\searchpubs.php 第 9 行

所以打开错误报告,尝试/捕获。它有你的支持。让它吧。

【讨论】:

  • 不客气,当您对堆栈进行更改时,请阅读一些these。这是在堆栈上搜索“mysql sql injection”,按 desc 顺序投票
  • 我自己会选择 PDO,但主要是因为你才刚刚开始,所以要从网上进入与 mysql_* 不同的潮流。并检查参数绑定。祝你好运
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-04
  • 1970-01-01
  • 2016-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多