Member 14093672 Ответов: 1

Ошибка PDO bindparam при попытке выполнения


Всем Привет,

На мой следующий вопрос PDO bindparam показывает ошибку:

Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' ' order by 'emp_no' 'asc' limit 0, 10' at line 1 in C:\xxx\ajaxfile.php:41 Stack trace: #0 C:\xxx\ajaxfile.php(41): PDOStatement->execute() #1 {main} thrown in C:\xxx\ajaxfile.php on line 41


Что я уже пробовал:

$stmt = $con->prepare("select * from employees WHERE 1 ? order by ? ? limit ?, ?");

$stmt->bindParam(1, $searchQuery, PDO::PARAM_STR);
$stmt->bindParam(2, $columnName, PDO::PARAM_STR);
$stmt->bindParam(3, $columnSortOrder,PDO::PARAM_STR);
$stmt->bindParam(4, $row,PDO::PARAM_INT);
$stmt->bindParam(5, $rowperpage,PDO::PARAM_INT);

$stmt->execute();
$data1 = $stmt->fetchAll();

Member 14093672

Если я попробую это сделать:

$stmt = $con->prepare("select * from employees WHERE 1" ? "order by" ? ? "limit" ?, ? );


Я получаю эту ошибку.

Parse error: syntax error, unexpected '?' in 

Richard MacCutchan

Что такое "WHERE 1" это должно означать?

1 Ответов

Рейтинг:
0

Chris Copeland

Помните, что при такой привязке параметров адаптер базы данных будет экранировать все значения, которые были помещены в запрос. В этом примере вы пытаетесь связать $searchQuery, $columnName и $columnSortOrder как фактические значения SQL. Это не сработает, так как привязка будет ускользать от них (в данном случае, окружая их одинарными кавычками.)

Чего ты ждешь:

select * from employees where 1 $searchQuery order by $columnName $columnSortOrder limit $row, $rowperpage

Что происходит из - за побега:
select * from employees where 1 '$searchQuery' order by '$columnName' '$columnSortOrder' limit $row, $rowperpage

Вместо этого убедитесь, что вы сами заполняете 3 строковые переменные (так что вам гарантировано, что не будет никакой SQL-инъекции), а затем просто поместите их в строковую часть метода:
select * from employees where 1 $searchQuery order by $columnName $columnSortOrder limit ?, ?

Кроме того, как уже упоминал Ричард, имея where 1 это немного странно.


Member 14093672

Прежде всего, спасибо Вам, Крис и Ричард, и следующее прекрасно работает.

1.
Скрыть   скопировать код

<pre>$stmt = $con->prepare("select * from employee where 1 $searchQuery order by $columnName $columnSortOrder limit ?, ?");$stmt->bindParam(1, $row,PDO::PARAM_INT);$stmt->bindParam(2, $rowperpage,PDO::PARAM_INT);


2. Общее количество записей работает нормально.

Скрыть   скопировать код
$totalRecordwithFilter = $con->query("SELECT count(*) from employee WHERE 1 $searchQuery")->fetchColumn();



Однако в отношении того, где 1 выглядит странно , это было методом проб и ошибок, и я забыл, где я получил это место 1. Прошу прощения за это, но в тот момент, когда вы берете "1" , откуда
предложение, запрос перестает работать, и я получаю следующую ошибку? не знаю почему, но это немного странно и странно для меня тоже.

Скрыть   скопировать код
Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 1 in C:\fetch.php:27 Stack trace: #0 C:\fetch.php(27): PDO->query('SELECT count(*)...') #1 {main} thrown in C:\fetch.php on line 27


а строка 27-это ... без того, где 1

Скрыть   скопировать код
$totalRecordwithFilter = $con->query("SELECT count(*) from employee WHERE  $searchQuery")->fetchColumn();

Chris Copeland

Извините, что не вернулся раньше, я был занят в декабре! Вполне вероятно, что $searchQuery может быть пустым или нулевым, и поэтому запрос будет заканчиваться на "WHERE", что недопустимо. В идеале вы должны проверить, действительно ли поисковый запрос имеет значение, и, возможно, соответствующим образом скорректировать содержимое:

if ($searchQuery != '') {  $searchQuery = ' WHERE '.$searchQuery;}


Затем вы можете использовать его в своем запросе, который будет включать предложение только в том случае, если оно было заполнено. Если бы вы оставили это "где 1", то переменная $searchQuery должна была бы начинаться с " и "