#php #mysql
#php #mysql
Вопрос:
У меня есть следующий отчет php mysql, который работает нормально:
if (isset($_GET['name'])) {
$data = "%".$_GET['name']."%";
$sql = 'SELECT * FROM tbl_clients WHERE fname like ?';
$stmt = $conn->prepare($sql);
$results = $stmt->execute(array($data));
$rows = $stmt->fetchAll();
$error = $stmt->errorInfo();
}
Но я хочу добавить следующее, чтобы он мог проверять столбцы для переменной name:
$sql = 'SELECT * FROM tbl_clients WHERE fname like ? or lname like ?';
Если я изменю это утверждение на приведенное выше, оно выдает ошибку со следующим:
Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in /var/www/www.test.com/search.php on line 38
Ответ №1:
Это довольно очевидно, у вас есть два ?
и только один элемент в массиве, который вы передаете $stmt->execute
$sql = 'SELECT * FROM tbl_clients WHERE fname like :something or lname like :something';
$data = array(':something'=>'SOME VALUE');
$results = $stmt->execute($data);
Комментарии:
1. да, это имеет смысл, но как я смогу настроить оператор sql так, чтобы он мог выполнять поиск в обоих полях, передавая только одно значение?
2. @BradHazelnut первый, который вы используете, является позиционным, то есть первым? является первым элементом в массиве и так далее… Используя имена, вы ищете имена в массиве.
Ответ №2:
В обновленном запросе у вас есть два параметра, но вы передаете только одно значение execute
. Просто устраните последнюю проблему, и она будет работать:
$results = $stmt->execute(array($data, $data));
Комментарии:
1. Конечно, это сработало, но это не так. Это просто грязный патч.
2. @Jorge Использование именованных параметров было бы более элегантным решением, я полагаю, но нет ничего плохого в том, чтобы делать это таким образом.
3. @JakeKing, конечно, здесь это не так важно, но вы бы порекомендовали его для 3 или 4
?
, просто тратя ресурсы. Вы копируете одни и те же данные снова и снова. Хорошо давать новичкам советы по передовым методам, чтобы они их использовали.