繁体   English   中英

PHP 带有搜索和运算符的 CRUD 操作

[英]PHP CRUD operations with search, and operator

我在下面使用 function (我从互联网上得到的)从数据库中获取数据并且工作正常。 如果我使用 where 和搜索条件不能正常工作或者我错过了一些东西。 任何人都可以帮我解决这个问题。

public function getRows($table,$conditions = array()){
    $sql = 'SELECT ';
    $sql .= array_key_exists("select",$conditions)?$conditions['select']:'*';
    $sql .= ' FROM '.$table;
    if(array_key_exists("where",$conditions)){
        $sql .= ' WHERE ';
        $i = 0;
        foreach($conditions['where'] as $key => $value){
            $pre = ($i > 0)?' AND ':'';
            echo $sql .= $pre.$key." = '".$value."'";
            $i++;
        }
    }
    if(array_key_exists("search",$conditions)){
        $sql .= (strpos($sql, 'WHERE') !== false)?'':' WHERE ';
        $i = 0;
        foreach($conditions['search'] as $key => $value){
            $pre = ($i > 0)?' OR ':'';
            $sql .= $pre.$key." = '".$value."'";
            $i++;
        }
    }
    if(array_key_exists("order_by",$conditions)){
        $sql .= ' ORDER BY '.$conditions['order_by']; 
    }

    if(array_key_exists("start",$conditions) && array_key_exists("limit",$conditions)){
        $sql .= ' LIMIT '.$conditions['start'].','.$conditions['limit']; 
    }elseif(!array_key_exists("start",$conditions) && array_key_exists("limit",$conditions)){
        echo $sql .= ' LIMIT '.$conditions['limit']; 
    }

    $query = $this->conn->prepare($sql);
    $query->execute();

    if(array_key_exists("return_type",$conditions) && $conditions['return_type'] != 'all'){
        switch($conditions['return_type']){
            case 'count':
                $data = $query->rowCount();
                break;
            case 'single':
                $data = $query->fetch(PDO::FETCH_ASSOC);
                break;
            default:
                $data = '';
        }
    }else{
        if($query->rowCount() > 0){
            $data = $query->fetchAll();
        }
    }
    return !empty($data)?$data:false;
}

Function 与 where 和 Search 条件一起使用

if(!empty($_POST['customer_number'])) {    
    $ajaxData = $auth_user->getRows(
        'tablename', 
        array('where' => array('fieldName'=>$doc)),
        array('search'=> array('fieldname1'=>$_POST['customer_number'], 'fieldname2'=>$_POST['customer_number']))
    );
}

上面代码的结果是

SELECT * FROM tablename WHERE cust_consum_type = '1'

预期结果是。

select * from tablename where fieldName='somevalue' and fieldname1='somevalue' OR fieldname2='somevalue'

帮我解决这个问题。

这个 function 在很多层面上都是错误的,首先是严重不安全。

相反,使用香草 PDO。 以这种方式制作您的 function

public function getRows($sql,$input = array()){
    $stmt = $this->conn->prepare($sql);
    $stmt->execute($input);
    return $stmt;
}

然后立即使用占位符编写查询,在 pparameters 中传递数据并获得结果:

$sql = "select * from tablename where fieldName=:fieldName 
       and (fieldname1=:fieldName1 OR fieldname2=:fieldName2)";
$input = ['fieldName'=>$doc,
         'fieldname1'=>$_POST['customer_number'],
         'fieldname2'=>$_POST['customer_number']];
$data = $db->getRows($sql, $input)->fetchAll();

它将是安全的、干净的、始终工作的、安全的、灵活的、不受 SQL 注入和语法错误的影响。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM