Problème de requête multiple

Eléphanteau du PHP | 20 Messages

15 juin 2011, 10:22

Bonjour a tous les internautes. Voilà je galère un peu beaucoup depuis deux jours sur un problème de requête multiple. Je suis en train de créer une application qui permet d'effectuer des sauvegardes de disques durs. L'utilisateur choisit le disque, visualise le rapport qui lui dit ou ira le disque après sauvegarde puis il confirme et là la sauvegarde se fait. Seul problème, lorsque l'utilisateur choisit plusieurs disques, la sauvegarde s'effectue mais ils prennent tous les mêmes valeurs. (La sauvegarde distribue une localisation et un emplacement pour chaque disque) Je n'arrive pas à comprendre comment je suis censé faire.
$select = "SELECT CURDATE(),DateDernièreSauvegarde,IDdisque,Périodicité,EnvironnementTravail,TypeMachine,TypeRaid,Capacité,MarqueModèle,Nsérie,MachineAssocié,EmplacementActuel,ADDDATE(DateDernièreSauvegarde,INTERVAL 1 MONTH),MONTH(DateDernièreSauvegarde),TypeIntervention,Localisation,Mode,Remarque FROM importexcel where $choix = '$Donné' order by IDdisque ASC"; 
$result = mysql_query($select,$link) or die ('Erreur : '.mysql_error() );
$total = mysql_num_rows($result);

  
    while($row = mysql_fetch_assoc($result)) 
	{
	$temps = $row['ADDDATE(DateDernièreSauvegarde,INTERVAL 1 MONTH)'];
	$mois = $row['MONTH(DateDernièreSauvegarde)'];
	$jours = $row['Périodicité'];
	if (empty($jours))
	{
	$futur= strftime("%Y-%m-%d", strtotime("+$30 DAY"));
	}
	else $futur= strftime("%Y-%m-%d", strtotime("+$jours DAY"));
	$IDdisque = $row['IDdisque'];
	$requete1 = "Update importexcel SET Localisation='En production', EmplacementActuel= 1, DateDernièreSauvegarde= CURDATE(), DateFuturSauvegarde= '$futur' where $choix = '$Donné' ";
	$requete2 = "Update importexcel SET Localisation='En production', EmplacementActuel= 0, DateDernièreSauvegarde= CURDATE(), DateFuturSauvegarde= '$futur' where $choix = '$Donné' ";
	$requete3 = "Update importexcel SET Localisation='Au Coffre', DateDernièreSauvegarde= CURDATE(), DateFuturSauvegarde= '$futur' where $choix = '$Donné' ";
	$requete4 = "Update importexcel SET DateDernièreSauvegarde= CURDATE(), DateFuturSauvegarde= '$futur' where $choix = '$Donné' ";
	$requete5 = "Update importexcel SET Localisation='Au Coffre', DateDernièreSauvegarde= CURDATE(), DateFuturSauvegarde= '$futur' where $choix = '$Donné' ";
	$requete6 = "Update importexcel SET DateDernièreSauvegarde= CURDATE(), DateFuturSauvegarde= '$futur' where $choix = '$Donné' ";
	
	
	
	
	echo ' Des changements seront à effectuer sur la machine '.$row['MachineAssocié'].' le '.$temps.'</br> Le disque numéro '.$row['IDdisque'].' devra ';
	if($row["Localisation"]=="Au Coffre")
		{
		if ($row["EmplacementActuel"] == "0")
			{
			echo' être placé en production à l\'emplacement numéro 1 </br></br>';
			echo '<input type="hidden" name="query1" value="'.$requete1.'" >';
			
			}
		}
	if ($row["Localisation"]=="Au Coffre")
		{
		if($row["EmplacementActuel"] == "1")
			{
			echo ' être placé en production à l\emplacement numéro 0 </br></br>';
			echo '<input type="hidden" name="query2" value="'.$requete2.'">';		
			}
		}
		if($row["Localisation"]=="En production")
		{
		 if($mois%2==0)
		 {
		 if($row["IDdisque"]%2!= 0 )
			{
			echo ' être placé au coffre </br></br>';
			echo '<input type="hidden" name="query3" value="'.$requete3.'" >';		
			}
			else
			{
			echo '  rester à sa place </br></br>';
			echo '<input type="hidden" name="query4" value="'.$requete4.' ">';
			}
		 }
		  if($mois%2!=0)
		 {
		 if($row["IDdisque"]%2== 0 )
			{
			echo ' être placé au coffre </br></br>';
			echo '<input type="hidden" name="query3" value="'.$requete5.'">';
			}
			else 
			{
			echo '  rester à sa place </br></br>';
			echo '<input type="hidden" name="query4" value="'.$requete5.'">';
			}
		 }
		}
	
		echo '<input type="hidden" name="IDdisque" value="'.$IDdisque.'">';
    
	}



echo'</br>';
echo '<input name="Sauvegarde" value="Valider & Imprimer" type="submit" onClick="window.print()">';
?>
Ceci est le code qui me permet de rédiger un rapport à l'utilisateursur les disques qu'il a choisit. Lorsqu'il appuie sur confirmer les valeurs sont alors envoyé sur la page suivante :
<?php 

if (isset($_POST['query1'])) $query1 = $_POST['query1'];
if (isset($_POST['query2'])) $query2 = $_POST['query2'];
if (isset($_POST['query3'])) $query3 = $_POST['query3'];
if (isset($_POST['query4'])) $query4 = $_POST['query4'];
if (isset($_POST['query5'])) $query5 = $_POST['query5'];
if (isset($_POST['query6'])) $query6 = $_POST['query6'];
$IDdisque = $_POST['IDdisque'];
$host = "localhost";
$user = "root";
$pass = "";
$db = "badolafarge";

$link = mysql_connect ($host,$user,$pass) or die ('Erreur : '.mysql_error() ); // Connection a la BADO
mysql_select_db($db) or die ('Erreur :'.mysql_error());

$query = "Select AlerteMail From importexcel where IDdisque='$IDdisque'";
$AlerteMail = Mysql_query($query);



if(empty($query1))
{
}
else mysql_query($query1)or die(mysql_error());

if(empty($query2))
{
}
else mysql_query($query2)or die(mysql_error());

if(empty($query3))
{
}
else mysql_query($query3)or die(mysql_error());

if(empty($query4))
{
}
else mysql_query($query4)or die(mysql_error());

if(empty($query5))
{
}
else mysql_query($query5)or die(mysql_error());

if(empty($query6))
{
}
else mysql_query($query6)or die(mysql_error());

if($AlerteMail=="oui")
{
mail('MonMaitre:D','Gestion des disques','La sauvegarde des disques à bien été effectué');
}






?>
Ici les valeurs sont récupérés et les requêtes sont efféctuées. Cependant si plusieurs disques avaient été séléctionnés alors ils reçoivent tous la même valeur. J'ai tenté de réaliser une boucle au moment de l'éxécution des reqêtes sans succès.

Mon problème n'est pas forcément évident à expliquer essayer d'être indulgent ^^.
Je remercie d'avance tout ceux qui prendront un peu de temps pour m'aider, je reste connecté pour répondre à toutes les questions possibles et imaginables :D (sur mon post bien sur)
Hail to the king!

Eléphant du PHP | 92 Messages

15 juin 2011, 11:13

Hello,

Alors j'ai pris le temps de tout comprendre ton script...
Par contre il me manque un truc dans le premier script que tu as posté, d'où viennent les variable $choix et $Donné (les noms de variables avec des accents au passage <= pas terrible...) ?

Ensuite qu'est ce que tu veux dire quand tu dis qu'ils prennent tous la même valeur ?
Est ce que par hasard ils prendraient pas la valeur de la dernière requête effectuée ?
Programmer c'est 20% de syntaxe pour 80% de réflexion et dans les 20% de syntaxe il faut encore compter une bonne dose de réflexion...
Je vous donne des conseils, pas des solutions toutes faites...

Eléphanteau du PHP | 20 Messages

15 juin 2011, 11:18

Salut Maskime et merci de répondre.
Alors en fait $choix est la variable qui recoit le type de recherche de l'utilisateur par exemple ID du disque, Machine Associé ..
Et $Donné (oui j'oubli toujours pour les accents --' ) est la variable qui reçcoit la recherche de l'utilisateur pour suivre les exemples du dessus 001, CEMPLHAVD pour ID et machine.
En fait mon problème est que si le premier coffre doit aller au coffre en position 1 et bien tous les disques recoivent ces informations dans la base de donné --' Alors que dans le rapport l'affichage est correct.
Toujours la pour d'autres questions
Hail to the king!

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

15 juin 2011, 11:59

salut,

j'ai deux trois questions :

- ton script ne passe quedes champs cachés ?
- vu qu'il y a une boucle tu va avoir autant de champs "queryx" que de tuple retourné dans la table, en gros c'est foireux car tu ne sais ce que tu va avoir comme résultat (sauf si la requete ne diot retourner q'un seul tuple au quel cas c'est whil qu'est foireux ;)

Je ne comprend pas pourquoi la requete passe par un champ hidden, si tu peux pas mettre cette info sur la page de traitement du formulaire utilise les sessions mais pas le formulaire tu ne sais pas ce qui peux se passer (champ modifier / tronqué etc).

si tu doit avoir plusierus résultat sur la 1ère requete (1er code) il te faut utiliser des champ avec un nom utilisant la notation tableau ( par exemple name="test[]") ainsi tu pourrait traiter cela avec une boucle (foreach) ;)

idéalement tu ne devrait passer que l'id du disque ainsi que la "commande" (va à l'emplament 412 etc), c'est dans la page de traitement que tu créer la requete SQL qui va bien :)

tu a deux if qui fond la même chose if($row["Localisation"]=="Au Coffre")
la c'est un switch ou un if / elseif / else

d'ailleurs la
<?php
if($mois%2==0)
                 {
                 if($row["IDdisque"]%2!= 0 )
                        {
                        echo ' être placé au coffre </br></br>';
                        echo '<input type="hidden" name="query3" value="'.$requete3.'" >';             
                        }
                        else
                        {
                        echo '  rester à sa place </br></br>';
                        echo '<input type="hidden" name="query4" value="'.$requete4.' ">';
                        }
                 }
                  if($mois%2!=0)
                 {
                 if($row["IDdisque"]%2== 0 )
                        {
                        echo ' être placé au coffre </br></br>';
                        echo '<input type="hidden" name="query3" value="'.$requete5.'">';
                        }
                        else
                        {
                        echo '  rester à sa place </br></br>';
                        echo '<input type="hidden" name="query4" value="'.$requete5.'">';
                        }
                 }
                }
?>
tu fait deux fois la même chose, quel intéret ? puor le ois c'est if / else (pas d'autre possibilitée la) et ensuite le if qui viens (modulo 2 de l'id disque, a la limite une belle fonction et tu gagne de la place et de la lisibilitée (d'ailleurs une fonction pour le tous ça serait plus clair en fait ;)

docn au final je pense que ta requete n'est pas conforme a ce que tu attent a cause du formulaire, mais bon c'est un peux lourd comme code, j'ai du mal a me faire a ta logique.

pour être bien sur des données que tu envois par le formulaire ajoute un var_dump($_POST); en première ligne de la page de la validation du formulaire ;)

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 20 Messages

15 juin 2011, 12:10

J'ai juste envie de dire merci moogli, le fait de n'utiliser que l'ID va me facilité la tâche ça m'était complétement passé par la tête que la clé primaire résolvait bien des soucis :D
Hail to the king!