Php: получить значения выбора и запустить запрос sql

Я новичок в php. Я хотел бы получить значения, выбранные пользователем, из двух разных вариантов выбора.
CODE:

<?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 часа, и это сводит меня с ума, пожалуйста, помогите.

Во-первых, у вас есть риск sql-инъекция, во-вторых, что не работает?

Federico klez Culloca 22.06.2018 12:59

Теперь, когда я это вижу: if (isset($_POST['submit'])) { в этом нет никакого смысла, просто удалите его

Federico klez Culloca 22.06.2018 13:00

Вы берете дату из html и сопоставляете год в запросе.

rawathemant 22.06.2018 13:01

удаление if (isset ($ _ POST ['submit'])) {дает следующую ошибку: Примечание: неопределенный индекс: to_date, from_date

B Banner 22.06.2018 13:02

Для вашего цикла while требуется $result, который будет существовать только после отправки формы. Поэтому перед отправкой убедитесь, что ваша форма действительно «закрыта». Попробуйте включить error_reporting / display_errors.

JustBaron 22.06.2018 13:03

Бобби Тейблс получит свой фунт мяса. bobby-tables.com

GordonM 22.06.2018 13:03

var_dump $ _POST посмотри, получишь ли ты что-нибудь

Avi Teller 22.06.2018 13:05

@JustBaron О, понятно. Любая работа?

B Banner 22.06.2018 13:06

разделяют значение столбца year и sql-запроса echo "SELECT * FROM images WHERE year >= '$from_date' AND year <= '$to_date';"?

Niklesh Raut 22.06.2018 13:07

@ C2486 Я проверил запрос вручную, он работает отлично.

B Banner 22.06.2018 13:09

@ C2486 imgur.com/a/x69FgfO

B Banner 22.06.2018 13:10

Тогда поделитесь значением столбца year? Еще раз прошу поделиться запросом?

Niklesh Raut 22.06.2018 13:10

Ребята, дата, очевидно, в порядке, так как она выбрана из 2 раскрывающихся списков, и значения находятся в правильном формате для запроса MySQL

RiggsFolly 22.06.2018 13:11

@RiggsFolly: Сомневалась, как это from_date : 2019-01-01 на to_date: 2018-12-31. Также нет проверки, чтобы to_date всегда был больше, чем from_date, и в соответствии с изображением есть только 3 строки / записи. Так что подтверждал, какой параметр даты он использует.

Niklesh Raut 22.06.2018 13:14

@RiggsFolly а? С каких это пор нужно проверять, была ли отправлена ​​кнопка отправки через POST?

Federico klez Culloca 22.06.2018 13:23

@FedericoklezCulloca Вам всегда нужно проверять, была ли отправлена ​​форма, чтобы вы не запускали код, который зависит от $_POST, содержащий что-то, при первом запуске формы, по ссылке или вручную вводя адрес в адресную строку браузера.

RiggsFolly 22.06.2018 13:27

@BBanner В чем собственно проблема? Перед отправкой формы убедитесь, что тег формы правильно закрыт. Включите и отобразите ошибки, это должно дать вам некоторые подсказки о том, где вы ошибаетесь.

JustBaron 22.06.2018 13:31

К какому типу относится ваше поле year?

SirPilan 22.06.2018 13:36

@RiggsFolly Я понимаю, но впервые вижу это, проверяя кнопку отправки. В любом случае, не следует ли проверять все действительно необходимые входные данные?

Federico klez Culloca 22.06.2018 13:42

@FedericoklezCulloca Ну да, или проверив if ($_SERVER['REQUEST_METHOD'] == 'POST', но это запускает ответ в полное руководство

RiggsFolly 22.06.2018 13:44

@RiggsFolly Я, вероятно, не очень понял, потому что мой комментарий, который вы сказали OP не следовать, был о странности проверяемой кнопки отправки.

Federico klez Culloca 22.06.2018 13:48
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
21
1 160
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

пожалуйста, обратитесь к этому коду, он вам поможет. https://www.sourcecodester.com/php/11560/how-select-data-between-two-dates-phpmysql.html

Я вижу, у вас мало представителей, но на самом деле это всего лишь комментарий. Этот тип ответа привлекает отрицательные голоса или помечается как Я не делал DV, и если это произойдет, вы потеряете очки репутации и займет больше времени, чтобы добраться до 50 представителей, которые вам нужно прокомментировать любой вопрос. А до тех пор придерживайтесь тех вопросов, которые задаются правильно, и поэтому на них легко ответить, не требуя пояснений. meta.stackexchange.com/questions/214173/…

RiggsFolly 22.06.2018 13:13
Ответ принят как подходящий

Правильно, вы должны помнить жизненный цикл страницы.

При первом запуске этой страницы по ссылке на другой странице или непосредственно путем ввода ее адреса в браузере она не будет отправлена ​​и, следовательно, в массиве $_POST не будет данных.

Вы правильно проверяете это вверху страницы, сделав это

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>, чтобы форма корректно закрывалась перед выводом изображений.

You may also find that the query returns nothing as it is possible to enter a start date that is greater than the end date using the dropdowns, but that is just a matter of adding a check for this.

Also your script is wide open to SQL Injection Attack Even if you are escaping inputs, its not safe! Use prepared parameterized statements in either the MYSQLI_ or PDO API's

Вы бы сделали это

$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();

Другие вопросы по теме