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

Итак, я новичок в 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']);
}
}

0

Решение

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

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

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

<?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);
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]