оператор php mysql не работает

#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 ? , просто тратя ресурсы. Вы копируете одни и те же данные снова и снова. Хорошо давать новичкам советы по передовым методам, чтобы они их использовали.