Requête SQL et concaténation de $_POST

Résolu
Gallagher -  
 Gallagher -
Bonjour,
Pour un stage j'ai dû dévelloper une interface permettant aux techniciens de l'entreprise où je suis d'enregistrer des modifications qu'ils ont effectué avec pour champs à renseigner : nom du technicien, secteur, équipement entre autre, sous forme de liste déroulantes toutes ces données sont dans une base de donnée. La modification sera enregistré dans une table " modifications " de la base de donnée.

Dans cette interface j'ai une page de recherche pour recherche des modifications. Les critères de la recherche sont sous la forme de listes déroulantes similaires à celles citées plus haut. Les résultats sont affichés par page.

<?php
	$query=mysql_query('SELECT COUNT(*) FROM modifications WHERE 1=1') or die(mysql_error());
	
	if(isset($_POST['technicien'])&&$_POST['technicien']!="")
	$query.=" AND intervenant='".$_POST['technicien']."'";
	
	if(isset($_POST['date'])&&$_POST['date']!="")		
	$query.=" AND date='".$_POST['date']."'";
	
	if(isset($_POST['unite'])&&$_POST['unite']!="")		
	$query.=" AND unite='".$_POST['unite']."'";
	
	if(isset($_POST['secteur'])&&$_POST["secteur"]!="")		
	$query.=" AND secteur='".$_POST['secteur']."'";
	
	if(isset($_POST['api'])&&$_POST['api']!="")		
	$query.=" AND api='".$_POST['api']."'";
	
	if(isset($_POST['equipement'])&&$_POST['equipement']!="")		
	$query.=" AND equipement='".$_POST['equipement']."'";
	
	if(isset($_POST['motif'])&&$_POST['motif']!="")		
	$query.=" AND motif='".$_POST['motif']."'";
	
	if(isset($_POST['status'])&&$_POST['status']!="")		
	$query=" AND status='".$_POST['status']."'";
	
	$nb_entrees = mysql_result($query,0,0);   
  	$entrees_par_page = 5;     
  	$total_pages = ceil($nb_entrees/$entrees_par_page);    
  	if(!isset($_GET['page']))
  	{  
  	$page_courante = 1;   
  	}
  	else 
	{  
  	$page = $_GET['page'];  
  	if ($page<1) $page_courante=1;   
  	elseif ($page>$total_pages) $page_courante=$total_pages;   
   	else $page_courante=$page;   
    }  
	$start = ($page_courante * $entrees_par_page - $entrees_par_page);   
 
	$sql="SELECT * FROM modifications WHERE 1=1";

	if(isset($_POST['technicien'])&&$_POST['technicien']!="")
	$sql=$sql." AND intervenant='".$_POST['technicien']."'";

	if(isset($_POST['date'])&&$_POST['date']!="")		
	$sql=$sql." AND date='".$_POST['date']."'";

	if(isset($_POST['unite'])&&$_POST['unite']!="")		
	$sql=$sql." AND unite='".$_POST['unite']."'";

	if(isset($_POST['secteur'])&&$_POST['secteur']!="")		
	$sql=$sql." AND secteur='".$_POST['secteur']."'";

	if(isset($_POST['api'])&&$_POST['api']!="")		
	$sql=$sql." AND api='".$_POST['api']."'";

	if(isset($_POST['equipement'])&&$_POST['equipement']!="")		
	$sql=$sql." AND equipement='".$_POST['equipement']."'";

	if(isset($_POST['motif'])&&$_POST['motif']!="")		
	$sql=$sql." AND motif='".$_POST['motif']."'";

	if(isset($_POST['status'])&&$_POST['status']!="")		
	$sql=$sql." AND status='".$_POST['status']."'";

	$sql=$sql.' LIMIT '.$start.','.$entrees_par_page;

	$requete=mysql_query($sql,$db) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());

	if(mysql_num_rows(mysql_query($sql,$db))==false)
	{
		echo "Aucune donnée ne correspond à votre recherche";
		echo '<META http-equiv="refresh" content="1;url=modif_rech.php" />';
	}
	else
	{
		echo "<center><table><tr><td><h1>Intervenant</h1></td><td><h1>Date</h1></td><td><h1>Heure</h1></td><td><h1>Unité</h1></td><td><h1>Secteur</h1></td><td><h1>API</h1></td><td><h1>Equipement</h1></td><td><h1>Motif</h1></td><td><h1>Status</h1></td><td><h1>Commentaires</h1></td></tr>";  
	
  	while($item = mysql_fetch_array($requete))
	{  
  		echo ("<tr><th>".$item['intervenant']."</th><th>".$item['date']."</th><th>".$item['heure']."</th><th>".$item['unite']."</th><th>".$item['secteur']."</th><th>".$item['api']."</th><th>".$item['equipement']."</th><th>".$item['motif']."</th><th>".$item['status']."</th><th>".$item['commentaire']."</th><th> <a href=\"modif_saisie.php?id_modif=".$item['id_modif']."\">Modifier</a></th><th><a href=\"#\" onClick=\"confirme('".$item['id_modif']."')\" >Supprimer</a><br>\n</th></tr>") ;  
  	}  
	echo "</table></center>\n<br>"; 
 	echo pagination($total_pages,$page_courante); 
} 
?>


Si vous avez besoin de la fonction pagination faites le moi savoir.

Les différents $_POST sont les données des listes déroulantes issues de la base de données.

Le problème : Lorsque dans ma page de recherche je laisse toutes les listes déroulantes il m'affiche toutes les modifications sans problème.

Mais si je met qu'un seul critère : Warning: mysql_result() expects parameter 1 to be resource, string given

Je me doute que le problème vient de la suite de if après le " SELECT COUNT(*) " j'ai essayé de modifier les guillemets quote, ça m'affiche toujours ce message.

Merci d'avance pour votre aide.

9 réponses

  1. Breub62 Messages postés 3452 Statut Membre 369
     
    Dans chaque cas fais un echo de ta requête. Le problème "devrait" te sauter aux yeux...
    0
  2. nicolas59000 Messages postés 235 Statut Membre 127
     
    Avant d'exécuter ta requête fais un echo $sql; et regarde ce qu'il ne va pas dans ta requête sur phpmyadmin
    0
  3. Gallagher
     
    Ah je vois ça affiche toujours le post que j'ai sélectionné mais je sais pas trop comment régler ça. Autre question la suite de if en dessous est correct ?
    0
  4. Gallagher
     
    Mes if sont tous faux en fait...je viens de voir ça. Je sais pas comment traiter les post un par un et à plusieurs...
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. maka54 Messages postés 721 Statut Membre 80
     
    $query=mysql_query('SELECT COUNT(*) FROM modifications WHERE 1=1') or die(mysql_error());
    	
    	if(isset($_POST['technicien'])&&$_POST['technicien']!="")
    	$query.=" AND intervenant='".$_POST['technicien']."'";
    	
    tu va un peu trop vite ...
    
    $query='SELECT COUNT(*) FROM modifications WHERE 1=1';
    	
    	if(isset($_POST['technicien'])&&$_POST['technicien']!="")
    	$query.=" AND intervenant='".$_POST['technicien']."'";


    çà marchera mieux comme çà déjà

    pour ne pas repeter tes if :

    $query = '';  
    
    foreach($_POST as $key => $value){  
        if($value != ''){  
            $query .= ' AND '.$key .' = "'.$value.'"';  
        }  
    }  
    
    if($query != ''){  
            $req = 'SELECT COUNT(*) FROM modifications WHERE (1 '.$query.')';  
    }
    0
  7. Breub62 Messages postés 3452 Statut Membre 369
     
    Il faut que tu réfléchisse au nombre de listes que tu as, aux nombre de tables que tu dois gérer et aux nombres de scenarii différents...
    0
  8. Gallagher
     
    maka54 je ne comprend pas trop comment fonctionne le foreach dans mon cas.

    Breub62 je te met le code avec les listes déroulantes :

    <?php    
      $demande="SELECT DISTINCT intervenant FROM modifications ORDER BY intervenant"; 
      $result=mysql_query($demande); 
      echo '<select name="technicien">'; 
      echo'<option value="" selected="selected"></option>'; 
      while($row = mysql_fetch_array($result)) 
      { 
       echo '<option value="'.$row[0].'">'.$row[0].'</option>'; 
      } 
      echo '</select><br /><br />'; 
       
       echo 'Date : '; 
            $demande="SELECT DISTINCT date FROM modifications ORDER BY date"; 
      $result=mysql_query($demande); 
      echo '<select name="date">'; 
      echo'<option value="" selected="selected"></option>'; 
      while($row = mysql_fetch_array($result)) 
      { 
       echo '<option value="'.$row[0].'">'.$row[0].'</option>'; 
      } 
      echo '</select><br /><br />'; 
        
        echo 'Unité : '; 
            $demande="SELECT DISTINCT unite FROM modifications ORDER BY unite"; 
      $result=mysql_query($demande); 
      echo '<select name="unite">'; 
      echo'<option value="" selected="selected"></option>'; 
      while($row = mysql_fetch_array($result)) 
      { 
       echo '<option value="'.$row[0].'">'.$row[0].'</option>'; 
      } 
      echo '</select><br /><br />'; 
        
       echo 'Secteur : '; 
            $demande="SELECT DISTINCT secteur FROM modifications ORDER BY secteur"; 
      $result=mysql_query($demande); 
      echo '<select name="secteur">'; 
      echo'<option value="" selected="selected"></option>'; 
      while($row = mysql_fetch_array($result)) 
      { 
       echo '<option value="'.$row[0].'">'.$row[0].'</option>'; 
      } 
      echo '</select><br /><br />'; 
        
       echo 'API : '; 
            $demande="SELECT DISTINCT api FROM modifications ORDER BY api"; 
      $result=mysql_query($demande); 
      echo '<select name="api">'; 
      echo'<option value="" selected="selected"></option>'; 
      while($row = mysql_fetch_array($result)) 
      { 
       echo '<option value="'.$row[0].'">'.$row[0].'</option>'; 
      } 
      echo '</select><br /><br />'; 
        
       echo 'Equipement : '; 
           $demande="SELECT DISTINCT equipement FROM modifications ORDER BY equipement"; 
      $result=mysql_query($demande); 
      echo '<select name="equipement">'; 
      echo'<option value="" selected="selected"></option>'; 
      while($row = mysql_fetch_array($result)) 
      { 
       echo '<option value="'.$row[0].'">'.$row[0].'</option>'; 
      } 
      echo '</select><br /><br />'; 
        
       echo 'Motif : '; 
           $demande="SELECT DISTINCT motif FROM modifications ORDER BY motif"; 
      $result=mysql_query($demande); 
      echo '<select name="motif">'; 
      echo'<option value="" selected="selected"></option>'; 
      while($row = mysql_fetch_array($result)) 
      { 
       echo '<option value="'.$row[0].'">'.$row[0].'</option>'; 
      } 
      echo '</select><br /><br />'; 
        
       echo 'Status : '; 
            $demande="SELECT DISTINCT status FROM modifications ORDER BY status"; 
      $result=mysql_query($demande); 
      echo '<select name="status">'; 
      echo'<option value="" selected="selected"></option>'; 
      while($row = mysql_fetch_array($result)) 
      { 
       echo '<option value="'.$row[0].'">'.$row[0].'</option>'; 
      } 
      echo '</select><br /><br />'; 
    ?>
    0
    1. Breub62 Messages postés 3452 Statut Membre 369
       
      Si j'ai bien compté tu 8 listes déroulantes soit :

      0 sélectionnés : 1 cas
      1 sélectionnés : 8 cas
      2 sélectionnés : 8x7 cas
      3 sélectionnés : 8x7x6 cas
      4 sélectionnés : 8x7x6x5 cas
      5 sélectionnés : 8x7x6 cas
      6 sélectionnés : 8x7 cas
      7 sélectionnés : 8 cas
      8 sélectionnés : 1 cas

      Ce qui fais 2482 scénarios possibles...

      A toi de voir comment t'organiser...
      0
    2. maka54 Messages postés 721 Statut Membre 80
       
      foreach($_POST as $key => $value){  
          if($value != ''){  
              $query .= ' AND '.$key .' = "'.$value.'"';  
          }  
      }  


      tu boucles sur tes $_POST et tu recupères la clé et la valeur

      exemple avec
      $_POST['technicien']
      $key = 'technicien';
      $valeur = 'la valeur de ton $_POST';
      $query .= ' AND '.$key .' = "'.$value.'"';   -> $query .= ' AND technicien = "une_valeur"';  
      


      par contre je viens de voir que ton champ s'appelait intervenant, du coup, çà marchera pas, mais si tous tes champs du formulaire avait le meme nom que dans ta base, çà te ferait gagner un temps considérable ...
      0
    3. Gallagher
       
      Je vais regarder ça maka54 merci à toi.
      0
  9. Leviathan49 Messages postés 267 Statut Membre 70
     
    Pour cette partie là :
    if(isset($_POST['status'])&&$_POST['status']!="")		
    	$query=" AND status='".$_POST['status']."'";
    	
    	$nb_entrees = mysql_result($query,0,0);   
    
    mysql_result ne fonctionne pas avec une chaîne de caractère ça devrait plutôt être :
    if(isset($_POST['status'])&&$_POST['status']!="")		
    	$query=" AND status='".$_POST['status']."'";
    	$res = $requete=mysql_query($sql,$db);
    	$nb_entrees = mysql_result($res,0,1);   
    
    0
  10. Gallagher
     
    Ca fonctionne j'ai fait comme l'a dit Leviathan49 merci pour votre aide.
    0