comparer des éléments d'une base

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 : comparer des éléments d'une base

par Cyrano » 18 févr. 2006, 15:32

Comme invité, tu ne peux pas le voir, je l'ai mis pour toi: tu devrais t'inscrire, ça coûte pas un rond et tu pourras le faire toi-même en plus de pouvoir être averti immédiatement par courriel quand une réponse est postée sur un sujet auquel tu as participé ;)

par hervéh » 18 févr. 2006, 14:31

PS: je trouve pas le tag [Résolu] !!!!!

par hervéh » 18 févr. 2006, 14:25

:D encore merci sans ton aide j'y serais toujour.

par Cyrano » 18 févr. 2006, 13:53

Si tu obtiens le résultat voulu, c'est tout ce qui importe, tu ne crois pas ? ;)

Pour les tests, fais-en de façon logique: tout ce que tu ajoutes ou retires dans un code est motivé par une raison logique, sinon, ça n'a pas lieu d'être.

par hervéh » 18 févr. 2006, 13:42

super ça marche dans phpMyAdmin. mais c'est vrai que si rien n'est selectionné on affiche tout. J'ai ajouter le code suivant :
<?php
/* Récupération des identifiants */
$nom = isset($_POST['id_machine']) ? $_POST['id_machine'] : "";

$where = "";
/* On compte combien de valeurs ont été envoyées */
if(!empty($nom))
{
    $nb = count($nom);
    /* On crée les clauses de tri */
    
	$clauses = array();
    for($i = 0; $i < $nb; $i++)
    {
        $clauses[] = "id_machine = ". $nom[$i];
    }
    /* On concatène les clauses */
    $where = "WHERE ". implode(" OR ", $clauses);
}

$sql = "SELECT id_machine, model, course FROM machine ". $where .";";
/* Affichage de contrôle */
echo("<p>". $sql ."</p>\n");


if ( $nb == 0 ) {
  echo 'pas de selection' ;
} 
else
 {

/* Exécution de la requête */
$result = mysql_query($sql);
?>
<table cellspacing="3">
  <tr>
    <th class="thead">id_machine</th>
    <th class="thead">model</th>
    <th class="thead">course</th>
  </tr>
<?php
while($row = mysql_fetch_assoc($result))
{
?>
  <tr>
    <td><?php echo($row['id_machine']); ?></td>
    <td><?php echo($row['model']); ?></td>
    <td><?php echo($row['course']); ?></td>
  </tr>
<?php
}
?>
</table><?php
}
?>
Aprés test ça marche, mais est ce que c'est correct ?
PS: pour $_SESSION[$row[]] c'est un reste de test, comme ça marché pas j'ai essaye plein de chose pas correct :oops:

par Cyrano » 18 févr. 2006, 12:21

Bon, petite correction pour éviter les erreurs si aucune case n'est cochée. D'autre part : pourquoi $_SESSION[$row[]] ?? que vient faire la session là dedans ? :
<?php
/* Récupération des identifiants */
$nom = isset($_POST['id_machine']) ? $_POST['id_machine'] : "";

$where = "";
/* On compte combien de valeurs ont été envoyées */
if(!empty($nom))
{
    $nb = count($nom);
    /* On crée les clauses de tri */
    $clauses = array();
    for($i = 0; $i < $nb; $i++)
    {
        $clauses[] = "id_machine = ". $nom[$i];
    }
    /* On concatène les clauses */
    $where = "WHERE ". implode(" OR ", $clauses);
}

$sql = "SELECT id_machine, model, course FROM machine ". $where .";";
/* Affichage de contrôle */
echo("<p>". $sql ."</p>\n");

/* Exécution de la requête */
$result = mysql_query($sql);
?>
<table cellspacing="3">
  <tr>
    <th class="thead">id_machine</th>
    <th class="thead">model</th>
    <th class="thead">course</th>
  </tr>
<?php
while($row = mysql_fetch_assoc($result))
{
?>
  <tr>
    <td><?php echo($row['id_machine']); ?></td>
    <td><?php echo($row['model']); ?></td>
    <td><?php echo($row['course']); ?></td>
  </tr>
<?php
}
?>
</table> 
Si tu exécute la requête affichée ensuite, est-ce que tu obtiens le résultat voulu dans phpMyAdmin ?

par hervéh » 18 févr. 2006, 11:17

aprés test j'arrive maintenant à récupérer plusieurs cases cocher en page de resultat. à lécran ça affiche ça mainteant:


SELECT id_machine FROM table_xyz WHERE champ_xyz = 1 OR champ_xyz = 2;
id_machine model course



sans afficher le resultat, ça doit venir de $result maintenant.
cyrano svp help me !!! :(

Code : Tout sélectionner

<?php /* Récupération des identifiants */ $nom = isset($_POST['id_machine']) ? $_POST['id_machine'] : ""; /* On compte combien de valeurs ont été envoyées */ if(!empty($nom)) { $nb = count($nom); } /* On crée les clauses de tri */ $clauses = array(); for($i = 0; $i < $nb; $i++) { $clauses[] = "champ_xyz = ". $nom[$i]; } /* On concatène les clauses */ $where = implode(" OR ", $clauses); $sql = "SELECT id_machine FROM table_xyz ". "WHERE ". $where .";"; /* Affichage de contrôle */ echo("<p>". $sql ."</p>\n"); ?> <? $result = mysql_query("SELECT * FROM machine WHERE id_machine = '". $where ."'" ); ?> <table cellspacing="3"> <tr> <th class="thead">id_machine</th> <th class="thead">model</th> <th class="thead">course</th> </tr> <?php while($row = mysql_fetch_array($result)) { ?> <tr> <td><?php echo($_SESSION[$row['id_machine']]); ?></td> <td><?php echo($_SESSION[$row['model']]); ?></td> <td><?php echo($_SESSION[$row['course']]); ?></td> </tr> <?php } ?> </table>

par Cyrano » 11 févr. 2006, 14:31

non, c'est la valeur de l'attribut value qui doit recevoir cette valeur.

par hervéh » 11 févr. 2006, 14:23

j'arrive à comprendre l'exemple, mais de là à le transcrire dans mon cas !
"nom" doit etre remplacé par $row['id_machine'] ?

par Cyrano » 11 févr. 2006, 13:15

Pas de problème, j'espérais bien que tu poserais la question avant d'aller plus loin.

Nous avons donc un problème de nombre d'identifiant inconnu. La requête doit être dynamique quelque soit le nombre d'identifiants cochés. Il faut donc créer à la volée la clause WHERE :
<?php
/* Récupération des identifiants */
$nom = isset($_POST['nom']) ? $_POST['nom'] : "";
/* On compte combien de valeurs ont été envoyées */
if(!empty($nom))
{
    $nb = count($nom);
}
/* On crée les clauses de tri */
$clauses = array();
for($i = 0; $i < $nb; $i++)
{
    $clauses[] = "champ_z = ". $nom[$i];
}
/* On concatène les clauses */
$where = implode(" OR ", $clauses);

$sql = "SELECT champ_1, champ_2 FROM table_xyz ".
"WHERE ". $where .";";
?>
Qu'est-ce que ça va faire : supposons que nous ayons trois valeurs identifiant qui soient envoyées : 12, 26 et 47. Le tableau $nom va donc correspondre à :
$nom = array("12", "26", "47");
Passons ce code pour le test dans le code montré ci-dessus:
<?php
/* Récupération des identifiants */
//$nom = isset($_POST['nom']) ? $_POST['nom'] : "";
$nom = array("12", "26", "47");
/* On compte combien de valeurs ont été envoyées */
if(!empty($nom))
{
    $nb = count($nom);
}
/* On crée les clauses de tri */
$clauses = array();
for($i = 0; $i < $nb; $i++)
{
    $clauses[] = "champ_z = ". $nom[$i];
}
/* On concatène les clauses */
$where = implode(" OR ", $clauses);

$sql = "SELECT champ_1, champ_2 FROM table_xyz ".
"WHERE ". $where .";";
/* Affichage de contrôle */
echo("<p>". $sql ."</p>\n");
?>
Le résultat de l'affichage de contrôle va montrer :
SELECT champ_1, champ_2 FROM table_xyz WHERE champ_z = 12 OR champ_z = 26 OR champ_z = 47;

par hervéh » 11 févr. 2006, 12:48

peut etre je me suis mal exprimé, je comprend bien le fait que chaque coche doit avoir un identifiant unique pour pouvoir stocker ces valeurs. là ou je décroche c'et quant tu met dans ta requete:
"WHERE champ_z = ". $nom[0] ." ".
"OR champ_z = ". $nom[1] .";";
au départ on connait pas le nombre de variable $nom (nb de case cochée)?
désolé si je suis lourd à comprendre, mais peut j'ai encore trop de lacune pour cet exercice :oops:

par Cyrano » 11 févr. 2006, 12:20

Ben ne me dis pas que tu comprends alors : je ne te mordrais pas si tu me dis que tu ne comprends pas et je ne prendrai pas pour acquis que tu as saisi : sinon, on risque de faire des impasses et en fin de compte tu seras largué depuis un moment.

Reprenons :
- Première étape, le formulaire : tu as un certain nombre de champs générés dans une boucle : pour éviter que les champs n'aient tous le même nom, il faut utiliser des valeurs "tabulaire" (des tableaux), donc au lieu de name="nom", on va mettre name="nom[]". Les valeurs seront alors stockées dans des tableaux indexés;
- Seconde étape, la récupération des valeurs du formulaire dans la page de traitement (qui peut éventuellement être la même page). Si on avait qu'un seul champ avec name="nom", on récupèrerait la valeur de ce champ en initialisant une variable $nom et on lui assignerait la valeur stockée dans la super-globale $_POST['nom'] : $nom serait alors une variable "scalaire" ayant une unique valeur. Si par contre on a dans notre formulaire des champs avec name="nom[]", on sait qu'on récupère un tableau de valeurs toujours dans $_POST['nom'] : on initialise $nom avec cette valeur mais cette fois $nom n'est plus une variable scalaire mais un tableau indexé : on va donc travailler sur $nom[0], $nom[1], etc...

Tu dois maintenant générer une requête SQL en utilisant l'identifiant de la case cochée : mais avec des cases à cocher, tu peux avoir plusieurs valeurs : donc soit tu crées une requête par valeur, soit tu crées une seule requête qui va extraire plusieurs lignes de données : dans ce dernier cas, ta requête ressemblera à
$sql = "SELECT champ_1, champ_2 FROM table_xyz ".
"WHERE champ_z = ". $nom[0] ." ".
"OR champ_z = ". $nom[1] .";";
Est-ce que c'est plus clair comme ça ?

par hervéh » 11 févr. 2006, 11:59

oui ça je comprend la théorie, ce qui est moin clair c'est le bout de code. je vois pas à quel endroit je doit le mettre ?.

par Cyrano » 11 févr. 2006, 11:44

Ok, ça veut donc dire que tu as plusieurs champs avec l'attribut name valant id_machine : remplace par id_machine[] : dans ce cas, tu auras dans $_POST['id_machine'] un tableau indexé contenant toutes les cases cochées s'il y en a mais avec un point de repère individuel pour chaque case. Tu récupères donc :
$id_machine = isset($_POST['id_machine']) ? $_POST['id_machine'] : "";
Ensuite, $id_machine est un tableau s'il y a des cases cochées, tu dois donc pointer en utilisant $id_machine[0], $id_machine[1], $id_machine[2], etc... tant qu'il y en a.

Est-ce que tu comprends le fonctionnement à ce stade ?

par hervéh » 11 févr. 2006, 11:39

aprés test ça donne ça en page résultat:

SELECT * FROM machine WHERE id_machine = '3' 1
id_machine model course

quelquesoit les cases cochées il y a 1 resultat, le dernier des cases cochées

je remet ici le code de ma page resultat:

Code : Tout sélectionner

<?php session_start(); $_SESSION['id_machine'] = $_POST['id_machine']; require_once('admin/connect.php'); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>Document sans titre</title> </head> <body> <?php $sql=" SELECT * FROM machine WHERE id_machine = '".$_SESSION['id_machine']."' "; echo($sql); $result = mysql_query($sql) or die('Erreur SQL !<br />\n'.$sql.'<br />\n'.mysql_error()); if(!mysql_query($sql,$db)) { print "erreur ". $sql ."<br />\n"; } $nb_resultat = mysql_num_rows($result); if ($nb_resultat == 0) { ?> <p>Pas de selection</p><? echo($nb_resultat); ?> <?php } else { ?> <? echo($nb_resultat); ?> <table cellspacing="3"> <tr> <th class="thead">id_machine</th> <th class="thead">model</th> <th class="thead">course</th> </tr> <?php while($row = mysql_fetch_array($result)) { ?> <tr> <td><?php echo($_SESSION[$row['id_machine']]); ?></td> <td><?php echo($_SESSION[$row['model']]); ?></td> <td><?php echo($_SESSION[$row['course']]); ?></td> </tr> <?php } ?> </table> <?php } ?> </body> </html> <? mysql_close($db); ?>