Problème avec des liste déroulantes

Petit nouveau ! | 1 Messages

20 déc. 2012, 14:13

Bonjour,

voici mon problème, sur une page j'ai deux listes déroulantes qui récupèrent des valeurs dans la base de données. Ces deux listes se situent dans dans un formulaire afin d'appeler une fonction au moment du click sur le bouton. Mon problème ne vient pas du code en lui même car mes listes fonctionnes et retournes les valeurs sélectionnées mais le problème vient du fait que cela ne fonctionne pas sur mon ordinateur. J'ai testé sur plusieurs ordinateurs et sur tous mon code fonctionne. Je me suis renseigné et on m'a conseillé d'allez voir dans le php.ini car je suis peut-être "bridé" sauf que je connais pas ce fichier donc je préfère demander conseil.

Merci de vos prochaines réponses

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

20 déc. 2012, 20:57

Bonjour, tu n'as donné malheureusement pas assez d'explications concernant ton problème : quelle est l'erreur? ou le message d'erreur? ou bien nous expliquer explicitement le problème.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Invité
Invité n'ayant pas de compte PHPfrance

20 déc. 2012, 21:31

Justement je n'ai pas de message d'erreur, comme dit précédemment mon pc ne veut pas me retourner les valeurs que je récupère dans les listes déroulantes avec "$_POST" quand j'ai mes deux listes déroulantes dans mon formulaire. Quand j'en passe une en commentaire, celle qui reste me retourne bien la valeur sélectionnée. Donc j'ai essayé sur d'autres ordinateurs pour voir si cela ne venait pas de mon pc, et là sur tous les autres ordinateurs mais deux listes déroulantes me retournes bien les valeurs que j'ai sélectionnées. Donc cela vient de mon pc mais je ne sais pas pourquoi.

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

20 déc. 2012, 22:32

salut,


Sans code on ne peux pas t'aider :)

c'est trop vague comme symptôme, c'est un peu comme si tu appelé ton médecin en lui disant "j'ai malade" :)


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

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

20 déc. 2012, 22:38

ça peut être un sous formulaire <form>... </form> que tu as mis à l'intérieur d'un un premier formulaire principal <form> cela trompe les navigateurs qui ne supportent pas l'imbrication de sous-formulaire dans un form principal.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Invité
Invité n'ayant pas de compte PHPfrance

21 déc. 2012, 11:30

Voici le code des listes déroulantes :
<div id="contenu_auteur">
		
		
		<?php
		// Enregistrement de la requête SQl puis exécution de la requête SQL.
		$query_auteur = "SELECT * FROM auteur";
		$result_auteur = mysqli_query ($base, $query_auteur);
		$query_bd = "SELECT CodeBd, titreBd FROM bd";
		$result_bd = mysqli_query ($base, $query_bd);
		?>
		
				<!-- Liste déroulante des auteurs de la base de données -->
			Auteur :
			<form method="post" action ="Fonction.php">
	
				<select name="auteur">
					<?php

					while ($donnees_auteur = mysqli_fetch_array($result_auteur) )
					{	
						echo '<option value="'.$donnees_auteur["Nom"].'">'.$donnees_auteur["Nom"]." ".$donnees_auteur["Prenom"].'</option>';					
					}
			
					
				echo '</select>'
				?>
				<!-- Liste déroulante des bds de la base de données -->
				Bd : 
				<select name="bede">			
				<?php
					$result_bd = mysqli_query ($base, $query_bd);
					while ($donnees_bd = mysqli_fetch_array($result_bd) )
					{	
						echo '<option value="'.$donnees_bd["titreBd"].'">'.$donnees_bd["titreBd"].'</option>';
						
					}
			
				echo '</select>'
				?>
			
				
				<input type="submit" value="Lier" />
			</form>	
	</div>

et voici le code de la fonction :
function lier()
	{	
		// Connexion à la base de données
		$base = mysqli_connect('localhost', 'root','','funenbulles');
		
		// Vérification et éxécution de la requête en cas de non problème		
		if (isset($_POST['bede']) & (isset($_POST['auteur'])))
		{	
			//Requête permettant la vérification de l'existence ou non de la liaison
			$query_test = "SELECT * FROM `ecrire` WHERE `CodeBd` like '".$_POST['bede']."' AND WHERE `CodeAuteur` like '".$_POST['auteur']."'";
			$result_test =  mysqli_query($base ,$query_test);
		
			// Test de l'existence de l'auteur
			if ($result_test = false)
			{
				try
				{	//Exécution de la liaison
					$query_lier = "INSERT INTO `ecrire`(`CodeBd`, `CodeAuteur`) VALUES ('".$_POST['bede']."','".$_POST['auteur']."')";
					$result_lier = mysqli_query($base ,$query_lier);
					header ('location://auteur.php');
				}
				catch (Exception $SQL)
				{
					throw new Exception('Problème SQL');
				}
			}
			else
			{
				header ('location://lier_exist.php');			
			}
		}	
		else
		{
			echo ($_POST['bede']."vide");
		}	
		
	}

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

21 déc. 2012, 12:31

on va commencer par commenter ton code
<?php
function lier()
   {   
      // Connexion à la base de données
      $base = mysqli_connect('localhost', 'root','','funenbulles');
      
      // Vérification et éxécution de la requête en cas de non problème      
      if (isset($_POST['bede']) & (isset($_POST['auteur'])))
      {   
         //Requête permettant la vérification de l'existence ou non de la liaison
         $query_test = "SELECT * FROM `ecrire` WHERE `CodeBd` like '".$_POST['bede']."' AND WHERE `CodeAuteur` like '".$_POST['auteur']."'";
         $result_test =  mysqli_query($base ,$query_test);
      
         // Test de l'existence de l'auteur
         if ($result_test = false) // cette condition sera TOUJOURS VRAIE simplement parce que tu réalise une affectation et non une comparaison (utilise donc le ===)
         {
            try
            {   //Exécution de la liaison
               $query_lier = "INSERT INTO `ecrire`(`CodeBd`, `CodeAuteur`) VALUES ('".$_POST['bede']."','".$_POST['auteur']."')";
               $result_lier = mysqli_query($base ,$query_lier);
               header ('location://auteur.php'); // A mettre encommentaire lorsque l'on veux tester, de plus // en début de lien, si cela fonctionne c'est que les navigateur sont bien sympa. soit tu utilise un simple / et dans ce cas direction la racine du "root" (=> http://localhost en local). : a revoir. 
            }
            catch (Exception $SQL)
            {
               throw new Exception('Problème SQL');
            }
         }
         else
         {
            header ('location://lier_exist.php'); // a commenter quand on test !
         }
      }   
      else
      {
         echo ($_POST['bede']."vide"); // message d'erreur correct à utiliser plutôt ;)
      }   
   }
?>
Fonctionnellement tu n'utilise pas les infos de ta requête il est préférable de faire un select count(*).

=> $query_test = "SELECT count(*) as FROM `ecrire` WHERE `CodeBd` like '".$_POST['bede']."' AND WHERE `CodeAuteur` like '".$_POST['auteur']."'";

un code dans se style
<?php
function lier(){   
	// Connexion à la base de données
	$base = mysqli_connect('localhost', 'root','','funenbulles');

	// Vérification et éxécution de la requête en cas de non problème      
	if (isset($_POST['bede']) & (isset($_POST['auteur']))){
		try{   
			//Requête permettant la vérification de l'existence ou non de la liaison
			$query_test = "SELECT  count(*) as nb FROM ecrire WHERE CodeBd like '".mysqli_real_escape_string($_POST['bede'])."' AND WHERE CodeAuteur like '".mysqli_real_escape_string($_POST['auteur'])."'";
			$result_test =  mysqli_query($base ,$query_test);

			// Test de l'existence de l'auteur
			if ($result_test !== false){ // cette condition sera TOUJOURS VRAIE simplement parce que tu réalise une affectation et non une comparaison (utilise donc le ===)
			//Exécution de la liaison
				$data = mysqli_fetch_assoc(result_test
				if($data['nb'] === 0) {
					$query_lier = "INSERT INTO `ecrire`(`CodeBd`, `CodeAuteur`) VALUES ('".$_POST['bede']."','".$_POST['auteur']."')";
					$result_lier = mysqli_query($base ,$query_lier);
					header ('location://auteur.php'); // A mettre encommentaire lorsque l'on veux tester, de plus // en début de lien, si cela fonctionne c'est que les navigateur sont bien sympa. soit tu utilise un simple / et dans ce cas direction la racine du "root" (=> http://localhost en local). : a revoir. 
				}
				else {
					header ('location://lier_exist.php'); // a commenter quand on test !
				}
			}
			else{
				throw new Exception('Erreur SQL : ' . mysqli_error ($base)));
			}
		}
		catch (Exception $SQL){
		   throw new Exception('Erreur SQL : ' $SQL->getMessage()));
		}
	}   
	else{
	 echo ($_POST['bede']."vide"); // message d'erreur correct à utiliser plutôt ;)
	}
}
?>

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

Invité
Invité n'ayant pas de compte PHPfrance

21 déc. 2012, 12:50

Merci pour ta réponse, je me suis pas encore totalement tourné sur ma fonction car comme dit dans mes postes précédents mon problème vient du non retour des informations sélectionnées dans mes listes déroulantes. Donc si j'ai pas mes retour de $_POST je ne peut pas tester ma fonction c'est pour sa que j'appui sur le fait que j'ai vraiment un problème au niveau de mes liste déroulantes.

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

21 déc. 2012, 15:43

Bonjour,

Il faut écrire le contenu de la fonction lier directement dans la page "Fonction.php".
Et Pour être sûr que les listes envoient un submit, écrire print_r du tableau $_POST.

Voici un corrigé de la page : Fonction.php
<?php
## DEBUG ################################################
echo '<pre><p>GET<ul>'; print_r($_GET); echo '</ul></p></pre>';
echo '<pre><p>POST<ul>'; print_r($_POST); echo '</ul></p></pre>';
#########################################################

   
// Connexion à la base de données
$base = mysqli_connect('localhost', 'root','','funenbulles');

// Vérification et éxécution de la requête en cas de non problème         
if ( isset($_POST['bede']) && isset($_POST['auteur']) )
{      
	//Requête permettant la vérification de l'existence ou non de la liaison
	$query_existe = "SELECT * FROM `ecrire` WHERE `CodeBd` = '".$_POST['bede']."' AND `CodeAuteur` = '".$_POST['auteur']."'";
	$result_existe =  mysqli_query($base ,$query_existe);

	// Test de l'existence de l'auteur
	if (!$result_existe || mysqli_num_rows($result_existe)<=0)
	{
			try
			{       //Exécution de la liaison
					$query_lier = "INSERT INTO `ecrire`(`CodeBd`, `CodeAuteur`) VALUES ('".$_POST['bede']."','".$_POST['auteur']."')";
					$result_lier = mysqli_query($base ,$query_lier);
					header ('location://auteur.php');
			}
			catch (Exception $SQL)
			{
					throw new Exception('Problème SQL');
			}
	}
	else
	{
			header ('location://lier_exist.php');                  
	}
}      
else
{
	echo ("POST vide");
}
?>
Un conseil:
-------------

Un autre phénomène porteur d'erreurs est la sensibilité à la casse (minuscules+majuscules) et ça concerne à la fois les noms des champs html, des variables php ainsi que les noms des fichiers html et php sur le serveur web et ça concerne aussi les serveurs de bases de données sql: Les noms des champs, des tables et des base de données. C'est pour cela qu'il faut respecter la casse d'origine d'un nom. Pour éviter ces erreurs il faut nommer tout en minuscule.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Invité
Invité n'ayant pas de compte PHPfrance

21 déc. 2012, 20:56

Bonsoir,

la fonction lier se trouve bien dans la page "Fonction.php" on le voit pas car ce n'est qu'un bout de ma page fonction étant donné que le reste n'a rien avec mon problème
donc je n'ai rien envoyé que la partie correspondante.
Et Pour être sûr que les listes envoient un submit, écrire print_r du tableau $_POST.
J'ai fait un test similaire avec var_dump($_POST['auteur']); et de même pour "bede";
Quand j'ai mes deux listes déroulante il me met --> array size = 0;
Par contre quand je ne met qu'une liste déroulante (donc l'autre je la passe en commentaire) le var_dump me retourne bien la ligne que j'ai sélectionné.
Et c'est là que je ne comprend pas car a ce que je sache dans un <form> on peut mettre autant de <select> que l'on veut tant que le nom est différent.
Et bizarrement sur d'autres ordinateurs cela fonctionnent.

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

21 déc. 2012, 22:10

Bon, ton programme fonctionne bien et surtout tes 2 listes. Je ne sais pas comment tu t'y prends pour l'exécuter? tu utilise le serveur Wamp ou easyphp?

Par contre, moi je t'ai posté la page Fonction.php corrigée car la tienne contient pas mal d'erreurs fatales dans la requête SELECT qui teste l'existence de liaison et dans le teste if qui vérifie le résultat de l'existence.

Il y a aussi une erreur logique de cohérence entre les listes déroulantes et les requêtes de la page Fonction.php qui réalisent la liaison BD/Auteur. En effet, la liste des bd envoi le titre de la bd sélectionné et la liste des auteurs envoi le nom de l'auteur sélectionné alors que les requêtes de la table "ecrire" exige l'usage des champs clés "CodeBd" et "CodeAuteur". Je ne sait pas pourquoi tu n'as pas programmé tes listes pour renvoyer alors ces deux champs clés.

La correction serait:
<!-- Liste déroulante des auteurs de la base de données -->
                        Auteur :
                        <form method="post" action ="Fonction.php">
       
                                <select name="auteur">
                                        <?php

                                        while ($donnees_auteur = mysqli_fetch_array($result_auteur) )
                                        {      
                                                echo '<option value="'.$donnees_auteur["CodeAuteur"].'">'.$donnees_auteur["Nom"]." ".$donnees_auteur["Prenom"].'</option>';                                   
                                        }
                       
                                       
                                echo '</select>'
                                ?>
                                <!-- Liste déroulante des bds de la base de données -->
                                Bd :
                                <select name="bede">                   
                                <?php
                                        $result_bd = mysqli_query ($base, $query_bd);
                                        while ($donnees_bd = mysqli_fetch_array($result_bd) )
                                        {      
                                                echo '<option value="'.$donnees_bd["CodeBd"].'">'.$donnees_bd["titreBd"].'</option>';
                                               
                                        }
                       
                                echo '</select>'
                                ?>
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Invité
Invité n'ayant pas de compte PHPfrance

22 déc. 2012, 13:16

Bon, ton programme fonctionne bien et surtout tes 2 listes. Je ne sais pas comment tu t'y prends pour l'exécuter? tu utilise le serveur Wamp ou easyphp?
Qu'est ce que tu entends par l’exécuter ? Ou sinon j'utilise Wamp (v 2.2)

En effet, la liste des bd envoi le titre de la bd sélectionné et la liste des auteurs envoi le nom de l'auteur sélectionné alors que les requêtes de la table "ecrire" exige l'usage des champs clés "CodeBd" et "CodeAuteur". Je ne sait pas pourquoi tu n'as pas programmé tes listes pour renvoyer alors ces deux champs clés.
C'est exacte, j'avais pas fais attention j'ai envoyé le code sur lequel j'ai effectué des tests pour essayer de trouver mon problème de liste. Mais sur le code original je récupère bien mon "CodeAuteur" et "CodeBd" encore désolé de cette erreur d'inattention de ma part.

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

22 déc. 2012, 14:47

Bon, ton programme fonctionne bien et surtout tes 2 listes. Je ne sais pas comment tu t'y prends pour l'exécuter? tu utilise le serveur Wamp ou easyphp?
Qu'est ce que tu entends par l’exécuter ? Ou sinon j'utilise Wamp (v 2.2)
Moi aussi j'utilise Wamp. Je veux dire : est-ce que tu teste juste le code que nous a posté ou bien tu teste toute une page où ce code existe. Dans ce cas l'erreur peut être à l’extérieur de cette partie du code. #-o
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Invité
Invité n'ayant pas de compte PHPfrance

22 déc. 2012, 15:30

Sur cette page je teste juste mes listes, mes requêtes SQL pour remplir les listes et un include pour de ma mise en page c'est tout.

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

22 déc. 2012, 21:19

Peux-tu nous envoyer le code source html de ta page après avoir afficher tes listes sur ton navigateur. Comme ça on pourra faire le même test grandeur nature que toi.

NB: Pour afficher le code source de la page web affichée sur un navigateur, faire un click-droit de la souris sur la page puis "code source de la page" ou "afficher la source" ou bien c'est aussi dans le menu "Affichage"
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène