Requête SQL et concaténation de $_POST

Résolu/Fermé
Gallagher - 1 juil. 2010 à 10:40
 Gallagher - 1 juil. 2010 à 13:17
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

Breub62 Messages postés 2989 Date d'inscription lundi 7 juin 2010 Statut Membre Dernière intervention 17 avril 2014 369
1 juil. 2010 à 10:45
Dans chaque cas fais un echo de ta requête. Le problème "devrait" te sauter aux yeux...
0
nicolas59000 Messages postés 228 Date d'inscription mercredi 2 septembre 2009 Statut Membre Dernière intervention 1 juillet 2010 124
1 juil. 2010 à 10:47
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
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
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
maka54 Messages postés 699 Date d'inscription mercredi 8 avril 2009 Statut Membre Dernière intervention 4 décembre 2016 80
1 juil. 2010 à 11:06
$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
Breub62 Messages postés 2989 Date d'inscription lundi 7 juin 2010 Statut Membre Dernière intervention 17 avril 2014 369
1 juil. 2010 à 11:06
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
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
Breub62 Messages postés 2989 Date d'inscription lundi 7 juin 2010 Statut Membre Dernière intervention 17 avril 2014 369
1 juil. 2010 à 11:43
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
maka54 Messages postés 699 Date d'inscription mercredi 8 avril 2009 Statut Membre Dernière intervention 4 décembre 2016 80
1 juil. 2010 à 11:47
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
Je vais regarder ça maka54 merci à toi.
0
Leviathan49 Messages postés 257 Date d'inscription jeudi 10 juin 2010 Statut Membre Dernière intervention 22 juillet 2011 70
1 juil. 2010 à 11:42
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
Ca fonctionne j'ai fait comme l'a dit Leviathan49 merci pour votre aide.
0