Requête préparée et PDO

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Requête préparée et PDO

par jojolapine » 05 déc. 2006, 11:26

oui la partie where de la requête est bien prise en compte, c'est seulement les requêtes préparées qui ne passent pas... :(
pour ce code:
<?php
$dsn = 'mysql:host=mysql20.corecluster.net; dbname=concertation';
$user = 'concertation';
$passWd = 'kokeliko';
try{
    $cnx = new PDO($dsn, $user, $passWd);
   // Activation du mode de gestion des erreurs par levée d'exception
    $cnx->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} 
catch(PDOExecption $ePDO){
    die ('<h2>ERR de Connexion :</h2>' . $ePDO->getMessage());
}
echo '<h2>Connexion OK !</h2>';

//requête directe
try{
    $stmt = $cnx->query('SELECT id, Auteur, Titre  FROM livres WHERE id <= 20');
}
catch (PDOException $e){
    die ('<h2>ERR de pr&eacute;paration de Qry :</h2>' . $e->getMessage());
}
$_120=$stmt->fetchAll();
print_r($_120);

//requête préparée
try{
    $stmt = $cnx->prepare('SELECT id, Auteur, Titre  FROM livres WHERE id <= :id',array(PDO::ATTR_CURSOR, PDO::CURSOR_FWDONLY));
}
catch (PDOException $e){
    die ('<h2>ERR de pr&eacute;paration de Qry :</h2>' . $e->getMessage());
}
/* Exécute une requête préparée en passant un tableau de valeurs */

$stmt->execute(array(':id' => 20));
$_20 = $stmt->fetchAll();


print_r($_20);

?> 
voici le résultat: http://concertation.puffins.fr/essaiPDO5.php
(hors encodage) la première requête fonctionne, et pas la deuxième qui devrait être identique!

par Ajoloca » 05 déc. 2006, 02:36

Bonsoir,

As-tu trouvé QQ chose au niveau des configs ?
Moi à part les versions je vois pas grande chose.

As-tu essayé de passer ta requête en direct par '$cnx->query()' pour voir s'il tient compte de la clause 'WHERE' ?

C'est tout de même biz.... cette histoire.

par jojolapine » 01 déc. 2006, 21:53

c'est bon j'ai trouvé tout seul:
http://www.joloca.eu/~jose/info.php

par jojolapine » 01 déc. 2006, 21:51

ben j'ai un jolie 404 not found sur ton info.php qui se trouve en localhost :wink:

par Ajoloca » 01 déc. 2006, 21:49

t'a crompé on dirait ? O:)
Je saisis pas :?:

par jojolapine » 01 déc. 2006, 21:48

t'a crompé on dirait ? O:)

par Ajoloca » 01 déc. 2006, 21:43

Re,

Voilà le mien (à deux on véra mieux)

par jojolapine » 01 déc. 2006, 21:38

j'ai bien l'impression que ça vient des configs oui... :cry:
je redonne le lien de mon phpinfo:
http://puffins.fr/phpinfo.php

par Ajoloca » 01 déc. 2006, 21:35

Re,

Avec ce code
<?php
$dsn = 'mysql:host=localhost; dbname=test';
$user = '****';
$passWd = '****';
try{
    $cnx = new PDO($dsn, $user, $passWd);
    // Activation du mode de gestion des erreurs par levée d'exception
    $cnx->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
}
catch(PDOExecption $ePDO){
    die ('<h2>ERR de Connexion :</h2>' . $ePDO->getMessage());
}
echo '<h2>Connexion OK !</h2>';
try{
    $stmt = $cnx->prepare('SELECT id, Auteur, Titre  FROM livres WHERE id <= :id',array(PDO::ATTR_CURSOR, PDO::CURSOR_FWDONLY));
}
catch (PDOException $e){
    die ('<h2>ERR de pr&eacute;paration de Qry :</h2>' . $ePDO->getMessage());
}
/* Exécute une requête préparée en passant un tableau de valeurs */

$stmt->execute(array(':id' => 20));
$_20 = $stmt->fetchAll();

echo '<pre>';
print_r($_20);
echo '</pre>';
?> 
J'ai ce résultat

Code : Tout sélectionner

Connexion OK ! Array ( [0] => Array ( [id] => 1 [0] => 1 [Auteur] => Olivier Miquel [1] => Olivier Miquel [Titre] => Le vertige de l'ange [2] => Le vertige de l'ange ) [1] => Array ( [id] => 7 [0] => 7 [Auteur] => Miguel Delibes [1] => Miguel Delibes [Titre] => L'hérétique [2] => L'hérétique ) )
Vien sur l'affichage des accents n'est pas bon (Pas d'entête HTML et la base est en utf8)

Donc ton code n'a pas l'air d'être en cause, on va se tourner vers les configs (MySQL et PHP)

par jojolapine » 01 déc. 2006, 20:54

j'ai remis le :id et la gestion des erreurs, elle fonctionne, si je met SLECT à la place de SELECT par exemple, j'ai ceci:
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SLECT id, Auteur, Titre FROM livres WHERE id <= ?' at line 1
mais si je fait une requête correcte, aucune erreur, aucun résultat :cry:

par Ajoloca » 01 déc. 2006, 20:50

Bonsoir,

Une petite erreur dans ta requête
'SELECT id, Auteur, Titre  FROM livres WHERE id <= 100'
Tu n'as pas de paramètre nommé ou '?'
Ça devrait être QQ chose du style
'SELECT id, Auteur, Titre  FROM livres WHERE id <= :id'
Tu ne spécifies pas le mode de gestion des erreurs pour PDO donc il utilise le mode par défaut (pas d'aafichage).
Même si tu englobes tes instructions dans des blocks try/catch aucune exception ne sera levée.

Pour utiliser les exception tu dois donc le spécifier, QQ chose du style
try{
    $cnx = new PDO($dsn, $user, $passWd);
   // Activation du mode de gestion des erreurs par levée d'exception
	$cnx->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} 

Requête préparée et PDO

par jojolapine » 01 déc. 2006, 19:31

Bonjour à tous,
je suis en train d'essayer d'apprivoiser PDO, c'est pas facile, mais ça vient doucement...
ET là je m'attaque aux requêtes préparées... et .... ça bloque!
pour une requête qui marche dans phpmyadmin, je n'ai aucun résultat, un array vide... :cry: , voici le code que j'ai utilisé:
<?php
$dsn = 'mysql:host=xxx; dbname=xxx';
$user = 'xxxx';
$passWd = 'xxxx';
try{
    $cnx = new PDO($dsn, $user, $passWd);
}
catch(PDOExecption $ePDO){
    die ('<h2>ERR de Connexion :</h2>' . $ePDO->getMessage());
}
echo '<h2>Connexion OK !</h2>';
try{
    $stmt = $cnx->prepare('SELECT id, Auteur, Titre  FROM livres WHERE id <= 100',array(PDO::ATTR_CURSOR, PDO::CURSOR_FWDONLY));
}
catch (PDOException $e){
    die ('<h2>ERR de pr&eacute;paration de Qry :</h2>' . $ePDO->getMessage());
}
/* Exécute une requête préparée en passant un tableau de valeurs */

$stmt->execute(array(':id' => 20));
$_20 = $stmt->fetchAll();


print_r($_20);

?> 
je sais pas d'oèu ça peut venir... :?