2017-06-22 1 views
2

Je veux passer un var GET dans la requête pour définir le OFFSET.PDO param lit comme une chaîne et non un int

try { 

    $sql_offset = isset($_GET['offset']) ? $_GET['offset'] : 0; 

    $main_query = "SELECT * FROM Orders 
       LIMIT 150 OFFSET :offset"; 

    $result = $db->prepare($main_query); 
    $result->bindParam(':offset', $sql_offset, PDO::PARAM_INT); 
    $result->execute(); 

} catch (Exception $e) { 

    $error = $e->getMessage(); 
    echo "<h2>".$error."</h2>"; 
    die(); 

} 

La requête échoue et le message d'erreur est reçu:

SQLSTATE [42000]: Syntaxe violation d'erreur ou d'accès: 1064 Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de '' 450 '' à la ligne 2

Remarque: Si je place 450 directement dans la requête, cela fonctionne très bien.

Il me semble que le problème est qu'il lit le param comme une chaîne '450' et pas un int 450. J'ai essayé de résoudre cela avec le PDO::PARAM_INT - n'a pas aidé.
J'ai analysé la valeur avec (int)$sql_offset et int_val($sql_offset) et n'a pas aidé. Signification, je recevais toujours le même message d'erreur.

Est-ce que j'ai raison? Le problème est-il considéré comme une chaîne? Si oui, comment puis-je réparer?
Ou y at-il un problème différent ici?

+0

Essayez cette '$ main_query = "SELECT * FROM Commandes LIMIT: offset, 150";' '$ –

+2

Essayez result-> bindValue (': offset ', (int) $ sql_offset, PDO :: PARAM_INT); ' –

+0

Utilisez-vous des instructions préparées natives ou émulées? –

Répondre

0

Essayez de parser valeur int puis vérifiez:

$sql_offset = (int)(isset($_GET['offset']) ? $_GET['offset'] : 0);