Как написать код PHP (используя подготовленные операторы) для возврата строк из БД MySQL, когда некоторые входные параметры используют значение «все» в качестве подстановочного знака? - PullRequest
0 голосов
/ 29 мая 2018

Я новичок в PHP и работаю над созданием веб-формы с использованием PHP и MySQL (у меня есть некоторый опыт работы с MySQL, но в большинстве случаев я на промежуточном уровне).Интерфейсная веб-форма позволяет пользователю вводить значения следующих 4 параметров: жанр, композитор, инструмент и ансамбль.Каждый из этих параметров может принимать либо собственное имя (например, «классический» для жанра, «скрипка» для инструмента и т. Д.), Либо значение, называемое «все».Если «все», то база данных MySQL будет возвращать все строки этого параметра или параметров (отфильтрованные, конечно, по другим параметрам, которые не являются «всеми»).Я также хочу написать PHP-коды, используя подготовленные операторы.

Итак, я написал следующий код PHP:

// The variables take the values entered by user in the webform
$genre = htmlspecialchars($_POST['genre']);
$composer = htmlspecialchars($_POST['composer']);
$instrument = htmlspecialchars($_POST['instrument']); 
$ensemble = htmlspecialchars($_POST['ensemble']);

// Prepare the MySQL query and execute it using prepared statements
$sql_query = "SELECT db_genre, db_composer, db_instrument, db_ensemble FROM recording_metadata
WHERE (CASE WHEN ?='all' THEN true ELSE column=genre END) AND 
      (CASE WHEN ?='all' THEN true ELSE column=composer END) AND 
      (CASE WHEN ?='all' THEN true ELSE column=instrument END) AND 
      (CASE WHEN ?='all' THEN true ELSE column=ensemble END)";  
$stmt = mysqli_stmt_init($con); //$con defined earlier by mysqli_connect
if (mysqli_stmt_prepare($stmt, $sql_query)) {
    mysqli_stmt_bind_param($stmt, "ssss", $genre, $composer, $instrument, $ensemble);
}
mysqli_stmt_execute($stmt);
mysqli_stmt_store_result($stmt);
mysqli_stmt_bind_result($stmt, $genre, $composer, $instrument, $ensemble);

Я только знаю, что предложение WHERE написано неправильно, потому что какая-то ошибка в нем делает недействительным выполнение последующих команд mysqli_stmt_ *.Я не знаю, что это за ошибка или как ее исправить.

Буду признателен, если кто-нибудь подскажет мне, как написать предложение WHERE, которое будет возвращать нужные строки, когда одно или несколько значений параметра равно "all",Заранее спасибо.

1 Ответ

0 голосов
/ 29 мая 2018

Я бы предпочел изменить оператор, используя PHP вместо команды MySQL:

// Prepare the WHERE clause using PHP
$genre = htmlspecialchars($_POST['genre']);
$composer = htmlspecialchars($_POST['composer']);
$instrument = htmlspecialchars($_POST['instrument']); 
$ensemble = htmlspecialchars($_POST['ensemble']);

$where = ' 1 = 1';  //First condition which is always true

if ($genre != 'All') {
  $where .= " AND db_genre = $genre"; //Append to the $where variables if genre is not 'All'
}

if ($composer != 'All') {
  $where .= " AND db_composer = $composer";
}

if ($instrument != 'All') {
  $where .= " AND db_instrument = $instrument";
}

if ($ensemble != 'All') {
  $where .= " AND db_ensemble = $ensemble";
}

// Prepare the SQL query based on the variable above
$sql_query = "SELECT db_genre, db_composer, db_instrument, db_ensemble FROM recording_metadata $where";

Тогда запрос столбца будет включен только в том случае, если ввод не «All».

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