我有一个带有三个文本输入(贸易,城市,州)的搜索表。执行搜索时,用户必须至少填写一个字段,但可以选择填写所有三个字段。我还没有完成,但是这是我到目前为止查询数据库的代码:
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不起作用?如何使它在所有这三个方面都能正常工作?
请勿使用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);
}