我是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>
我感觉自己犯了一个非常愚蠢的错误,但是最近两个小时我一直在上网,这让我发疯,请帮助。
答案 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)