8722 sujets

Développement web côté serveur, CMS

Bonjour,

Je travail sur un projet d'inventaire de parc informatique d'un établissement scolaire. Je cherche à rendre plus performante ma page dédiée aux recherches, cependant j'ai un problème :
Sur cette page j'ai déjà une listbox qui m'affiche un tableau si l'on choisit une valeur.
[u]Exemple :[/u] Je choisis une salle dans la listbox et un tableau m'affiche tout le matériel contenu dans cette salle.
J'ai essayé en vain, je refaire ce même principe pour effectuer une recherche par ordinateurs pour que le tableau affiche les logiciels installés sur l'ordinateur.
Voici mon code :
																			<!-- ********** RECHERCHER PAR MATERIEL LES LOGICIELS INSTALLES/ ********** -->
<?php
/* Variables de connexion : ajustez ces paramètres selon votre propre environnement */
$serveur = "localhost";
$admin   = "root";
$mdp     = "";
$base    = "inventaire_parc_info";
/* On récupère si elle existe la valeur de la salle envoyée par le formulaire */
$idm = isset($_POST['liste_mat'])?$_POST['liste_mat']:null;
if(isset($_POST['ok']) && isset($_POST['liste_log']) && $_POST['liste_log'] != "")
{
    $mat_selectionnee = $_POST['liste_mat'];
    $log_selectionnee = $_POST['liste_log'];
?>
<p>Vous avez sélectionné le logiciel <?php echo($mat_selectionnee); ?> dans le matériel <?php echo($log_selectionnee); ?></p>
<?php
}
?>
<h3>Trouver les logiciels d'un ordinateur</h3>
<?php
/* On établit la connexion à MySQL avec mysql_pconnect() plutôt qu'avec mysql_connect()
*  car on aura besoin de la connexion un peu plus loin dans le script */
$connexion = mysql_connect($serveur, $admin, $mdp);
if($connexion != false)
{
    $choixbase = mysql_select_db($base, $connexion);
    $sql11 = "SELECT id_mat, marque_mat, id_type_mat FROM materiel WHERE id_type_mat='pc'";
    $rech_mat_log = mysql_query($sql11);
    $code_mat_log = array();
    $materiel = array();
    /* On active un compteur pour les ordinateurs */
    $nb_mat = 0;
    if($rech_mat_log != false)
    {
        while($ligne = mysql_fetch_assoc($rech_mat_log))
        {
            array_push($code_mat_log, $ligne['id_mat']);
            array_push($materiel, $ligne['marque_mat']);
            /* On incrémente de compteur */
            $nb_mat++;
        }
    }
    ?>
<form action="<?php echo($_SERVER['PHP_SELF']); ?>" method="post" id="chglog">
<fieldset style="border: 3px double #333399">
<legend>LOGICIELS</legend>
<select name="liste_mat" id="liste_mat" onchange="document.forms['chgmat'].submit();">
  <option value="-1">- - - Choisissez un ordinateur - - -</option>
    <?php
    for($i = 0; $i < $nb_mat; $i++)
    {
?>
  <option value="<?php echo($code_mat_log[$i]); ?>"<?php echo((isset($idm) && $idm == $code_mat_log[$i])?" selected=\"selected\"":null); ?>><?php echo($materiel[$i]); ?></option>
<?php
    }
    ?>
</select>
    <?php
    mysql_free_result($rech_mat_log);
    /* On commence par vérifier si on a envoyé un ordinateur et le cas échéant s'il est différent de -1 */
    if(isset($idm) && $idm != -1)
    {
        /* Cération de la requête pour avoir les logiciels du materiel */
        $sql21 = "SELECT id_log, designation_log FROM logiciel INNER JOIN installer ON id_log = id_log_install WHERE id_mat_install = '".$idm."' ";
        if($connexion != false)
        {
            $rech_mat_log = mysql_query($sql21, $connexion) or die(mysql_error());
echo '<table>
		<tr>
		<th>Logiciels</th>
		</tr>';

while ($ligne=mysql_fetch_array($rech_mat_log))
{
	echo '<tr>
	<td>'.$ligne['id_log'].'</td>
	<td>'.$ligne['designation_log'].'</td>
	</tr>';
}
echo '</table>';
?>
                <?php
        }
?>

</select>
<?php
    }
        /* Un petit coup de balai */
        //mysql_free_result($rech_mat_log);
}
?>

</fieldset>
</form>
<?php
    /* Terminé, on ferme la connexion */
    mysql_close($connexion);

?> 
																				<!-- ********** /RECHERCHER PAR MATERIEL LES LOGICIELS INSTALLES ********** -->


La listbox apparaît bien avec le contenu de ma base de données, mais aucun tableau n'apparaît.
[u]Ma base de données: [/u]
- installer : id_log_install, id_mat_install
==> clés étrangères de :
- logiciel : id_log [CLE ETRANGERE], designation_log
et de
- materiel : id_mat [CLE ETRANGERE], marque_mat, ...

J'aimerai qu'en sélectionnant dans la listbox un ordinateur, ça m'affiche les logiciels installés dans la machine.
La listbox doit m'afficher les ordinateur selon leur marque et leur identifiant...
Le tableau doit m'afficher la designation (voir l'identifiant...) du logiciel.

Je n'arrive pas à trouver mon erreur, si quelqu'un de sympathique avec du temps libre pourrait m'aider j'en serais ravie.
Cordialement et bon courage à toute personne qui voudrait m'aider,
lizeal
Modifié par lizeal (27 Jun 2013 - 10:21)
Bonjour,
Si tu n'as vraiment aucun tableau affiché (même pas un simple tableau avec l'en-tête "Logiciels"), fais un echo de ta variable $idm, à mon avis elle est peut-être vide (je vois qu'apparemment tu la mets à null si il n'y a pas de POST). Sinon, fais aussi un echo de $sql21 pour voir si la requête est bien formée, et teste la directement dans phpmyadmin pour voir si elle renvoie un résultat.
Bonjour,

Merci pour votre réponse.

Aucun résultat pour l'echo et j'avais déjà testé ma requête SQL, elle est fonctionnelle.
Si tu n'as aucun résultat en faisant echo $idm, cela signifie que la variable est vide. Or, ton code suivant:
 if(isset($idm) && $idm != -1)
    {
        /* Cération de la requête pour avoir les logiciels du materiel */
        $sql21 = "SELECT id_log, designation_log FROM logiciel INNER JOIN installer ON id_log = id_log_install WHERE id_mat_install = '".$idm."' ";
        if($connexion != false)
        {
            $rech_mat_log = mysql_query($sql21, $connexion) or die(mysql_error());
echo '<table>
		<tr>
		<th>Logiciels</th>
		</tr>';

while ($ligne=mysql_fetch_array($rech_mat_log))
{
	echo '<tr>
	<td>'.$ligne['id_log'].'</td>
	<td>'.$ligne['designation_log'].'</td>
	</tr>';
}
echo '</table>';

n'écrit le tableau que si cette variable n'est pas vide (--> if(isset($idm) && $idm != -1) ), donc c'est normal que ton tableau ne s'affiche pas.
Modifié par GroquikMLV (27 Jun 2013 - 11:32)
Pourtant ma variable contient bien quelque chose.

J'ai effectué un test sur une page vide en y collant ce code :
<?php
/* Variables de connexion : ajustez ces paramètres selon votre propre environnement */
$serveur = "localhost";
$admin   = "root";
$mdp     = "";
$base    = "inventaire_parc_info";
/* On récupère si elle existe la valeur de la salle envoyée par le formulaire */
$VALRECUP_MAT = isset($_POST['liste_mat'])?$_POST['liste_mat']:null;
if(isset($_POST['ok']) && isset($_POST['liste_log']) && $_POST['liste_log'] != "")
{
    $mat_select = $_POST['liste_mat'];
    $log_select = $_POST['liste_log'];
?>
<p>Vous avez sélectionné le logiciel <?php echo($log_select); ?> installé dans l'ordinateur <?php echo($mat_select); ?></p>
<?php
}
?>
<h3>Trouver le logiciel installé dans l'ordinateur</h3>
<?php
/* On établit la connexion à MySQL avec mysql_pconnect() plutôt qu'avec mysql_connect()
*  car on aura besoin de la connexion un peu plus loin dans le script */
$connexion = mysql_connect($serveur, $admin, $mdp);
if($connexion != false)
{
    $choixbase = mysql_select_db($base, $connexion);
    $sql1 = "SELECT id_mat, marque_mat, id_type_mat FROM materiel WHERE id_type_mat='pc'";
    $rech_mat = mysql_query($sql1);
    $code_mat = array();
    $materiel = array();
    /* On active un compteur pour les ordinateurs */
    $nb_materiels = 0;
    if($rech_mat != false)
    {
        while($ligne = mysql_fetch_assoc($rech_mat))
        {
            array_push($code_mat, $ligne['id_mat']);
            array_push($materiel, $ligne['marque_mat']);
            /* On incrémente de compteur */
            $nb_materiels++;
        }
    }
    ?>
<form action="<?php echo($_SERVER['PHP_SELF']); ?>" method="post" id="[b]chglog[/b]">
<fieldset style="border: 3px double #333399">
<legend>Ordinateurs</legend>
<select name="liste_mat" id="liste_mat" onchange="document.forms['[b]chglog[/b]'].submit();">
  <option value="-1">- - - Choisissez un ordinateur - - -</option>
    <?php
    for($i = 0; $i < $nb_materiels; $i++)
    {
?>
  <option value="<?php echo($code_mat[$i]); ?>"<?php echo((isset($VALRECUP_MAT) && $VALRECUP_MAT == $code_mat[$i])?" selected=\"selected\"":null); ?>><?php echo($materiel[$i]); ?></option>
<?php
    }
    ?>
</select>
    <?php
    mysql_free_result($rech_mat);
    /* On commence par vérifier si on a envoyé un numéro de salle et le cas échéant s'il est différent de -1 */
    if(isset($VALRECUP_MAT) && $VALRECUP_MAT != -1)
    {
        /* Cération de la requête pour avoir les matériels de cette salle */
        $sql2 = "SELECT id_log, designation_log FROM logiciel INNER JOIN installer ON id_log = id_log_install WHERE id_mat_install = '".$VALRECUP_MAT."' ";
        if($connexion != false)
        {
            $rech_mat = mysql_query($sql2, $connexion) or die(mysql_error());
echo '<table>
		<tr>
		<th>Logiciels</th>
		</tr>';

while ($ligne=mysql_fetch_array($rech_mat))
{
	echo '<tr>
	<td>'.$ligne['id_log'].'</td>
	<td>'.$ligne['designation_log'].'</td>
	</tr>';
}
echo '</table>';
?>
                <?php
        }
?>

</select>
<?php
    }
        /* Un petit coup de balai */
        //mysql_free_result($rech_mat);
}
?>

</fieldset>
</form>
<?php
    /* Terminé, on ferme la connexion */
    mysql_close($connexion);

?> 

==> RESULTAT : Tout fonctionne.
Je l'ai alors copié-collé dans ma page ==> fonctionnel.

A pars avoir modifié le nom de quelques dollars (au cas où ...) j'ai surtout modifié les Smiley chgmat en Smiley chglog ... Je pense que ça a fait toute sa différence.
Oui c'est normal: puisque ça ne validait pas le bon formulaire, ton $_POST["liste_mat"] n'existait pas, donc $idm valait "null", d'où l'enchainement que je t'avais décris.
Bien vu pour l'erreur, je n'avais pas vu que tu validais le mauvais formulaire.
Je vous remercie pour vos réponse. C'est dingue que de simples erreurs nous bloquent pendant plusieurs jours .... Cordialement,
Lizeal