php:获取选择值并运行sql查询

时间:2018-06-22 10:58:38

标签: php html

我是php新手。我想从2个不同的选择选项中获取用户选择的值。
代码:

<?php
// Create database connection
$db = mysqli_connect("localhost", "root", "", "organisation");
if (isset($_POST['submit'])) {
    $from_date = $_POST['from_date'];
    $to_date =$_POST['to_date'];
    $result = mysqli_query($db, "SELECT * 
                                FROM images 
                                WHERE year >= '$from_date' 
                                AND year <= '$to_date';");
} 
?>
<!DOCTYPE html>
<html>
<head>

<title>Gallery</title>
<meta charset="utf-8">
</head>
<body>
    <div id="header"></div><br>
        <form action="#" method="post">
            <select name="from_date">
                <option value="2018-01-01">2018-01-01</option>
                <option value="2019-01-01">2019-01-01</option>
                <option value="2020-01-01">2020-01-01</option>
                <option value="2021-01-01">2021-01-01</option>
                <option value="2022-01-01">2022-01-01</option>
            </select> BETWEEN
            <select name="to_date">
                <option value="2018-12-31">2018-12-31</option>
                <option value="2019-12-31">2019-12-31</option>
                <option value="2020-12-31">2020-12-31</option>
                <option value="2021-12-31">2021-12-31</option>
                <option value="2022-12-31">2022-12-31</option>
            </select>
            <input type="submit" name="submit" value="SUBMIT" />
<?php
    while ($row = mysqli_fetch_array($result)) {
        echo "<div id='img_div'>";
            echo "<img src='images/".$row['images']."' >";
        echo "</div>";
    } 
?>
        </form>
</body>
</html>

我感觉自己犯了一个非常愚蠢的错误,但是最近两个小时我一直在上网,这让我发疯,请帮助。

2 个答案:

答案 0 :(得分:0)

对,您必须记住页面的生命周期。

第一次运行该页面时,从另一个页面上的链接或直接在浏览器中输入其地址,将不会提交该页面,因此$_POST数组中将没有数据。 / p>

您可以通过执行此操作在页面顶部正确检查

if (isset($_POST['submit']))

但这不会阻止页面稍后的数据库获取代码运行,并且由于没有有效的$result而导致错误。

有很多方法可以重述,但这可能是最简单的。

因此,我建议您修改这样的代码,以确保仅在实际提交表单时才运行依赖于所提交表单的代码。

<?php
// Create database connection
$db = mysqli_connect("localhost", "root", "", "organisation");
if (isset($_POST['submit'])) {
    $from_date = $_POST['from_date'];
    $to_date =$_POST['to_date'];
    $result = mysqli_query($db, "SELECT * 
                                FROM images 
                                WHERE year >= '$from_date' 
                                AND year <= '$to_date';");
} 
?>
<!DOCTYPE html>
<html>
<head>

<title>Gallery</title>
<meta charset="utf-8">
</head>
<body>
    <div id="header"></div><br>
        <form action="#" method="post">
            <select name="from_date">
                <option value="2018-01-01">2018-01-01</option>
                <option value="2019-01-01">2019-01-01</option>
                <option value="2020-01-01">2020-01-01</option>
                <option value="2021-01-01">2021-01-01</option>
                <option value="2022-01-01">2022-01-01</option>
            </select> BETWEEN
            <select name="to_date">
                <option value="2018-12-31">2018-12-31</option>
                <option value="2019-12-31">2019-12-31</option>
                <option value="2020-12-31">2020-12-31</option>
                <option value="2021-12-31">2021-12-31</option>
                <option value="2022-12-31">2022-12-31</option>
            </select>
            <input type="submit" name="submit" value="SUBMIT" />
        </form>
<?php
// check you have something to process
if (!empty($result) {
    while ($row = mysqli_fetch_array($result)) {
        echo "<div id='img_div'>";
            echo "<img src='images/".$row['images']."' >";
        echo "</div>";
    }
} 
?>
</body>
</html>

我还移动了</form>标签,以便在输出图像之前正确关闭表单。

  

您还可能会发现查询没有返回任何内容,因为可以使用下拉菜单输入一个大于结束日期的开始日期,但这只是添加一个检查即可。

     

您的脚本也向SQL Injection Attack开放   甚至if you are escaping inputs, its not safe!   在MYSQLI_PDO API中使用prepared parameterized statements

您可以通过

$stmt = $db->prepare("SELECT * 
                      FROM images 
                      WHERE year >= ?
                      AND year <= ?";
$stmt->bind_param('ss', $from_date, $to_date);
$stmt->execute();
// get resultset from prpared statement
$result = $stmt->get_result();

答案 1 :(得分:-1)