Как продвигаться к выполнению подготовленных операторов с параметрами, возможно ли это с помощью этого запроса?

97
12

Поэтому я новичок в MySQL и PHP, и я построил запрос на основе условных выражений, так как наша структура базы данных немного странная. Прежде чем идти дальше в разработке, я хотел реализовать запрос с подготовленными инструкциями с использованием параметров для предотвращения инъекций. Я смотрел видео, в котором говорилось, что с помощью real_escape_string можно предотвратить инъекцию sql, так что мой первый вопрос, достаточно ли этого? или параметры абсолютно необходимы. Я чувствую, что они есть. Следующий вопрос: есть ли что-то неправильное в том, как я это реализовал, кроме того, что он очень длинный? В основном есть 4 выпадающих списка в форме, и каждый выпадающий список содержит 5 опций, пользователь может выбрать 1 вариант из каждого раскрывающегося списка, а затем отправить. Используя переменную $ _POST, я выбираю то, что мне нужно, наилучшим образом из базы данных. Итак, если нет ничего плохого в том, как я это сделал, тогда мой вопрос: где и как я начну выполнять подготовленные заявления с этим? Я исследовал его, но мне трудно понять, что я делаю. Я думал, что мне понадобится одно и то же условие if-else, чтобы установить параметры, но все равно я смущен тем, где разместить?. Если бы кто-нибудь мог мне помочь, я был бы очень благодарен. Спасибо.... Большой запрос ниже:

Кроме того, getHourValue() возвращает дополнительную строку с секцией запроса в зависимости от значения в $ _POST ['hours'], потому что это был чрезвычайно длинный сегмент, который использовался снова и снова, я положил его в функцию.

            if($_POST['category'] == "anywhere") {
if($_POST['food'] == "No") {
if($_POST['extra'] == "anything") {
$sql = "SELECT name, description FROM pubs WHERE (food LIKE '%Yes%' " . getHourValue($_POST['hours']) . ")
OR (food LIKE '%No%' " . getHourValue($_POST['hours']) . ")";
}
else if($_POST['extra'] == "everything") {
$sql = "SELECT name, description FROM pubs WHERE (food LIKE '%Yes%' AND pool LIKE '%Yes%' AND dancing LIKE '%Yes%' AND tv LIKE '%Yes%' "
. getHourValue($_POST['hours']) . ") OR (food LIKE '%No%'
AND pool LIKE '%Yes%' AND dancing LIKE '%Yes%' AND tv LIKE '%Yes%' "
. getHourValue($_POST['hours']) . ")";
}
else {
$sql = "SELECT name, description FROM pubs WHERE (food LIKE '%Yes%' AND " . $_POST['extra'] . " LIKE '%Yes%' " . getHourValue($_POST['hours']) .")
OR (food LIKE '%No%' AND " . $_POST['extra'] . " LIKE '%Yes%' " . getHourValue($_POST['hours']) . ")";
}
}
else if($_POST['extra'] == "anything") {
$sql = "SELECT name, description FROM pubs WHERE food LIKE '%Yes%' "
. getHourValue($_POST['hours']);
}
else if($_POST['extra'] == "everything") {
$sql = "SELECT name, description FROM pubs WHERE food LIKE '%Yes%'
AND pool LIKE '%Yes%' AND dancing LIKE '%Yes%' AND tv LIKE '%Yes%' "
. getHourValue($_POST['hours']);
}
else {
$sql = "SELECT name, description FROM pubs WHERE food LIKE '%Yes%'
AND " . $_POST['extra'] . " LIKE '%Yes%' "
. getHourValue($_POST['hours']);
}
}
else {
if($_POST['food'] == "No") {
if($_POST['extra'] == "anything") {
$sql = "SELECT name, description FROM pubs WHERE (category LIKE '%" . $_POST['category'] . "%' " . getHourValue($_POST['hours']) . "
AND food LIKE '%Yes%') OR (category LIKE '%" . $_POST['category'] . "%' " . getHourValue($_POST['hours']) . " AND food LIKE '%No%')";

}
else if($_POST['extra'] == "everything") {
$sql = "SELECT name, description FROM pubs WHERE (category LIKE '%" . $_POST['category'] . "%'"
. getHourValue($_POST['hours']) . " AND food LIKE '%Yes%' AND pool LIKE '%Yes%' AND dancing LIKE '%Yes%' AND tv LIKE '%Yes%')
OR (category LIKE '%" . $_POST['category'] . "%'"
. getHourValue($_POST['hours']) . " AND food LIKE '%No%' AND pool LIKE '%Yes%' AND dancing LIKE '%Yes%' AND tv LIKE '%Yes%')";
}
else {
$sql = "SELECT name, description FROM pubs WHERE (category LIKE '%" . $_POST['category'] . "%' "
. getHourValue($_POST['hours']) . " AND food LIKE '%Yes%' AND " . $_POST['extra'] . " LIKE '%Yes%') OR (category LIKE '%" . $_POST['category'] . "%' " . getHourValue($_POST['hours']) . "
AND food LIKE '%No%' AND " . $_POST['extra'] . " LIKE '%Yes%')";
}
}
else if($_POST['extra'] == "anything") {
$sql = "SELECT name, description FROM pubs WHERE category LIKE '%" . $_POST['category'] . "%'
AND food LIKE '%Yes%' "
. getHourValue($_POST['hours']);
}
else if($_POST['extra'] == "everything") {
$sql = "SELECT name, description FROM pubs WHERE category LIKE '%" . $_POST['category'] . "%'
AND food LIKE '%Yes%' AND pool LIKE '%Yes%' AND dancing LIKE '%Yes%' AND tv LIKE '%Yes%' "
. getHourValue($_POST['hours']);
}
else {
$sql = "SELECT name, description FROM pubs WHERE category LIKE '%" . $_POST['category'] . "%'
AND food LIKE '%Yes%' AND " . $_POST['extra'] . " LIKE '%Yes%' "
. getHourValue($_POST['hours']);
}
}

спросил(а) 2015-11-11T08:40:00+03:00 4 года, 4 месяца назад
1
Решение
101

Вероятно, вы должны создать какой-то построитель запросов (или использовать существующий из фреймворка). Добавление подготовленных заявлений в ваш выше код делает его более сложным (хотя это не оправдание).

Пример. Вы собираете все условия в массиве, добавляете заполнители для каждого, а затем в PDO Statement привязываете значения.

ПРИМЕЧАНИЕ. Ниже не проверено.

<?php

$sql = 'SELECT name, description FROM pubs';
$where = [];
$params = [];

// If condition
// then add it to where
// $where[] = '(field1 = :field1)';
// $params[':field1'] = $_POST['field1'];

// If another condition
// then add to where
// $where[] = 'field2 = :field2';
// $params[':field2'] = $_POST['field2'];

// Combine where conditions (you may need to implement both AND and OR)
if (!empty($where)) {
$sql .= ' WHERE '.implode(' AND ', $where);
}

// Assuming this is your pdo object
$statement = $pdo->prepare($sql);

// Bind your parameter values
if (!empty($params)) {
foreach ($params as $key => $value) {
$statement->bindValue($key, $value, \PDO::_PARAM_STR);
}
}

// Then fetch the records
$statement->execute();

$result = $statement->fetchAll(PDO::FETCH_ASSOC);

var_dump($result);

ответил(а) 2015-11-11T09:20:00+03:00 4 года, 4 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема