Convertir moteur recherche mysql_ en PDO

Résolu/Fermé
13stephweb13 Messages postés 48 Date d'inscription mardi 29 novembre 2011 Statut Membre Dernière intervention 9 mai 2018 - Modifié par jordane45 le 2/03/2015 à 18:25
13stephweb13 Messages postés 48 Date d'inscription mardi 29 novembre 2011 Statut Membre Dernière intervention 9 mai 2018 - 3 mars 2015 à 00:07
Bonjour,
je débute en php, et pour apprendre ce matin j'ai voulu faire un moteur de recherche interne à l'ide d'un tuto vidéo. Mais il est fait avec les vieilles fonctions mysql_ alors que je veux le faire en PDO.
J'ai donc essayé, mais quand je le fait en PDO ça me met une erreur et ça ne fonctionne pas.

Voici le début de mon code (avec les fonctions mysql_ que je ne veux pas):
if(!empty($_GET['q'])) {

 if(preg_match("#^[^<>=]{3,100}$#",$_GET['q'])) {

  $get_q = addslashes($_GET['q']);
  $s = explode(" ",$get_q);
  
  mysql_connect("localhost","root","");
  mysql_select_db("cms");
  $sql = "SELECT * FROM articles";
  
  $i = 0;
  foreach($s as $mot) {
   if(strlen($mot)>0) {
    if($i==0) {
     $sql.=" WHERE ";
    }
    else {
     $sql.=" OR ";
    }
    $sql.="titre_h1 LIKE '%$mot%'";
    $i++;
   }
  }
  
  $req=mysql_query($sql) or die (mysql_error());
  echo mysql_num_rows($req)." Résultat<br />";
  while($d = mysql_fetch_assoc($req)) {
  
  ...

Pour le faire en PDO j'ai donc essayé de remplacer ces lignes de code:

mysql_connect("localhost","root","");
mysql_select_db("cms");
$sql = "SELECT * FROM articles";

Par:

$bdd = new PDO('mysql:host=localhost;dbname=cms', 'root', '');
$sql = $bdd->query("SELECT * FROM articles");

Et ça me met ceci comme erreur:
Catchable fatal error: Object of class PDOStatement could not be converted to string in C:\wamp\www\CMS\admin-az\rechercher.php on line 46

Si quelqu'un peut m'aider à le faire en PDO?
Merci beaucoup.

3 réponses

jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
2 mars 2015 à 18:29
Bonjour,
et qu'as tu comme code à la ligne 46 de ton fichier C:\wamp\www\CMS\admin-az\rechercher.php ?

Dans l'idéal, il faudrait nous le montrer entièrement.

PS: Merci de préciser le "langage" dans les balises de code pour la coloration syntaxique.
Explications disponibles ici :
https://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code

0
13stephweb13 Messages postés 48 Date d'inscription mardi 29 novembre 2011 Statut Membre Dernière intervention 9 mai 2018
2 mars 2015 à 18:36
ok merci
à la ligne 46 (wamp a du aussi prendre en compte le code html que j'ai au dessus, donc):
$sql.=" WHERE ";


et mon script complet (qui marche, mais je veut le convertir en PDO)

<?php
if(!empty($_GET['q'])) {

	if(preg_match("#^[^<>=]{3,100}$#",$_GET['q'])) {

		$get_q = addslashes($_GET['q']);
		$s = explode(" ",$get_q);
		
		mysql_connect("localhost","root","");
		mysql_select_db("cms");
		$sql = "SELECT * FROM articles";
		
		$i = 0;
		foreach($s as $mot) {
			if(strlen($mot)>0) {
				if($i==0) {
					$sql.=" WHERE ";
				}
				else {
					$sql.=" OR ";
				}
				$sql.="titre_h1 LIKE '%$mot%'";
				$i++;
			}
		}
		
		$req=mysql_query($sql) or die (mysql_error());
		echo mysql_num_rows($req)." Résultat<br />";
		while($d = mysql_fetch_assoc($req)) {
		
			$c2 = $d["id"];
			$i = 0;
			foreach($s as $mot) {
				if(strlen($mot)>3) {
					$i++;
					if($i > 4) {$i = 1;}
					$c2 = str_ireplace($mot, '<span class="surlign'.$i.'">'.$mot.'</span>', $c2);
				}
			}
			echo '<h1>'.$c2.'</h1>';
			
			$c = $d["description"];
			$i = 0;
			foreach($s as $mot) {
				if(strlen($mot)>3) {
					$i++;
					if($i > 4) {$i = 1;}
					$c = str_ireplace($mot, '<span class="surlign'.$i.'">'.$mot.'</span>', $c);
				}
			}
			echo '<p>'.$c.'</p>';
		}
	
	}
	else {
		$erreur_search = 'Erreur dans la recherche.';
	}
}
?>


Merci beaucoup
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
2 mars 2015 à 19:30
Le code que je veux voir c'est celui qui génère l'erreur. ... ce que tu as essayé de faire avec la pdo...
0
13stephweb13 Messages postés 48 Date d'inscription mardi 29 novembre 2011 Statut Membre Dernière intervention 9 mai 2018
2 mars 2015 à 20:43
ok
<?php
if(!empty($_GET['q'])) {

	if(preg_match("#^[^<>=]{3,100}$#",$_GET['q'])) {

		$get_q = addslashes($_GET['q']);
		$s = explode(" ",$get_q);
		
		$bdd = new PDO('mysql:host=localhost;dbname=cms', 'root', '');
		$sql = $bdd->query("SELECT * FROM articles");
		
		$i = 0;
		foreach($s as $mot) {
			if(strlen($mot)>0) {
				if($i==0) {
					$sql.=" WHERE ";
				}
				else {
					$sql.=" OR ";
				}
				$sql.="titre_h1 LIKE '%$mot%'";
				$i++;
			}
		}
		
		$req=mysql_query($sql) or die (mysql_error());
		echo mysql_num_rows($req)." Résultat<br />";
		while($d = mysql_fetch_assoc($req)) {
		
			$c2 = $d["id"];
			$i = 0;
			foreach($s as $mot) {
				if(strlen($mot)>3) {
					$i++;
					if($i > 4) {$i = 1;}
					$c2 = str_ireplace($mot, '<span class="surlign'.$i.'">'.$mot.'</span>', $c2);
				}
			}
			echo '<h1>'.$c2.'</h1>';
			
			$c = $d["description"];
			$i = 0;
			foreach($s as $mot) {
				if(strlen($mot)>3) {
					$i++;
					if($i > 4) {$i = 1;}
					$c = str_ireplace($mot, '<span class="surlign'.$i.'">'.$mot.'</span>', $c);
				}
			}
			echo '<p>'.$c.'</p>';
		}
	
	}
	else {
		$erreur_search = 'Erreur dans la recherche.';
	}
}
?>


Et quand je tente de lancer une recherche (en tapant des mots clés dans le champ input) ça me met ceci comme erreur:
Catchable fatal error: Object of class PDOStatement could not be converted to string in C:\wamp\www\CMS\admin-az\rechercher.php on line 46

Et la ligne 46 est elle:
$sql.=" WHERE ";


Merci beaucoup
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
Modifié par jordane45 le 2/03/2015 à 22:51
Le souci vient du fait que tu utilises ta variable $sql à cette ligne
$sql = $bdd->query("SELECT * FROM articles");

ce qui genère un jeu d'enregistrement..
puis tu essayes de lui ajouter du texte.... d'où le message d'erreur...

A la limite il faut faire :
$bdd = new PDO('mysql:host=localhost;dbname=cms', 'root', '');
$sql = "SELECT * FROM articles";


... puis plus bas (ligne 26 de ton code )
$req = $bdd->query($sql);


par contre.. il te faudra également modifier tes lignes 27/28 pour utiliser mysqli au lieu de mysql.
0
13stephweb13 Messages postés 48 Date d'inscription mardi 29 novembre 2011 Statut Membre Dernière intervention 9 mai 2018 > jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024
2 mars 2015 à 23:23
OK, c'est bon j'ai fait ce que tu m'as dit.

ps: Par contre je pensais que c'était pas bon de mettre
$sql = "SELECT * FROM articles"; 

je pensais qu'il faillais toujours faire des requêtes préparés en pdo.
Mais ça l'air de bien fonctionner.

et j'ai aussi modifier mes lignes 27/28 en y faisant en PDO.
Merci beaucoup,
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650 > 13stephweb13 Messages postés 48 Date d'inscription mardi 29 novembre 2011 Statut Membre Dernière intervention 9 mai 2018
2 mars 2015 à 23:46
je pensais qu'il faillais toujours faire des requêtes préparés en pdo.
Mais ça l'air de bien fonctionner.

Les requêtes préparées sont essentiellement utilisées lorsque tu as des paramètres à ta requête (un WHERE....)
Sinon.. pas besoin.
0
13stephweb13 Messages postés 48 Date d'inscription mardi 29 novembre 2011 Statut Membre Dernière intervention 9 mai 2018
3 mars 2015 à 00:07
A ok, merci de conseil
0