PHP-код для правильной обработки HTML-запроса - PullRequest
1 голос
/ 19 февраля 2012

Несколько недель подряд я работал над MYSQL и PHP. Я создал музыкальную базу данных с примерно 15 столбцами данных. ВРУЧНУЮ - я могу ЗАПРОСИТЬ базу данных с отличными результатами:

SELECT * FROM $tableName WHERE category RLIKE ('option-choice') and
genre RLIKE ('option-choice') and Sub_genre RLIKE ('option-choice')
and lyrical_theme RLIKE ('option-choice') and lead RLIKE
('option-choice') and tempo RLIKE ('option-choice'); "

Моя доступная HTML-форма имеет NINE раскрывающиеся кнопки, которые я также хочу выполнить, каждая из которых содержит несколько вариантов. Нет переключателей, флажков или нескольких вариантов. Каждое название кнопки выглядит так:

<select id="category" name="category"><option value="" class="header">Category</option>

Через мою HTML-форму и _POST я могу получить любой 1 результат выбора поля, вывод правильно отформатирован в таблице с правильными цветами и т. Д. БОЛЬШОЙ!

Когда я добавляю варианты 2-й, 3-й или 4-й формы, я все равно получаю ВСЕ записи, но НЕ отфильтрованные результаты, как я получаю выше (вручную). Выбор посетителя НЕ 1,2,3, по порядку, но может быть любой их комбинацией, такой как 2,5,7 или 6,7 или 9 и т. Д ....

Мне нужен правильный оператор обработки PHP для создания правильного оператора SELECT (POST ARRAY / IGNORE BLANK CHOICE OPTIONS), чтобы мои усилия стали реальностью. ЛЮБАЯ помощь действительно ценится. Через несколько недель я устал от чтения самостоятельно и не могу дать правильных результатов - сотни проб и ошибок, но по крайней мере я приложил все усилия ... Мне нужна помощь ....! СПАСИБО !!!!

Ответы [ 2 ]

1 голос
/ 19 февраля 2012

Основываясь на ваших комментариях, я вижу несколько проблем: вы используете ИЛИ вместо AND в вашем запросе, который является вашей основной проблемой.И выберет записи, которые имеют ВСЕ от указанных опций;ИЛИ выбирает любые записи, у которых есть какой-либо из параметров, даже если у них нет остальных.

$query1= "SELECT * FROM $tableName 
WHERE category= '$category' AND genre='$genre' AND sub_genre= '$sub_genre' 
LIMIT $start, $limit";

Во-вторых, если я правильно понимаю, вы хотите динамически строить оператор в зависимости от того, какие параметры

Проверьте значение каждого раскрывающегося списка и, если оно имеет значение, добавьте к предложению WHERE

$query1 = "SELECT * FROM $tableName WHERE [some condition thats always required]";
if (!empty ($category))
    $query1 .= "AND category = '$category' ";
if (!empty ($genre))
    $query1 .= "AND genre= '$genre' ";
[etc...]
$query1 .= "LIMIT $start, $limit;"

Если единственными условиями, которые есть в предложении WHERE, являются параметрызатем передайте сначала вам нужно проверить, есть ли переданные опции any , чтобы определить, нужно ли вам добавить ключевое слово "WHERE" в ваш запрос;а затем проверьте, какая из опций включена первой, чтобы вы не включали ключевое слово «И», если нет предыдущего условия для его добавления.Или вы можете обмануть и поставить произвольное условие, которое всегда истинно, например, «WHERE $ table_id> 0» (при условии, что в вашей таблице есть поле id)

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

0 голосов
/ 19 февраля 2012

Спасибо, что указали на сайт. Я думаю, что проблема у вас в том, что вы используете AND для своих условий запроса. Поэтому, когда из формы HTML пользователь выбирает только одно или два поля, скажем Category и Genre, значения во всех остальных полях - это «» (пустая строка). Когда эти пустые значения введены в запрос, соответствующие записи не найдены. Пример того, как может выглядеть запрос:

SELECT * FROM $tableName
WHERE category RLIKE 'Indie'
and genre RLIKE 'Blues'
and Sub_genre RLIKE ''
and lyrical_theme RLIKE ''
and lead RLIKE ''
and tempo RLIKE '';

Решение состоит в том, чтобы проверить, какие непустые поля передаются из формы, и, соответственно, добавить условия WHERE в запрос. Что-то вроде:

<?php
$arrConditions = Array();
if (isset($_POST['category']) && !empty($_POST['category'])) {
    $arrConditions[] = 'category RLIKE "' . $_POST['category'] . '"';
}
if (isset($_POST['genre']) && !empty($_POST['genre'])) {
    $arrConditions[] = 'genre RLIKE "' . $_POST['genre'] . '"';
}
if (isset($_POST['sub_genre']) && !empty($_POST['sub_genre'])) {
    $arrConditions[] = 'Sub_genre RLIKE "' . $_POST['sub_genre'] . '"';
}
/* ADD SIMILAR IF STATEMENTS FOR ALL OTHER FORM FIELDS */

$qryWhere = '';
if (!empty($arrConditions)) { // assuming that there is at least one condition
    $qryWhere = ' WHERE ' . implode(' AND ', $arrConditions);
}
$query = 'SELECT * FROM ' . $tableName . ' ' . $qryWhere;
?>

Надеюсь, вышесказанное имеет смысл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...