comparer des éléments d'une base

Invité
Invité n'ayant pas de compte PHPfrance

06 févr. 2006, 07:22

à l'écran ça affiche ça:

SELECT * FROM machine WHERE id_machine = ''

Pas de selection

hervéh
Invité n'ayant pas de compte PHPfrance

11 févr. 2006, 10:48

bonjour, je sèche toujour, ça fait une semaine que je cherche et j'ai toujour pas trouvé, cette fois ci je pense que mon erreur est ladedans (au niveau de value je pense):

Code : Tout sélectionner

<tr> <td><?php echo($row['id_machine']); ?></td> <td><?php echo($row['model']); ?></td> <td><?php echo($row['course']); ?></td> <td><label><input type="checkbox" name="<?php echo($row['id_machine']); ?>" value="<?php echo($_SESSION['id_machine'] = $row['id_machine']); ?>" /></label></td> </tr>
car quant je regarde la session de plus prés elle est vide.
j'ai vraiment besoin d'aide car je sait plus quoi essayé.
:oops: merci.

Mammouth du PHP | 19672 Messages

11 févr. 2006, 11:19

L'affichage de ta requête montre une chose: ta variable de session est vide: Or ta variable de session devrais contenir la valeur de $_POST['id_machine'] qui donc est probablement vide également : donc il faut remonter au formulaire pour vérifier le champ contenant cette valeur afin de voir comment la valeur du champ est complétée : et là, on fait une découverte en regardant précisément le dernier bout de code que tu viens de mettre :
<td><label><input type="checkbox" name="<?php echo($row['id_machine']); ?>" value="<?php echo($_SESSION['id_machine'] = $row['id_machine']); ?>" /></label></td>
L'attribut name de ton champ prend le nom de ... l'identifiant extrait de la base de données qui n'est donc pas "id_machine" mais l'identifiant lui même.

En cherchant $_POST['id_machine'], tu dois même avoir normalement une erreur : "warning undefined index 'id_machine' at ... line..."

Normal, ce champ n'existe pas. Il faut donc corriger de la manière suivante:
<td><label><input type="checkbox" name="id_machine" value="<?php echo($row['id_machine']); ?>" /></label></td>
Essaye déjà ça.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

hervéh
Invité n'ayant pas de compte PHPfrance

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); ?>

Mammouth du PHP | 19672 Messages

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 ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

hervéh
Invité n'ayant pas de compte PHPfrance

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 ?.

Mammouth du PHP | 19672 Messages

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 ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

hervéh
Invité n'ayant pas de compte PHPfrance

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:

Mammouth du PHP | 19672 Messages

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;
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

hervéh
Invité n'ayant pas de compte PHPfrance

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'] ?

Mammouth du PHP | 19672 Messages

11 févr. 2006, 14:31

non, c'est la valeur de l'attribut value qui doit recevoir cette valeur.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

hervéh
Invité n'ayant pas de compte PHPfrance

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>

Mammouth du PHP | 19672 Messages

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 ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

hervéh
Invité n'ayant pas de compte PHPfrance

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:

Mammouth du PHP | 19672 Messages

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.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: