Or et And dans select where

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Or et And dans select where

Re: Or et And dans select where

par Cyrano » 27 oct. 2010, 21:19

Un peu d'ordre et de méthode ne nuiraient pas... :-k

Commence par faire afficher la requête à l'écran avec un var_dump($sql), ensuite fait un copier/coller et teste-la directement dans phpMyAdmin : ensuite, on avisera selon le résultat. On sait que l'exécution avec mysql_query a foiré, on va donc vérifier que la requête SQL est au moins valide. Si le résultat est bon, alors on remontera un autre cran plus haut, sinon, on avisera.

Re: Or et And dans select where

par Mazarini » 27 oct. 2010, 21:03

Bonjour,

Après chaque fonction mysql, il faut tester mysql_errno() <> 0 et afficher mysql_error().
C'est valable pour mysql_querry comme mysql_select_db et toute autres fonctions.

Re: Or et And dans select where

par moogli » 27 oct. 2010, 20:08

salut,

le message d'erreur veut dire que la variable $exec n'est pas une ressource mysql. En gros mysql_query retourne false ;)

pourquoi ? parce que $sql n'est pas une chaine de caractère, si la requête c'est bien passée c'est une ressource mysql. c'est cette variable que tu doit mettre dans le mysql_fetch_array.
Cette fonction est déprécié depuis php5.3 et la doc officielle encourage a ne plus l'utiliser au profit de mysql_query.

je te suggère donc ce code :
<?php
$sql  = 'SELECT couleur FROM table1 '.$sWhere .' ORDER BY date DESC, heure DESC LIMIT 5';
mysql_select_db($sql_bdd,$db_link);
$exec = mysql_query($sql,$db_link);
if ($exec === false ){
	echo '<p>Erreur SQL '.mysql_error().'<br />'.$sql.'</p>';
	}
else {
	while(false !== ($data = mysql_fetch_array($exec, MYSQL_ASSOC))){
		echo  ' salut quelle couleur : ' , stripslashes(htmlentities(trim($data['couleur']))) , '<br />';
	}  
	mysql_free_result ($exec);
}
?>
@+

Re: Or et And dans select where

par celine » 27 oct. 2010, 19:06

Bonjour Cyrano, j'ai testé ASSOC ROWS NAMES rien a faire il refuse l'argument

Voila le mssg d'erreur pour les differents test

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in

$sql  = mysql_db_query($sql_bdd,"SELECT * ".
        "FROM table1 ".
        $sWhere .
        "ORDER BY date DESC, heure DESC ".
        "LIMIT 5" ,$db_link) or die(mysql_error());

 $exec = mysql_query($sql);
while(false !== ($data = mysql_fetch_array($exec, MYSQL_ASSOC)))

{
 echo  ' salut quelle couleur : ' , stripslashes(htmlentities(trim($data['couleur']))) , ''; 
    }  
mysql_free_result ($sql);
Merci pour tous .

Re: Or et And dans select where

par Cyrano » 26 oct. 2010, 06:17

Et où est l'exécution de la requête avec mysql_query() ??

- Tu définis la requête, ok;
- tu ne l'exécutes pas, ça c'est moins bon;
- Tu veux afficher le résultat ... et bien entendu ça foire :

Que dit ton message d'erreur ? Que mysql_fetch_array() attend en paramètre une ressource et tu lui envoies la requête SQL à la place. Une ressource, c'est le retour d'exécution. Donc, après la définition de la requête, tu peux faire :
//...
$exec = mysql_query($sql);
while(false !== ($data = mysql_fetch_assoc($exec)))
{
   //...
Note le paramètre utilisé et comment il est défini. Note aussi l'utilisation de mysql_fetch_assoc() au lieu de mysql_fetch_array().

Re: Or et And dans select where

par celine » 25 oct. 2010, 23:41

Bonsoir Cyrano, Il me met comme message d'erreur
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /var/www/

Et l'echo en $sql fontionne


$db_link = @mysql_connect($sql_serveur,$sql_user,$sql_passwd);

if(!$db_link) {echo "Connexion impossible à la base de données <b>$sql_bdd</b> sur le serveur <b>$sql_server</b><br>Vérifiez les paramètres du fichier"; exit;}

$aWhere = array();

if(isset($_POST['rub']) && $_POST['rub'] != '-1')
{
    $aWhere[] = "rubrique='". $_POST['rub'] ."'";
}

if(isset($_POST['ville']) && $_POST['ville'] != '-1')
{
    $aWhere[] = "ville='". $_POST['ville'] ."'";
}
 
$sWhere = (count($aWhere) > 0) 
    ? "WHERE ". implode(" AND ", $aWhere) ." " 
    : null;
  

$sql  = "SELECT * ".
        "FROM table1 ".
        $sWhere .
        "ORDER BY date DESC, heure DESC ".
        "LIMIT 5";
 
while ($data = mysql_fetch_array($sql))  
	
	{


 echo ' 
<font size="4" color="#FFCC00"><b><u>' , stripslashes(htmlentities(trim($data['matiere']))) , '</u></b></font>
<br>
<u>
' , stripslashes(htmlentities(trim($data['ville']))) , '
</u> 
<br><br>
<font size="2"> <b>choix: 
' , stripslashes(htmlentities(trim($data['couleur']))) , '  
' , stripslashes(htmlentities(trim($data['condition']))) , ' 
</b></font><br> 
';
 }

Voila la requete avec son exécution, j'ai testé d'autres fonctions Mysql mais sans résultat.
Merci Cyrano pour ton aide.

Re: Or et And dans select where

par Cyrano » 25 oct. 2010, 22:08

C'est sûrement réalisable, il faut simplement prendre les choses une par une et résoudre un problème à la fois.

Ton bout de code ne m'indique rien d'utile, et malheureusement, un « ça plante » ne m'aide pas davantage. Résoudre un bug, c'est commencer par en comprendre l'origine : donc il faut définir ce qui ne fonctionne pas et analyser pourquoi ce qu'on attend n'est pas exécuté correctement. Est-ce qu'il s'affiche un message d'erreur ? As-tu tenté de faire afficher la requête SQL ainsi générée afin de la tester directement avant une exécution via PHP, simplement en faisant un echo($sql) juste avant le mysql_query ? Sinon, essaye donc ça et s'il se produit une erreur, reviens avec le message que ça affiche. Et si ce n,est pas ça, alors quel est donc l'erreur ?

Re: Or et And dans select where

par celine » 25 oct. 2010, 20:20

Bonsoir et merci Cyrano, j'ai mis en place ton dévelloppement mais avec mon while sur ouverture de tableau sa plante
 while ($data = mysql_fetch_array($sql)) 
        
        {



Je ne sais pas si c'est réalisable ce que j'aimerais faire ? Merci à toi

Re: Or et And dans select where

par Cyrano » 25 oct. 2010, 06:22

Salut, il faut construire ta requête dynamiquement.

D'abord, affecter une valeur aux options qui affichent juste un message « Choix 1 » et « Choix 2 » :
<form action="select.php" method="post">
  <b><font size="5"><i>Faites votre selection :</i></font></b>
  &nbsp;&nbsp;&nbsp;
  <select name="rub">
    <option value="-1">Choix 1</option>
    <option value="lot">A</option>
    <option value="lot2">B</option>
    <option value="lot3">C</option>
  </select>
  <select name="ville">
    <option value="-1">Choix 2</option>
    <option value="groupe">D</option>
    <option value="groupe2">E</option>
    <option value="groupe3">F</option>
  </select>
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  <input type="submit" value="Envoyer">
</form>
Ensuite, tu récupères ce qui est envoyé pour construire la clause WHERE selon qu'il y a un choix différent de -1 ou non :
<?php
/* On crée un container pour stocker les clauses WHERE */
$aWhere = array();
/* Si une rubrique a été choisie, on ajoute une clause sur cette rubrique */
if(isset($_POST['rub']) && $_POST['rub'] != '-1')
{
    $aWhere[] = "rubrique='". $_POST['rub'] ."'";
}
/* Si une ville a été sélectionnée, on crée une clause sur la ville */
if(isset($_POST['ville']) && $_POST['ville'] != '-1')
{
    $aWhere[] = "ville='". $_POST['ville'] ."'";
}
/* On construit la clause WHERE si au moins une clause a été définie précédemment */
$sWhere = (count($aWhere) > 0) 
    ? "WHERE ". implode(" AND ", $aWhere) ." " 
    : null;
/* On construit la requête */
$sql  = "SELECT * ".
        "FROM table1 ".
        $sWhere .
        "ORDER BY date DESC, heure DESC ".
        "LIMIT 5";
De cette manière, si ton internaute ne sélectionne aucune valeur des deux listes, il n'y aura pas de clause WHERE et toutes les lignes de la table seront retournées, s'il ne sélectionne qu'une ville, alors seules les lignes correspondantes seront retournées, s'il ne sélectionne qu'une rubrique sans préciser de ville, alors ne reviendront que les lignes correspondant à la rubrique, et s'il sélectionne les deux, ne reviendront alors que les lignes correspondant aux deux valeurs.

Or et And dans select where

par celine » 25 oct. 2010, 02:00

Bonjour je n'arrive pas a faire des choix multiple malgrès toutes mes recherches sur le net voila mon fichier form
<form action="select.php" method="post">
<b><font size="5"><i>Faites votre selection :</i></font></b> 

&nbsp;&nbsp;&nbsp;
<select name="rub">
<option>Choix 1</option>
<option value="lot">A</option>
<option value="lot2">B</option>
<option value="lot3">C</option>
</select>

<select name="ville">
<option>Choix 2</option>
<option value="groupe">D</option>
<option value="groupe2">E</option>
<option value="groupe3">F</option>
</select> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<input type="submit" value="Envoyer">
 </form>

J'envoi mes variables rub et ville vers mon fichier select.php
jusque là pas de soucis

j'aimerais que Mon fichier select.php traite mes variables comme il suit

si l'internaute clique sur envoyer $resultat me retourne tous les enregistrements de la table1 (cela ne fonctionne pas)
si l'internaute selectionne une variable rub et clique sur envoyer $resultat me retourne tous les enregistrements du champ rubrique de la table1 (cela fonctionne)
si l'internaute selectionne une variable ville et clique sur envoyer $resultat me retourne tous les enregistrements du champ ville de la table1 (cela fonctionne)
si l'internaute selectionne une variable rub avec une variable ville et clique sur envoyer $resultat me retourne tous les enregistrements des champs unis ville et rubrique de la table1 (cela ne fonctionne pas)




Mon fichier select.php


$resultat = mysql_db_query($sql_bdd,"SELECT * FROM table1 WHERE rubrique='". $rub ."' or ville='". $ville ."' or (rubrique='". $rub ."' and ville='". $ville ."')ORDER BY date DESC, heure DESC LIMIT 5 ;",$db_link) or die(mysql_error());

  
  while ($data = mysql_fetch_array($resultat)) 
	
	{



echo '
 


j'ai testé beaucouq de formules mais sans résultat, si quelqu'un peu m'aiguiller merci à vous