Moteur avancee/Recuperation données

Eléphant du PHP | 65 Messages

28 mars 2006, 16:00

Bonjour

Je souhaite faire un moteur de recherche avancée (plusieurs critères) or je ne trouve pas le moyen de le faire fonctionner correctement.

Voici mes 2 fichiers (une partie car très longs...)

Mon fichier rechercheavancée là ou on peut inscrire les recherches voulus)
<form method="POST" action="resultrechercheavanceeFR.php">
(decoupe ...)

<p><font face="Book Antiqua"><b>Limitation US</b>&nbsp;&nbsp;&nbsp;
<SELECT name="Limitation_US">
      <OPTION selected>---Limitation---</OPTION>
      <OPTION value="*">*</OPTION>
      <OPTION value="0">0</OPTION>
      <OPTION value="1">1</OPTION>
      <OPTION value="2">2</OPTION>
      <OPTION value="3">3</OPTION>
    </SELECT>&nbsp;&nbsp;&nbsp;
<b>Limitation JAP</b>&nbsp;&nbsp;&nbsp;&nbsp;
<SELECT name="Limitation_JAP">
      <OPTION selected>---Limitation---</OPTION>
      <OPTION value="*">*</OPTION>
      <OPTION value="0">0</OPTION>
      <OPTION value="1">1</OPTION>
      <OPTION value="2">2</OPTION>
      <OPTION value="3">3</OPTION>
    </SELECT> </font>
</p>
<p>&nbsp;</p>
<p><font color="#000080" face="Book Antiqua"><u><b>Rulings</b></u></font></p>
<p><font face="Book Antiqua">
<input type="text" name="Rulings_DE" size="100" value="" maxlength=""></font></p>
<p><font face="Book Antiqua">&nbsp;<input type="submit" value="Envoyer" name="envoyer">
</font> </p>
</center>
</form>
Et ca le fichier resultat (si des champ ne sont pas dans le 1er c'est parce que j'ai découpé
<?php 
// On commence par récupérer les champs 
$Nom_US = isset($_POST['Nom_US']) ? $_POST['Nom_US'] : ''; 
$Nom_FR = isset($_POST['Nom_FR']) ? $_POST['Nom_FR'] : ''; 
$Nom_DE = isset($_POST['Nom_DE']) ? $_POST['Nom_DE'] : ''; 
$Nom_IT = isset($_POST['Nom_IT']) ? $_POST['Nom_IT'] : ''; 
$Nom_JAP = isset($_POST['Nom_JAP']) ? $_POST['Nom_JAP'] : ''; 
$Nom_JAP_US = isset($_POST['Nom_JAP_US']) ? $_POST['Nom_JAP_US'] : ''; 
$Type_Carte_DE = isset($_POST['Type_Carte_DE']) ? $_POST['Type_Carte_DE'] : ''; 
$Type_DE = isset($_POST['Type_DE']) ? $_POST['Type_DE'] : ''; 
$Attribut_DE = isset($_POST['Attribut_DE']) ? $_POST['Attribut_DE'] : ''; 
$Etoiles = isset($_POST['Etoiles']) ? $_POST['Etoiles'] : ''; 
$ATK = isset($_POST['ATK']) ? $_POST['ATK'] : ''; 
$DEF = isset($_POST['DEF']) ? $_POST['DEF'] : ''; 
$Effet_DE = isset($_POST['Effet_DE']) ? $_POST['Effet_DE'] : ''; 
$Limitation_US = isset($_POST['Limitation_US']) ? $_POST['Limitation_US'] : ''; 
$Limitation_JAP = isset($_POST['Limitation_JAP']) ? $_POST['Limitation_JAP'] : ''; 
$Rulings_DE = isset($_POST['Rulings_DE']) ? $_POST['Rulings_DE'] : ''; 

// connexion à la base 
$db = mysql_connect('***, '***', '***) or die('Erreur de connexion '.mysql_error()); 
// sélection de la base 

mysql_select_db('Cartes',$db) or die('Erreur de selection '.mysql_error());
mysql_select_db('Versions',$db) or die('Erreur de selection '.mysql_error());

// on écrit la requête sql 
$sql = "SELECT * FROM Cartes LEFT JOIN Versions USING (Numero_Carte) WHERE Nom_US LIKE '%". $Nom_US ."%' OR Nom_FR LIKE '%". $Nom_FR ."%' OR Nom_DE LIKE '%". $Nom_DE ."%' OR Nom_IT LIKE '%". $Nom_IT ."%' OR Nom_JAP LIKE '%". $Nom_JAP ."%' OR Nom_JAP_US LIKE '%". $Nom_JAP_US ."%' OR Type_Carte LIKE '%". $Type_Carte ."%' OR Type_Carte_DE LIKE '%". $Type_Carte_DE ."%' OR Type_DE LIKE '%". $Type_DE ."%' OR Attribut_DE LIKE '%". $Attribut_DE ."%' OR Etoiles LIKE '%". $Etoiles ."%' OR ATK LIKE '%". $ATK ."%' OR DEF LIKE '%". $DEF ."%' OR Effet_DE LIKE '%". $Effet_DE ."%' OR Limitation_US LIKE '%". $Limitation_US ."%' OR Limitation_JAP LIKE '%". $Limitation_JAP ."%' OR Rulings_DE LIKE '%". $Rulings_DE ."%'"; 

// on envoie la requête 
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); 

(Decoupe...)
En fait si je met OR, il m'affiche tou et si je met AND il ne m'afficherien. Je suppose qu'en fait si je ne met rien dans un champ, il recherche rien donc voilà comment dois-je faire ?
Je pense qu'il me manque un truc j'espère que quelqu'un puisse m'aider...

Merci :wink:

Mammouth du PHP | 19672 Messages

28 mars 2006, 17:57

Il faut construire dynamiquement tes clauses WHERE en ajoutant que celles qui ont une valeur à comparer, proposition :
<?php
// On commence par récupérer les champs
$Nom_US         = isset($_POST['Nom_US']) ? $_POST['Nom_US'] : '';
$Nom_FR         = isset($_POST['Nom_FR']) ? $_POST['Nom_FR'] : '';
$Nom_DE         = isset($_POST['Nom_DE']) ? $_POST['Nom_DE'] : '';
$Nom_IT         = isset($_POST['Nom_IT']) ? $_POST['Nom_IT'] : '';
$Nom_JAP        = isset($_POST['Nom_JAP']) ? $_POST['Nom_JAP'] : '';
$Nom_JAP_US     = isset($_POST['Nom_JAP_US']) ? $_POST['Nom_JAP_US'] : '';
$Type_Carte_DE  = isset($_POST['Type_Carte_DE']) ? $_POST['Type_Carte_DE'] : '';
$Type_DE        = isset($_POST['Type_DE']) ? $_POST['Type_DE'] : '';
$Attribut_DE    = isset($_POST['Attribut_DE']) ? $_POST['Attribut_DE'] : '';
$Etoiles        = isset($_POST['Etoiles']) ? $_POST['Etoiles'] : '';
$ATK            = isset($_POST['ATK']) ? $_POST['ATK'] : '';
$DEF            = isset($_POST['DEF']) ? $_POST['DEF'] : '';
$Effet_DE       = isset($_POST['Effet_DE']) ? $_POST['Effet_DE'] : '';
$Limitation_US  = isset($_POST['Limitation_US']) ? $_POST['Limitation_US'] : '';
$Limitation_JAP = isset($_POST['Limitation_JAP']) ? $_POST['Limitation_JAP'] : '';
$Rulings_DE     = isset($_POST['Rulings_DE']) ? $_POST['Rulings_DE'] : '';

/* Construction de la clause de tri WHERE */
$clauses = array();
if(!empty($Nom_US))
{
    $clauses[] = "Nom_US  LIKE '%". $Nom_US ."%'";
}
if(!empty($Nom_FR))
{
    $clauses[] = "Nom_FR     LIKE '%". $Nom_FR ."%'";
}
//...etc... pour chaque champ qui comporte ou non une valeur

/* On construit la clause WHERE */
$where = (!empty($clauses)) ? " WHERE ". implode(" OR ", $clauses) : null;

// on écrit la requête sql
$sql = "SELECT * FROM Cartes LEFT JOIN Versions USING (Numero_Carte) ". $where;

// connexion à la base
$db = mysql_connect('***', '***', '***') or die('Erreur de connexion '.mysql_error());
// sélection de la base

mysql_select_db('Cartes',$db) or die('Erreur de selection '.mysql_error());
mysql_select_db('Versions',$db) or die('Erreur de selection '.mysql_error());

// on envoie la requête
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
Je n'ai monté que les deux premières, à toi de faire les suivantes, mais le principe devrait être assez facile à comprendre.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 65 Messages

27 juil. 2006, 13:02

Déjà merci de ta reponse, dsl j'ai oublié de répondre :oops:

Je viens de tester ta solution, mais il semble qu'il m'affiche tout malgré le fait que j'entre des critères :/

Voici le code :
<?php 
// On commence par récupérer les champs 
$Nom_US = isset($_POST['Nom_US']) ? $_POST['Nom_US'] : ''; 
$Nom_FR = isset($_POST['Nom_FR']) ? $_POST['Nom_FR'] : ''; 
$Nom_DE = isset($_POST['Nom_DE']) ? $_POST['Nom_DE'] : ''; 
$Nom_IT = isset($_POST['Nom_IT']) ? $_POST['Nom_IT'] : ''; 
$Nom_JAP = isset($_POST['Nom_JAP']) ? $_POST['Nom_JAP'] : ''; 
$Nom_JAP_US = isset($_POST['Nom_JAP_US']) ? $_POST['Nom_JAP_US'] : ''; 
$Type_Carte = isset($_POST['Type_Carte']) ? $_POST['Type_Carte'] : ''; 
$Type_Carte_DE = isset($_POST['Type_Carte_DE']) ? $_POST['Type_Carte_DE'] : ''; 
$Attribut_DE = isset($_POST['Attribut_DE']) ? $_POST['Attribut_DE'] : ''; 
$Type_DE = isset($_POST['Type_DE']) ? $_POST['Type_DE'] : ''; 
$Etoiles = isset($_POST['Etoiles']) ? $_POST['Etoiles'] : ''; 
$ATK = isset($_POST['ATK']) ? $_POST['ATK'] : ''; 
$DEF = isset($_POST['DEF']) ? $_POST['DEF'] : ''; 
$Effet_DE = isset($_POST['Effet_DE']) ? $_POST['Effet_DE'] : ''; 
$Limitation_US = isset($_POST['Limitation_US']) ? $_POST['Limitation_US'] : ''; 
$Limitation_JAP = isset($_POST['Limitation_JAP']) ? $_POST['Limitation_JAP'] : ''; 
$Rulings_DE = isset($_POST['Rulings_DE']) ? $_POST['Rulings_DE'] : ''; 

/* Construction de la clause de tri WHERE */ 
$clauses = array(); 
if(!empty($Nom_US)) 
{ 
    $clauses[] = "Nom_US  LIKE '%". $Nom_US ."%'"; 
} 
if(!empty($Nom_FR)) 
{ 
    $clauses[] = "Nom_FR     LIKE '%". $Nom_FR ."%'"; 
} 
if(!empty($Nom_DE)) 
{ 
    $clauses[] = "Nom_DE     LIKE '%". $Nom_DE ."%'"; 
} 
if(!empty($Rulings_DE)) 
{ 
    $clauses[] = "Rulings_DE     LIKE '%". $Rulings_DE ."%'"; 
} 
//...etc... avec tous les champs

/* On construit la clause WHERE */ 
$where = (!empty($clauses)) ? " WHERE ". implode(" OR ", $clauses) : null; 

// on écrit la requête sql 
$sql = "SELECT * FROM Cartes LEFT JOIN Versions USING (Numero_Carte) LEFT JOIN Boosters USING (Numero_Booster) ". $where;

// connexion à la base 
$db = mysql_connect('***', '**', '***') or die('Erreur de connexion '.mysql_error()); 
// sélection de la base 

mysql_select_db('Cartes',$db) or die('Erreur de selection '.mysql_error()); 
mysql_select_db('Versions',$db) or die('Erreur de selection '.mysql_error()); 
mysql_select_db('Boosters',$db) or die('Erreur de selection '.mysql_error()); 

// on envoie la requête 
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());

// on fait une boucle qui va faire un tour pour chaque enregistrement 
while($data = mysql_fetch_assoc($req)) 
    { 
    // on affiche les informations de l'enregistrement en cours 
    echo '...';
    } 

// on ferme la connexion à mysql 
mysql_close(); 
?>
Par exemple lorsque je met dans le champ Nom_US : Gorilla et en Attribut_DE : Erde, il ne m'affiche pas que les cartes qui comprennent ces 2 éléments mais quasiment toutes les cartes sans exceptions :/

Quelqu'un pourrais m'expliquer pourquoi ?

Merci d'avance :oops:

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

27 juil. 2006, 13:15

Affiche (toujours) la requête qui sera exécutée... un echo $sql.

Comment traites tu le critère $Attribut_DE pour la requête ?

Et si tu ne veux que les résultats qui comprennent tous les critères utilise des AND à la place des OR.

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 65 Messages

27 juil. 2006, 13:32

C'est bon c'était bien AND à la place de OR

Grand merci à toi :wink: