Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 当一些输入参数使用值';全部';作为通配符?_Php_Mysql_Prepared Statement_Wildcard - Fatal编程技术网

Php 当一些输入参数使用值';全部';作为通配符?

Php 当一些输入参数使用值';全部';作为通配符?,php,mysql,prepared-statement,wildcard,Php,Mysql,Prepared Statement,Wildcard,我是一名PHP新手,正在努力使用PHP和MySQL创建一个webform(我对MySQL有一些经验,但最多只是中级)。前端Web表单允许用户输入以下4个参数的值:流派、作曲家、乐器和合奏。这些参数中的每一个都可以取一个适当的名称(例如,“古典”表示流派,“小提琴”表示乐器等),或者取一个称为“全部”的值。如果为“all”,则MySQL数据库将返回该参数或多个参数的所有行(当然,对不是“all”的其他参数进行过滤)。我还想使用准备好的语句编写PHP代码 因此,我编写了以下PHP代码: // The

我是一名PHP新手,正在努力使用PHP和MySQL创建一个webform(我对MySQL有一些经验,但最多只是中级)。前端Web表单允许用户输入以下4个参数的值:流派、作曲家、乐器和合奏。这些参数中的每一个都可以取一个适当的名称(例如,“古典”表示流派,“小提琴”表示乐器等),或者取一个称为“全部”的值。如果为“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_stmt_*命令的执行无效。我不知道那个错误是什么,也不知道如何修复它


如果有人能告诉我如何编写WHERE子句,当一个或多个参数值为“all”时,该子句将返回所需的行,我将不胜感激。提前感谢。

我宁愿使用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";

然后,只有当输入不是“全部”时,才会包含列查询。

在那里使用
htmlspecialchars
的目的是什么?这是一种很好的方法,但从准备好的查询到盲目插入用户提供的数据的查询是一个倒退,并且会打开SQL注入。你应该用预先准备好的查询重写答案。谢谢,阿什拉夫。我知道你在这里做了什么,这确实是一个非常巧妙的方式。但正如Nick提到的,这可能导致SQL注入。我希望找到一种更安全的方法来写WHERE子句。你好,尼克,你将如何重写WHERE子句?谢谢。我是个新手,这种事先准备好的陈述对我来说是新的东西。。。谢谢你的评论。