2011-03-07 4 views
0

J'essaie d'apprendre à utiliser PDO au lieu de MySQLi pour l'accès à la base de données et j'ai du mal à sélectionner les données de la base de données. Je veux utiliser:

$STH = $DBH->query('SELECT * FROM ratings WHERE title=$title ORDER BY date ASC'); 
$STH->setFetchMode(PDO::FETCH_ASSOC); 

while($row = $STH->fetch()) { 
    echo $row['title']; 
} 

mais je reçois cette erreur:

Fatal error: Call to a member function setFetchMode() on a non-object in /home/owencont/public_html/owenstest.com/ratemystudents/index.php on line 6

Si je prends la déclaration où il fonctionne très bien. Comment puis-je sélectionner une ligne en fonction de si sa valeur correspond à une variable?

Merci,

Owen

Répondre

2

Il s'agit probablement d'une erreur de syntaxe SQL, car vous avez oublié de citer $title. Il a fini comme bareword dans la requête (même pas interpolé comme une chaîne), résultant en une erreur. Et votre connexion PDO n'a pas été configurée pour signaler les erreurs. Utilisation -> quote() sur des arguments avant la -> query():

$title = $DBH->quote($title); 
$STH = $DBH->query("SELECT * FROM ratings WHERE title=$title "); 

Ou mieux encore, utilisez SQL paramétrées:

$STH = $DBH->prepare("SELECT * FROM ratings WHERE title=? "); 
$STH->execute(array($title)); 
+0

Cela ne devrait-il pas fonctionner alors? \t $ title = 'le titre'; \t \t $ title = $ dbh- quote> (titre de $); \t $ STH = $ DBH-> prepare ("SELECT * FROM classements WHERE titre =? ORDER BY date ASC"); \t $ STH-> execute (array ($ title)); \t \t while ($ row = $ sth-> fetch (AOP :: FETCH_ASSOC)) { \t \t echo $ row [ 'title']; \t \t} –

+0

@Owen: Non, faire que l'un des deux. Soit -> en citant, ou '? 'En liant les paramètres avec -> prepare et -> execute. – mario

+0

Merci pour votre aide, votre méthode semble être la meilleure et la plus sûre. –

0

supprimer la variable de l'instruction SQL parce que sa variable php

$STH = $DBH->query('SELECT * FROM ratings WHERE title=' . $title . 'ORDER BY date ASC'); 
+0

Pourquoi est-ce obtenir un downvote? La réponse est techniquement correcte ... –

+0

C'est la concaténation de SQL sans s'échapper et sans citation - elle demande une injection SQL. PDO a préparé des déclarations avec des espaces réservés, et ceux-ci devraient être utilisés autant que possible. Les réponses «correctes» ne doivent pas contenir de failles de sécurité et de pires pratiques. – Charles

+0

Vous avez beaucoup de downvoting à faire alors: P Laissez la communauté voter mieux corriger les réponses qui enseignent ces méthodes, et enregistrer des downvotes pour des réponses totalement fausses. C'est juste mon opinion. –

1

Jetez un oeil à PDO::prepare et PDOStatement::execute. Le moyen le plus sûr d'ajouter du contenu utilisateur à une requête consiste à préparer une instruction de base et à lier le paramètre à celle-ci. Exemple (notez le point d'interrogation dans l'instruction SQL):

$STH = $DBH->query('SELECT * FROM ratings WHERE title=? ORDER BY date ASC'); 
$STH->execute(array($title)); 

while($row = $STH->fetch(PDO::FETCH_ASSOC)); 
0

Utilisez des guillemets doubles au lieu de guillemets simples comme paramètre de la méthode de requête.

La raison pour laquelle vous obtenez cette erreur est que la méthode de requête échoue et que l'objet $ STH n'est pas créé. Vous devez implémenter une gestion des erreurs.

1
  1. Assurez-vous que les erreurs de lancer PDO vous permettent de voir exactement ce qui ne va pas. Voir How to squeeze error message out of PDO?

  2. Il vous manque probablement des guillemets autour de $title, mais ce scénario nécessite plutôt prepared statements.

+0

+1 pour le lien du didacticiel des instructions préparées. –