参数为空时如何获取所有值

时间:2019-04-23 13:46:03

标签: php mysql

我有一个查询表单,需要从MYSQL的自定义表中获取详细信息。如果该参数留为空白,则应提取所有记录。如果在参数中输入了一个值,则应获取该值的记录。

到目前为止,这是我的代码:

<?php
$host = 'localhost';
$dbname = 'test';
$username = 'test';
$password = 'xxx';
session_start();    
global $wpdb, $current_user; 
$conn = mysqli_connect($host, $username, $password, $dbname);
if (!$conn) {
    die ('Failed to connect to MySQL: ' . mysqli_connect_error());
}
$param_1=mysqli_real_escape_string($conn,$_GET['param_1']);

 if (!empty($param_1)){
  $sql = "SELECT column1 ,column2,column3,column4,column5
            FROM xxx
          WHERE column1='$param_1'";
   } else {
   $sql = 'SELECT column1 ,column2,column3,column4,column5
             FROM xxx';
}

$query = mysqli_query($conn, $sql);

if (!$query) {
    die ('SQL Error: ' . mysqli_error($conn));
}
?>

使用一个参数可以正常工作。我将需要添加更多参数,这些参数也可能为空。

例如

$sql = "SELECT column1 ,column2,column3,column4,column5
            FROM xxx
          WHERE column1='$param_1' AND column2='$param_2";

这些都可以为空。如何在MYSQL中解决此问题?

我的问题是,解决这种情况的最佳方法是什么?

谢谢。

3 个答案:

答案 0 :(得分:1)

您可以像这样继续追加查询:

$sql = "SELECT column1 ,column2,column3,column4,column5
       FROM xxx
       WHERE 1=1 ";

if(!empty($param1)){
 $sql.= "  and column1='$param1'";
}
if(!empty($param2)){
 $sql.= " and column2='$param2'";
}
if(!empty($param3)){
 $sql.= "  and column3='$param3'";
}

注意:像这样传递参数将导致SQL注入,请使用绑定来传递参数以避免SQL注入。 Here is a good read about it.

答案 1 :(得分:1)

您可以按照以下步骤操作

<?php
$host = 'localhost';
$dbname = 'test';
$username = 'test';
$password = 'xxx';
session_start();    
global $wpdb, $current_user; 
$conn = mysqli_connect($host, $username, $password, $dbname);
if (!$conn) {
    die ('Failed to connect to MySQL: ' . mysqli_connect_error());
}

$whereArr=[];
if(isset($_GET['param_1'])){
   $whereArr[]="column1=" . mysqli_real_escape_string($conn,$_GET['param_1']);
}

if(isset($_GET['param_2'])){
   $whereArr[]="column2=" . mysqli_real_escape_string($conn,$_GET['param_2']);
}

if(isset($_GET['param_3'])){
   $whereArr[]="column3=" . mysqli_real_escape_string($conn,$_GET['param_3']);
}

$whereStr='';
if(count($whereArr)>0){
      $whereStr="WHERE " . implode(" AND ",$whereArr);
}

  $sql = "SELECT column1 ,column2,column3,column4,column5
            FROM xxx " . $whereStr;

$query = mysqli_query($conn, $sql);

if (!$query) {
    die ('SQL Error: ' . mysqli_error($conn));
}
?>

检查上面演示的每个参数,将它们放在数组中。

然后检查是否设置了数组,如果是,则创建一个where字符串并将其附加到查询中。

即使未设置任何参数,您的查询也将在没有where子句的情况下运行。

答案 2 :(得分:0)

您可以执行以下操作来优化代码,

$getArr = array_filter($_GET);
// checking sql injection
$getArr = array_map(function ($v) use ($conn) {
    return mysqli_real_escape_string($conn, $v);
}, $getArr);
$temp = [];
// fetching numbers for that key
foreach ($getArr as $key => $value) {
    $temp[$key] = preg_replace('/[^\d]/', '', $key);
}
$str = '';
// creating condition for data fetched in get
array_walk($temp, function ($item, $key) use (&$str, $getArr) {
    $str .= " column$item = '" . $getArr[$key] . "' AND ";
});
// raw query
$sql = 'SELECT column1 ,column2,column3,column4,column5 FROM xxx';
// if not empty string
if (!empty($str)) {
    $sql .= rtrim($str,'AND ');
}
echo $sql;die;