RECHERCHE PAR MOT CLÉ DANS TOUS LES CHAMPS DE TOUTES LES TABLES D'UNE BASE DE DO

phpAnonyme Messages postés 392 Date d'inscription mercredi 28 octobre 2009 Statut Membre Dernière intervention 23 mars 2012 - 20 mars 2011 à 15:49
ABDOULAX16 Messages postés 1 Date d'inscription samedi 27 février 2016 Statut Membre Dernière intervention 27 février 2016 - 27 févr. 2016 à 18:05
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/52955-recherche-par-mot-cle-dans-tous-les-champs-de-toutes-les-tables-d-une-base-de-donnee

ABDOULAX16 Messages postés 1 Date d'inscription samedi 27 février 2016 Statut Membre Dernière intervention 27 février 2016
27 févr. 2016 à 18:05
merci,,,,,,,,,
furefure Messages postés 2 Date d'inscription mardi 13 avril 2010 Statut Membre Dernière intervention 22 mars 2011
22 mars 2011 à 13:07
Euh pourquoi pas var_dump($row) ou var_dump($dataX[X]) ...
C'est pas que ca me choque..
Sinon j'aime bien le code... C'est adaptable assez facilement pour le faire sur certain champs de certaine table
cs_gabay Messages postés 25 Date d'inscription lundi 10 décembre 2007 Statut Membre Dernière intervention 29 juin 2010
21 mars 2011 à 13:38
$word c'est le mot clé tu doit l'initialisé au début par une valeur que tu récupère en GET ou en POST ou bien pou tester tu mes juste une chaine de caractère.

Sinon, Marshall_Mathers, oui ca exécute autant de requêtes qu'il existe de champs, et c'est vrais que c'est mieux de concaténer les requête comme ca on réduit le nombre de requêtes à une par table... entre autre ca devient comme ceci:

<?php
$host = 'localhost';
$user = 'root';
$pass = 'root';
$dbase = 'nom_de_la_base_de_donnee';
$columns ='';

$db = mysql_connect($host,$user,$pass) or die("Erreur de connexion au serveur");
mysql_select_db($dbase,$db) or die("Erreur de connexion a la base de donnees");

$table_name = mysql_query('show tables');
while($data = mysql_fetch_array($table_name)) {// on boucle sur les noms de chaque table
$columns_name = mysql_query('show columns from '.$data[0]);
while($data1 = mysql_fetch_array($columns_name)) {// on boucle sur les noms de tous les champs de chaque table
if(empty($columns)){
$columns .= $data1[0].' like "%Mot_clé%"';
}else{
$columns .= ' or '.$data1[0].' like "%Mot_clé%"';
}
}
$res= mysql_query('select * from '.$data[0].' where '.$columns);
while($data3 = mysql_fetch_array($res)) {// on affiche le resultat de la requete pour chaque champ de chaque table
echo " ".$data3[0].'
';
echo " ".$data3[1].'
';
//etc ......
}
}
?>
cs_nino31 Messages postés 17 Date d'inscription jeudi 6 mars 2008 Statut Membre Dernière intervention 29 avril 2013
21 mars 2011 à 09:46
Bonjour,

Avec le code de phpanonyme, j'ai : "Notice: Undefined variable: word in E:\wamp\www\boxavenue\test-connect-bdd\search.php on line 16"

Un question : ou entre-t-on les mots à rechercher ?

Merci
cs_Marshall_Mathers Messages postés 56 Date d'inscription mardi 4 mai 2004 Statut Membre Dernière intervention 30 novembre 2007
21 mars 2011 à 05:53
Bonjour Gabay,

Ton script va exécuter autant de requêtes qu'il existe de champs ? Je ne pense pas que cela soit très bon pour l'accès et la vitesse...
J'ai un script du même genre qui concatène les requêtes ensemble comme le script PDO de “phpAnonyme”. Je pense que c'est la meilleure solution.

Mais continue comme ça =) !
cs_gabay Messages postés 25 Date d'inscription lundi 10 décembre 2007 Statut Membre Dernière intervention 29 juin 2010
20 mars 2011 à 17:47
T'a raison et en plus c'est très bien organiser ;)
phpAnonyme Messages postés 392 Date d'inscription mercredi 28 octobre 2009 Statut Membre Dernière intervention 23 mars 2012 55
20 mars 2011 à 15:59
Je me suis trompé de code :

$sth = new PDO('mysql:host='.$host.';dbname='.$dbase, $user, $pass);
$getTables = $sth->prepare('SHOW TABLES');
$getTables->execute();
$resultTables = $getTables->fetchAll();
if(empty($resultTables))
throw new Exception('Pas de tables dans la BDD');

foreach($resultTables AS $nameTables) {
$getColumns = $sth->prepare('SHOW COLUMNS FROM '.$nameTables[0]);
$getColumns->execute();
$resultColumns = $getColumns->fetchAll();
$columns = '';
foreach($resultColumns AS $k => $columnsName) {
if(empty($columns))
$columns .= '`'.$resultColumns[$k]['Field'].'` LIKE \'%'.$word.'%\'';
else
$columns .= ' OR `'.$resultColumns[$k]['Field'].'` LIKE \'%'.$word.'%\'';
}
$result = $sth->prepare('SELECT * FROM '. $nameTables[0] .' WHERE '.$columns);
$result->execute();
$row = $result->fetchAll();
if(!empty($row)) {
echo '';
print_r($row);
echo '

';
}
}

requête préparée !
Mais ça bon ca change pas grand chose sauf au niveau de la rapidité
phpAnonyme Messages postés 392 Date d'inscription mercredi 28 octobre 2009 Statut Membre Dernière intervention 23 mars 2012 55
20 mars 2011 à 15:49
Avec PDO ça coule nettement plus vite, d'autant que c'est plus intéressant !

$sth = new PDO('mysql:host='.$host.';dbname='.$dbase, $user, $pass);
$getTables = $sth->query('SHOW TABLES');
$resultTables = $getTables->fetchAll();
if(empty($resultTables))
throw new Exception('Pas de tables dans la BDD');

foreach($resultTables AS $nameTables) {
$getColumns = $sth->query('SHOW COLUMNS FROM '.$nameTables[0]);
$resultColumns = $getColumns->fetchAll();
$columns = '';
foreach($resultColumns AS $k => $columnsName) {
if(empty($columns))
$columns .= '`'.$resultColumns[$k]['Field'].'` LIKE \'%'.$word.'%\'';
else
$columns .= ' OR `'.$resultColumns[$k]['Field'].'` LIKE \'%'.$word.'%\'';
}
$result = $sth->query('SELECT * FROM '. $nameTables[0] .' WHERE '.$columns);
$row = $result->fetchAll();
if(!empty($row)) {
echo '';
print_r($row);
echo '

';
}
}
Rejoignez-nous