Convertir moteur recherche mysql_ en PDO [Résolu/Fermé]

Signaler
Messages postés
48
Date d'inscription
mardi 29 novembre 2011
Statut
Membre
Dernière intervention
9 mai 2018
-
Messages postés
48
Date d'inscription
mardi 29 novembre 2011
Statut
Membre
Dernière intervention
9 mai 2018
-
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

Messages postés
29793
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
21 octobre 2020
2 863
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

Messages postés
48
Date d'inscription
mardi 29 novembre 2011
Statut
Membre
Dernière intervention
9 mai 2018

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
Messages postés
29793
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
21 octobre 2020
2 863
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...
Messages postés
48
Date d'inscription
mardi 29 novembre 2011
Statut
Membre
Dernière intervention
9 mai 2018

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
Messages postés
29793
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
21 octobre 2020
2 863
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.
Messages postés
48
Date d'inscription
mardi 29 novembre 2011
Statut
Membre
Dernière intervention
9 mai 2018
>
Messages postés
29793
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
21 octobre 2020

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,
Messages postés
29793
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
21 octobre 2020
2 863 >
Messages postés
48
Date d'inscription
mardi 29 novembre 2011
Statut
Membre
Dernière intervention
9 mai 2018

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.
Messages postés
48
Date d'inscription
mardi 29 novembre 2011
Statut
Membre
Dernière intervention
9 mai 2018

A ok, merci de conseil