Итак, я новичок в 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']);
}
}
Вам, вероятно, следует создать какой-нибудь конструктор запросов (или использовать существующий из фреймворка). Добавление подготовленных выражений в приведенный выше код усложняет задачу (хотя это не оправдание).
Пример: вы собираете все условия в массив, вводите заполнители для каждого из них, затем в операторе 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);
Других решений пока нет …