sentencias query preparadas ejemplos consultas consulta php pdo limit sql-parametrized-query

php - query - Consulta parametrizada de PDO y cláusula `LIMIT`-no funciona



php pdo prepare (2)

De forma predeterminada, bindValue vincula un valor de cadena pero el límite es un entero, por lo tanto, use PDO :: PARAM_INT

$query->bindValue(1, $cnt, PDO::PARAM_INT);

Esta pregunta ya tiene una respuesta aquí:

Tengo una consulta como esta:

SELECT imageurl FROM entries WHERE thumbdl IS NULL LIMIT 10;

Funciona perfectamente con PDO y MySQL Workbench (devuelve 10 URL como yo quiera).

Sin embargo, intenté parametrizar LIMIT con PDO:

$cnt = 10; $query = $this->link->prepare(" SELECT imageurl FROM entries WHERE imgdl is null LIMIT ? "); $query->bindValue(1, $cnt); $query->execute(); $result = $query->fetchAll(PDO::FETCH_ASSOC);

Eso devuelve matriz vacía.


Acabo de probar un montón de casos. Estoy usando PHP 5.3.15 en OS X y consultando MySQL 5.6.12.

Cualquier combinación funciona si configuras:

$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

Todo el trabajo siguiente : puede usar una int o una cadena; no necesita usar PDO :: PARAM_INT.

$stmt = $dbh->prepare("select user from mysql.user limit ?"); $int = intval(1); $int = ''1''; $stmt->bindValue(1, 1); $stmt->execute(); print_r($stmt->fetchAll()); $stmt->bindValue(1, ''1''); $stmt->execute(); print_r($stmt->fetchAll()); $stmt->bindValue(1, 1, PDO::PARAM_INT); $stmt->execute(); print_r($stmt->fetchAll()); $stmt->bindValue(1, ''1'', PDO::PARAM_INT); $stmt->execute(); print_r($stmt->fetchAll()); $stmt->bindParam(1, $int); $stmt->execute(); print_r($stmt->fetchAll()); $stmt->bindParam(1, $string); $stmt->execute(); print_r($stmt->fetchAll()); $stmt->bindParam(1, $int, PDO::PARAM_INT); $stmt->execute(); print_r($stmt->fetchAll()); $stmt->bindParam(1, $string, PDO::PARAM_INT); $stmt->execute(); print_r($stmt->fetchAll());

También puede olvidarse de bindValue () o bindParam (), y en su lugar pasar una int o una cadena en un argumento de matriz para ejecutar (). Esto funciona bien y hace lo mismo, pero usar una matriz es más simple y, a menudo, más conveniente de codificar.

$stmt = $dbh->prepare("select user from mysql.user limit ?"); $stmt->execute(array($int)); print_r($stmt->fetchAll()); $stmt->execute(array($string)); print_r($stmt->fetchAll());

Si habilita preparaciones emuladas, solo funciona una combinación: debe usar un entero como parámetro y debe especificar PDO :: PARAM_INT:

$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, true); $stmt = $dbh->prepare("select user from mysql.user limit ?"); $stmt->bindValue(1, $int, PDO::PARAM_INT); $stmt->execute(); print_r($stmt->fetchAll()); $stmt->bindParam(1, $int, PDO::PARAM_INT); $stmt->execute(); print_r($stmt->fetchAll());

Pasar valores a execute () no funciona si tiene habilitados los prepares habilitados.