当一些输入参数使用值'all'作为通配符时,如何编写php代码(使用准备好的语句)从mysql db返回行?

pvabu6sv  于 2021-06-23  发布在  Mysql
关注(0)|答案(1)|浏览(306)

我是一个php新手,正在使用php和mysql创建一个webform(我有一些mysql方面的经验,但最多是中级水平)。前端webform允许用户输入以下4个参数的值:流派、 composer 、乐器和合奏。这些参数中的每一个都可以取一个适当的名称(例如,“古典”表示流派,“小提琴”表示乐器等),或者取一个称为“all”的值。如果为“all”,那么mysql数据库将返回该参数或多个参数的所有行(当然,对其他不是“all”的参数进行过滤)。我还想用准备好的语句编写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\u stmt\ux命令的执行无效。我不知道那个错误是什么,也不知道如何修正它。
如果有人能告诉我如何编写where子句,在一个或多个参数值为“all”时返回所需的行,我将不胜感激。提前谢谢。

ffx8fchx

ffx8fchx1#

我更愿意使用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'时才包括列查询。

相关问题