2010-12-16 214 views
0

J'ai de la difficulté à mettre en place cette fonction. Probablement une solution très facile mais je commence juste à utiliser PDO et je ne suis pas sûr de la façon de le faire fonctionner.PDO MYSQL Question

Mon problème ici est

for($i = 1; $row = $STH->fetch(); $i++) { 

chaque fois que le code exécute cela arrive à

Fatal error: Call to a member function fetch() on a non-object in /usr/home/webmaster/nano/pages/search.php on line 21 

Toute aide est grandement appréciée

if($_POST['keyword']) { 
$start_time = getmicrotime(); 
$keyword = addslashes($_POST['keyword']); 
$results = addslashes($_POST['results']); 
$STH = $DBH->query('SELECT p.page_url AS url, 
         COUNT(*) AS occurrences 
         FROM search_page p, search_word w, search_occurrence o 
         WHERE p.page_id = o.page_id AND 
         w.word_id = o.word_id AND 
         w.word_word = "$keyword" 
         GROUP BY p.page_id 
         ORDER BY occurrences DESC 
         LIMIT $results'); 

$end_time = getmicrotime(); 

echo '<h2>Search results for '.$_POST['keyword'].':</h2>'; 
for($i = 1; $row = $STH->fetch(); $i++) { 
    echo '$i. <a href='.$row['url'].'>'.$row['url'].'</a>\n'; 
    echo '(occurrences: '.$row['occurrences'].')<br><br>\n'; 
} 
print "query executed in ".(substr($end_time-$start_time,0,5))." seconds."; 
+0

Notez que l'utilisation de 'addslashes()' est très fausse ici. Vous avez besoin de '$ dbh-> quote()' pour éviter les exploits. – mario

+0

Fera! Pourriez-vous nous donner un aperçu de pourquoi? –

+1

Naviguez ici: http://stackoverflow.com/search?q=php+sql+escaping - et puisque vous utilisez déjà PDO, recherchez également des "instructions préparées" à la place. Mieux qu'une fuite manuelle fastidieuse. – mario

Répondre

0

SQL ne va pas, par conséquent, votre $ STH n'obtient pas d'objet résultat et a été défini sur false à la place.

Les chaînes SQL ont besoin de guillemets simples '. Vous avez mélangé ça en PHP. Utilisez des guillemets doubles pour entourer l'instruction entière, et des guillemets simples ou $ dbh-> quote() en fait à l'intérieur.