PDO使用bindValue()和可选值

问题描述 投票:0回答:1

我有一个带有三个文本输入(贸易,城市,州)的搜索表。执行搜索时,用户必须至少填写一个字段,但可以选择填写所有三个字段。我还没有完成,但是这是我到目前为止查询数据库的代码:

 function query_database($person, $trade='', $city='', $state='') {
    include("connection.php");
    if($trade != " ") {
       $sql = "SELECT * FROM $person WHERE trade1 LIKE :trade OR trade2 LIKE :trade OR trade3 LIKE :trade";
    }
    else if($city != " ") {
       $sql = "SELECT * FROM $person WHERE city LIKE :city";  
    }
    else if($state != " ") {
       $sql = "SELECT * FROM $person WHERE state LIKE :state";  
    }

    $results = $db->prepare($sql); 
        $results->bindValue(':city', $city);
        $results->bindValue(':state', $state);
        $results->bindValue(':trade', $trade);

    $results->execute();
        $data = $results->fetchAll();

        if($data) {
             print_r($data);
        }

为了测试这一点,我使用以下参数调用了该函数:

query_database('master_tradesmen', 'plumbing', ' ', ' ');
query_database('master_tradesmen', ' ', 'New York', ' ');
query_database('master_tradesmen', ' ', ' ', 'WI');

第一个函数调用产生了结果,但是后两个给了我以下错误:

SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens

为什么它与$ trade一起使用,但对$ city或$ state不起作用?如何使它在所有这三个方面都能正常工作?

php pdo
1个回答
0
投票

请勿使用bindValue()execute()方法可以将值作为参数数组。因此,请在if块中创建该数组。

function query_database($person, $trade='', $city='', $state='') {
    include("connection.php");
    if($trade != " ") {
        $sql = "SELECT * FROM $person WHERE trade1 LIKE :trade OR trade2 LIKE :trade OR trade3 LIKE :trade";
        $params = [':trade' => $trade];
    }
    elseif($city != " ") {
        $sql = "SELECT * FROM $person WHERE city LIKE :city";
        $params = [':city' => $city];
    }
    elseif($state != " ") {
        $sql = "SELECT * FROM $person WHERE state LIKE :state";  
        $params = [':state' => $state];
    }

    $results = $db->prepare($sql); 
    $results->execute($params);
    $data = $results->fetchAll();

    if($data) {
        print_r($data);
    }
© www.soinside.com 2019 - 2024. All rights reserved.