2016-04-13 4 views
0

Я строю CRUD с чистым драйвером PHP + PDO Mysql.Проблемы с привязкой параметров PDO

У меня есть страница, в которой перечислены данные, содержащиеся в таблице БД, и я хочу реализовать некоторые фильтры, но я привязан к привязкам к PDO с динамическим запросом.

Например, этот код хорошо работает с $_GET["op"] и без него.

$params = []; 
$pag_query = "SELECT COUNT(*) FROM cells WHERE 1 "; 

if(!empty($_GET["op"])){ 
    $pag_query .= "AND op=:op "; 
    $params["op"] = $_GET["op"]; 
} 

$stmt = db()->prepare($pag_query); 
$stmt->execute($params); 

$n_rows = $stmt->fetchColumn(); 

Но я не могу заставить этот запрос работать.

<?php 

//some logic here to get $limit and $offset 

$params["limit"] = $limit; 
$params["offset"] = $offset; 
$tbl_query = "SELECT * FROM cells WHERE 1 "; 

if(!empty($_GET["op"])){ 
    $tbl_query .= "AND op=:op "; 
    $params["op"] = $_GET["op"]; 
} 

$tbl_query .= "ORDER BY cid LIMIT :limit OFFSET :offset"; 

//Prepare the query 
$stmt = db()->prepare($tbl_query); 
$stmt->execute($params); 

$table = $stmt->fetchAll(); 

Это сообщение дает мне сообщение об ошибке.

Предупреждение: PDOStatement :: execute(): SQLSTATE [42000]: Ошибка синтаксиса или нарушение доступа: 1064 У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования около '' 20 'OFFSET' 0 '' в строке 1 в C: \ xampp \ htdocs \ celldb \ manage.php в строке 64

Если я имитировать запрос на PhpMyAdmin это работает хорошо, и это также работает, если удалить if(!empty($_GET["op"]) дело и передать $limit и $offset использованием $stmt->bindParam(':offset', $offset, PDO::PARAM_INT);

+1

'$ pag_query' =' $ tbl_query' – cmorrissey

+0

я написал здесь не так, но в моем коде был прав: P –

+0

удивительно. .. переименовывать код вместо копирования и вставки :) – cmorrissey

ответ

2

Если вы внимательно посмотрите на сообщение об ошибке, это дает вам ответ:

вблизи '' 20 'OFFSET' 0 ''

Параметры представляют собой обе строки, в которых ожидаются целые числа. А так как documentation for PDOStatement::execute объясняет:

Все значения рассматриваются как PDO :: PARAM_STR.

Вот почему вы должны явно определить их как целые числа с:

$stmt->bindParam(':limit', $limit, PDO::PARAM_INT); 
$stmt->bindParam(':offset', $offset, PDO::PARAM_INT); 
+0

var_dump обеих переменных: 'int (20) int (0)', это не проблема –

+0

@ClaudioKing My bad , Я обновил ответ. Вам нужно явно определить целые числа как таковые в таких случаях. – Oldskool

+0

Как это сделать, если у меня есть предложения 5/6, например 'if (! Empty ($ _ GET [" op "]))' с параметрами смешанных типов (int, string и floats)? –