Champ vide alors que non et code "bancal"...

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 : Champ vide alors que non et code "bancal"...

par ItaloBADI » 29 oct. 2005, 18:55

Merci.
Je note... :wink:

par Cyrano » 29 oct. 2005, 08:20

Pas de quoi :)

Un détail, en SQL normalisé, différent ne s'écrit pas "!=" mais"<>"

Ensuite, quand tu as une difficulté avec une requête, le plus rapide pour débugguer consiste à faire afficher ta requête générée (avec echo($requete); par exemple), à la copier, ouvrir ensuite phpMyAdmin, coller cette requête dans une fenêtre SQL et lancer l'exécution pour voir quel résultat est retourné : une erreur détaillée ou des résultat et dans ce dernier cas, vérifier si ce sont bien les résultats attendus.

par ItaloBADI » 29 oct. 2005, 02:27

Au fait.... :oops:


MERCI Cyrano pour le temps que tu m'as consacré aujourd'hui. :wink: :P

par ItaloBADI » 29 oct. 2005, 02:26

Bon, j'ai remplacé par ceci :
$req = "UPDATE informations 
SET terres_vierges='".$newterres_vierges."', 
    ble='0', 
    chasse='0',
    peche='0',	
    bois='0', 
    cueillette='0',
    rapport='".$newrapport."',
    argent='".$newargent."'".  	
" WHERE login != 'HOCHELAGA';";
$result = mysql_query($req) or die(mysql_error());  
Et c'est mieux là...

Le seul problème, vous le voyez dans le code, c'est que je dis :
QUAND login est différent d'HOCHELAGA.
au lieu de :
à chaque ligne, pour chaque login en fonction de ses propres données lol...
Je sais, dit comme ça, ça semble compliqué mais je veux que l'opération soit faite pour chaque login automatiquement.

Comme il y a déjà deux pages ici, et comme mon problème a évolué, je vais mettre ici RESOLU, et je vais chercher encore de mon côté....

MAIS comme je pense que je ne trouverai pas ( comment ça pessimiste ? lol ) j'ouvrirai une autre demande pour le prochain problème...

Là je vais chercher à faire deux choses :

1- que soient bien reconnus les champs du POSt, car pour le moment, j'ai juste contourné le problème sans réelle solution.

2- que cette opération s'applique à TOUS les logins de ma table, car avec une simple boucle et à tous ceux différents d'HOCHELAGa, ça le fait, mais à partir des données du PREMIER de la liste, et ça le met pour tous ! lol

par ItaloBADI » 28 oct. 2005, 23:25

Alors je teste et tout semble fonctionner jusqu'à cette requête :
      $sql_maj = "UPDATE informations ". 
               "SET terres_vierges='". $newterres_vierges ."', ". 
                   "ble='0', ". 
                   "chasse='0', ". 
                   "peche='0', ". 
                   "bois='0', ". 
                   "cueillette='0' ". 
				   "rapport='". $newrapport ."' ".
                   "argent='". $newargent ."' ".				   
               "WHERE login='".$login."'"; 
mysql_query($sql_maj);

aurais-je fait une erreur sur celle-ci pour qu'elle ne s'exécute pas ?


Je pense que le problème est la demande à la fin :
where login=login, sommes-nous toujours dans la boucle ?
Sinon, quel login ?

par ItaloBADI » 28 oct. 2005, 23:13

J'ai bien fait d'enlever toutes les références à [].
Je ne vais pas afficher les résultats dans un tableau là...

Voici mon code à ce stade :
<?
session_start();
include('connect.php');
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
   <head>
       <title>Traitement des récoltes</title>
       <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
	    <link rel="stylesheet" href="style/mj.css" type="text/css" />
   </head>
   <body> 
<div id="menu">
<?

// on crée la requête SQL 
$sql = "SELECT saison, annee FROM temps";

// on envoie la requête 
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); 

$data = mysql_fetch_assoc($req); 
{ 
$saison=$data['saison'];
$annee=$data['annee'];
} 
// on crée la requête SQL 
$sql = "SELECT login,argent,ble,chasse,peche,bois,cueillette, terres_vierges FROM informations WHERE login !='HOCHELAGA' AND login!='divers' ORDER BY id DESC";  
// on envoie la requête 
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); 
// on affiche les informations de l'enregistrement en cours 

while($data = mysql_fetch_assoc($req)) 
{ 
    $login = $data['login'];
	$argent = $data['argent'];
	$ble = $data['ble'];
	$chasse = $data['chasse'];
	$peche = $data['peche'];
	$bois = $data['bois'];
	$cueillette = $data['cueillette'];
	$terres_vierges = $data['terres_vierges'];
//je calcule les terres vierges pour les réinitialiser plus tard, à partir des terres mises en cultures avant transformation.
$newterres_vierges=$terres_vierges+$ble+$chasse+$peche+$bois+$cueillette;	  
	 
// On commence par récupérer les champs 
$nbble        = (isset($_POST['nbble']))        ? $_POST['nbble']        : ""; 
$nbchasse     = (isset($_POST['nbchasse']))     ? $_POST['nbchasse']     : ""; 
$nbpeche      = (isset($_POST['nbpeche']))      ? $_POST['nbpeche']      : ""; 
$nbbois       = (isset($_POST['nbbois']))       ? $_POST['nbbois']       : ""; 
$nbcueillette = (isset($_POST['nbcueillette'])) ? $_POST['nbcueillette'] : ""; 


// On vérifie si les champs sont vides 
if( 
    isset($_POST['nom_bouton_submit']) && 
    empty($nbble) && 
    empty($nbchasse) && 
    empty($nbpeche) && 
    empty($nbbois) && 
    empty($nbcueillette) 
) 
{ 
    echo '<p>Vous avez oublié de faire un choix de quota.</p><br/><br/><br/><br/> 
<span class="double"><a href="mj_terres.PHP">REVENEZ A VOTRE GESTION DES TERRES. </a></span>'; 
} 

// Aucun champ n'est vide, on peut enregistrer dans la table 
else  
    {
	 
	 $gainble=$ble*$nbble;
	 $gainchasse=$chasse*$nbchasse;
	 $gainpeche=$peche*$nbpeche;
	 $gainbois=$bois*$nbbois;
	 $gaincueillette=$cueillette*$nbcueillette;
	 $newrapport=$gainble+$gainchasse+$gainpeche+$gainbois+$gaincueillette;
	 $newargent=$argent+$newrapport;
	     // on envoie les données dans la table informations 
    $sql_maj = "UPDATE informations ". 
               "SET terres_vierges='". $newterres_vierges ."', ". 
                   "ble='0', ". 
                   "chasse='0', ". 
                   "peche='0', ". 
                   "bois='0', ". 
                   "cueillette='0' ". 
				   "rapport='". $newrapport ."' ".
                   "argent='". $newargent ."' ".				   
               "WHERE login='".$login."'"; 
    mysql_query($sql_maj); }
	 
	 //ON va  maintenant procéder à l'achat des denrées par la ville
	 // on crée la requête SQL 
$sql = "SELECT achatscolons FROM depenses WHERE date='".$annee."'";  
// on envoie la requête 
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); 
// on affiche les informations de l'enregistrement en cours 

$data= mysql_fetch_assoc($req); 

    $anciensoldachats = $data['achatscolons'];

	 $alldepenses=$newrapport;
	 
	 mysql_query("UPDATE depenses SET achatscolons=$anciensoldachats+$alldepenses WHERE date='".$annee."'"); 
	 
    // on insère les informations du formulaire dans la table 
    mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error()); 

	
	 //ON va  maintenant procéder à la vente automatique des denrées par la ville
	 $sql = "SELECT exportations FROM recettes WHERE date='".$annee."'";  
// on envoie la requête 
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); 
// on affiche les informations de l'enregistrement en cours 

$data= mysql_fetch_assoc($req); 

    $anciensoldexport = $data['exportations'];
	$export=$alldepenses*1.2;
	 mysql_query("UPDATE exportations SET achatscolons=$anciensoldexport+$export WHERE date='".$annee."'");
	
    // on insère les informations du formulaire dans la table 
    mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error()); 

    // on prévient le MJ que tout cela est fait
    echo '<p>Vous avez procédé aux ventes automatiques des produits des colons, à leur achat par la ville<br/>
	et à l\'exportation automatique de ces denrées.</p><br/><br/><br/><br/>
<span class="double"><a href="mj_terres.PHP">REVENEZ A VOTRE GESTION DES TERRES. </a></span>';}

    mysql_close();  // on ferme la connexion  
?> 
</div>
   </body>
</html>

par Cyrano » 28 oct. 2005, 23:00

Bien, on va commencer avec le formulaire : la sélection par défaut ne peut pas fonctionner normalement comme je l'ai expliqué juste avant, il manque donc un paramètre, ce qui donne:
<form action="mj_action_terres.php">
<b>Indiquez pour chaque produit un gain par are :<br/>
<?
function choixParDefaut($nombre, $liste) // Création de la fonction
{
    $par_defaut = null; // On crée une variable (vide par défaut) que l'on retournera à la fin

    if (isset($_POST[$liste])) // Si le visiteur a choisi un nombre
    {
        if ($_POST[$liste] == $nombre) // Si ce nombre correspond au nombre que l'on est en train de traiter
        {
            $par_defaut=' selected="selected"'; // Alors on modifie la variable que l'on retournera et on lui met selected
        }
    }
    return $par_defaut;
}
?>
Quota blé :
    <select name="nbble" >
    <option value=""></option>
    <option value="1"<? echo choixParDefaut('1', "nbble"); ?>>1</option>
    <option value="1.1"<? echo choixParDefaut('1.1', "nbble"); ?>>1.1</option>
    <option value="1.2"<? echo choixParDefaut('1.2', "nbble"); ?>>1.2</option>
    <option value="1.3"<? echo choixParDefaut('1.3', "nbble"); ?>>1.3</option>
    <option value="1.4"<? echo choixParDefaut('1.4', "nbble"); ?>>1.4</option>
    <option value="1.5"<? echo choixParDefaut('1.5', "nbble"); ?>>1.5</option>
    <option value="1.6"<? echo choixParDefaut('1.6', "nbble"); ?>>1.6</option>
    <option value="1.7"<? echo choixParDefaut('1.7', "nbble"); ?>>1.7</option>
    <option value="1.8"<? echo choixParDefaut('1.8', "nbble"); ?>>1.8</option>
    <option value="1.9"<? echo choixParDefaut('1.9', "nbble"); ?>>1.9</option>    
    <option value="2"<? echo choixParDefaut('2', "nbble"); ?>>2</option>
    <option value="2.1"<? echo choixParDefaut('2.1', "nbble"); ?>>2.1</option>    
    <option value="2.2"<? echo choixParDefaut('2.2', "nbble"); ?>>2.2</option>
    <option value="2.3"<? echo choixParDefaut('2.3', "nbble"); ?>>2.3</option>    
    <option value="2.4"<? echo choixParDefaut('2.4', "nbble"); ?>>2.4</option>
    <option value="2.5"<? echo choixParDefaut('2.5', "nbble"); ?>>2.5</option>
</select>
<br/>
Quota chasse :
    <select name="nbchasse" >
    <option value=""></option>
    <option value="1"<? echo choixParDefaut('1', "nbchasse"); ?>>1</option>
    <option value="1.1"<? echo choixParDefaut('1.1', "nbchasse"); ?>>1.1</option>
    <option value="1.2"<? echo choixParDefaut('1.2', "nbchasse"); ?>>1.2</option>
    <option value="1.3"<? echo choixParDefaut('1.3', "nbchasse"); ?>>1.3</option>
    <option value="1.4"<? echo choixParDefaut('1.4', "nbchasse"); ?>>1.4</option>
    <option value="1.5"<? echo choixParDefaut('1.5', "nbchasse"); ?>>1.5</option>
    <option value="1.6"<? echo choixParDefaut('1.6', "nbchasse"); ?>>1.6</option>
    <option value="1.7"<? echo choixParDefaut('1.7', "nbchasse"); ?>>1.7</option>
    <option value="1.8"<? echo choixParDefaut('1.8', "nbchasse"); ?>>1.8</option>
    <option value="1.9"<? echo choixParDefaut('1.9', "nbchasse"); ?>>1.9</option>    
    <option value="2"<? echo choixParDefaut('2', "nbchasse"); ?>>2</option>
    <option value="2.1"<? echo choixParDefaut('2.1', "nbchasse"); ?>>2.1</option>    
    <option value="2.2"<? echo choixParDefaut('2.2', "nbchasse"); ?>>2.2</option>
    <option value="2.3"<? echo choixParDefaut('2.3', "nbchasse"); ?>>2.3</option>    
    <option value="2.4"<? echo choixParDefaut('2.4', "nbchasse"); ?>>2.4</option>
    <option value="2.5"<? echo choixParDefaut('2.5', "nbchasse"); ?>>2.5</option>
</select>
<br/>
Quota pêche :
    <select name="nbpeche" >
    <option value=""></option>
    <option value="1"<? echo choixParDefaut('1', "nbpeche"); ?>>1</option>
    <option value="1.1"<? echo choixParDefaut('1.1', "nbpeche"); ?>>1.1</option>
    <option value="1.2"<? echo choixParDefaut('1.2', "nbpeche"); ?>>1.2</option>
    <option value="1.3"<? echo choixParDefaut('1.3', "nbpeche"); ?>>1.3</option>
    <option value="1.4"<? echo choixParDefaut('1.4', "nbpeche"); ?>>1.4</option>
    <option value="1.5"<? echo choixParDefaut('1.5', "nbpeche"); ?>>1.5</option>
    <option value="1.6"<? echo choixParDefaut('1.6', "nbpeche"); ?>>1.6</option>
    <option value="1.7"<? echo choixParDefaut('1.7', "nbpeche"); ?>>1.7</option>
    <option value="1.8"<? echo choixParDefaut('1.8', "nbpeche"); ?>>1.8</option>
    <option value="1.9"<? echo choixParDefaut('1.9', "nbpeche"); ?>>1.9</option>    
    <option value="2"<? echo choixParDefaut('2', "nbpeche"); ?>>2</option>
    <option value="2.1"<? echo choixParDefaut('2.1', "nbpeche"); ?>>2.1</option>    
    <option value="2.2"<? echo choixParDefaut('2.2', "nbpeche"); ?>>2.2</option>
    <option value="2.3"<? echo choixParDefaut('2.3', "nbpeche"); ?>>2.3</option>    
    <option value="2.4"<? echo choixParDefaut('2.4', "nbpeche"); ?>>2.4</option>
    <option value="2.5"<? echo choixParDefaut('2.5', "nbpeche"); ?>>2.5</option>
</select>
<br/>
Quota bois :
    <select name="nbbois" >
    <option value=""></option>
    <option value="1"<? echo choixParDefaut('1', "nbbois"); ?>>1</option>
    <option value="1.1"<? echo choixParDefaut('1.1', "nbbois"); ?>>1.1</option>
    <option value="1.2"<? echo choixParDefaut('1.2', "nbbois"); ?>>1.2</option>
    <option value="1.3"<? echo choixParDefaut('1.3', "nbbois"); ?>>1.3</option>
    <option value="1.4"<? echo choixParDefaut('1.4', "nbbois"); ?>>1.4</option>
    <option value="1.5"<? echo choixParDefaut('1.5', "nbbois"); ?>>1.5</option>
    <option value="1.6"<? echo choixParDefaut('1.6', "nbbois"); ?>>1.6</option>
    <option value="1.7"<? echo choixParDefaut('1.7', "nbbois"); ?>>1.7</option>
    <option value="1.8"<? echo choixParDefaut('1.8', "nbbois"); ?>>1.8</option>
    <option value="1.9"<? echo choixParDefaut('1.9', "nbbois"); ?>>1.9</option>    
    <option value="2"<? echo choixParDefaut('2', "nbbois"); ?>>2</option>
    <option value="2.1"<? echo choixParDefaut('2.1', "nbbois"); ?>>2.1</option>    
    <option value="2.2"<? echo choixParDefaut('2.2', "nbbois"); ?>>2.2</option>
    <option value="2.3"<? echo choixParDefaut('2.3', "nbbois"); ?>>2.3</option>    
    <option value="2.4"<? echo choixParDefaut('2.4', "nbbois"); ?>>2.4</option>
    <option value="2.5"<? echo choixParDefaut('2.5', "nbbois"); ?>>2.5</option>
</select>
<br/>
Quota cueillette :
    <select name="nbcueillette" >
    <option value=""></option>
    <option value="1"<? echo choixParDefaut('1', "nbcueillette"); ?>>1</option>
    <option value="1.1"<? echo choixParDefaut('1.1', "nbcueillette"); ?>>1.1</option>
    <option value="1.2"<? echo choixParDefaut('1.2', "nbcueillette"); ?>>1.2</option>
    <option value="1.3"<? echo choixParDefaut('1.3', "nbcueillette"); ?>>1.3</option>
    <option value="1.4"<? echo choixParDefaut('1.4', "nbcueillette"); ?>>1.4</option>
    <option value="1.5"<? echo choixParDefaut('1.5', "nbcueillette"); ?>>1.5</option>
    <option value="1.6"<? echo choixParDefaut('1.6', "nbcueillette"); ?>>1.6</option>
    <option value="1.7"<? echo choixParDefaut('1.7', "nbcueillette"); ?>>1.7</option>
    <option value="1.8"<? echo choixParDefaut('1.8', "nbcueillette"); ?>>1.8</option>
    <option value="1.9"<? echo choixParDefaut('1.9', "nbcueillette"); ?>>1.9</option>    
    <option value="2"<? echo choixParDefaut('2', "nbcueillette"); ?>>2</option>
    <option value="2.1"<? echo choixParDefaut('2.1', "nbcueillette"); ?>>2.1</option>    
    <option value="2.2"<? echo choixParDefaut('2.2', "nbcueillette"); ?>>2.2</option>
    <option value="2.3"<? echo choixParDefaut('2.3', "nbcueillette"); ?>>2.3</option>    
    <option value="2.4"<? echo choixParDefaut('2.4', "nbcueillette"); ?>>2.4</option>
    <option value="2.5"<? echo choixParDefaut('2.5', "nbcueillette"); ?>>2.5</option>
</select>  
<input type="submit" value="LE SAMEDI, achat par HOCHELAGA des produits des colons provenant des terres." />
</form>
Là, ce sera plus logique et il n'y aura pas de conflit.

Le problème des [] maintenant. ça indique un tableau. Associatif ou indexé. Pour mémoire, un tableau indexé a pour index des nombres entiers, un tableau associatif a pour index des noms :
// Tableau indexé:
$tab[0] = "x";
$tab[1] = "y";
//etc...

// Tableau associatif;
$tab['nom_1'] = "x";
$tab['autre_nom'] = "y";
//...
La variable super-globale $_POST par exemple un tableau assoicatif et on cherche des index nommés.

En revanche, mysql_fetch_rows retourne un tableau indexé donc les index vont de 0 à n, 0 étant l'index pour le premier champ recherché dans la requête, 1 pour le second, etc...

par ItaloBADI » 28 oct. 2005, 23:00

JE TESTE si j'ai récupéré les champs:

Notice: Undefined index: nbble in c:\hochelagajpem\mj_action_terres_test.php on line 98


Notice: Undefined index: nbchasse in c:\hochelagajpem\mj_action_terres_test.php on line 99


Notice: Undefined index: nbpeche in c:\hochelagajpem\mj_action_terres_test.php on line 100


Notice: Undefined index: nbbois in c:\hochelagajpem\mj_action_terres_test.php on line 101


Notice: Undefined index: nbcueillette in c:\hochelagajpem\mj_action_terres_test.php on line 102

par ItaloBADI » 28 oct. 2005, 22:58

Même en changeant la forme du formulaire, ça ne change rien, les champs ne sont pas transmis il me semble...

par ItaloBADI » 28 oct. 2005, 22:47

Désolé, j'éditais quand tu as répondu...

Cyrano, regarde le code de départ , j'avasi utilisé des [] dans lesquels je mettais après des $i ....

Or, voilà quelque chose que je ne maîtrise pas...
J'ai repris ça dans un code qu'on m'avait donné, mais je ne sais pas l'utiliser, donc je viens de l'enlever dans tout mon code pour voir, mais rien lol....

Là, je teste donc le formulaire, car le problème vient bien des champs qui sont bien remplis mais non transmis en réalité...

par Cyrano » 28 oct. 2005, 22:47

Je viens de m'attarder sur ton formulaire, ça marche pas ton système: tu ne testes pas les bonnes valeurs, ou alors il m'en manque un bout : dans la fonction, tu testes $_POST['nombre'] qui ne correspond à aucune des listes déroulantes du formulaire. Est-ce que tu n'aurais pas un problème à ce niveau là ?

par Cyrano » 28 oct. 2005, 22:42

:shock: J'ai dû louper une marche... où ça ?

par ItaloBADI » 28 oct. 2005, 22:37

Bien, je suis en train de tester.

Je réécris ma page ( copier-coller dans une nouvelle page ) en testant par des 'echo' ce que je suis en train d'afficher.

Et en fait, les champs ne sont pas récupérés, c'est ça le problème.

TOUT se calcule à partir de ces quotas, et ils son inexistants.

Je vais changer le formulaire, au lieu d'un menu déroulant, je vais mettre une ligne pour voir si le problème vient de là...

par ItaloBADI » 28 oct. 2005, 22:29

Oui, c'est un peu ce que je tente de faire.

je vais donc tester ligne à ligne, ce qui m'étonne c'est que normalement, ça devrait au moins faire les UPDATE et changer quelque chose, même si les résultats sont loin de ceux escomptés, et là, RIEN de rien.

Je cherche donc où ça ne fonctionne plus...

par Cyrano » 28 oct. 2005, 22:24

Pour trouver ce genre d'erreur, il faut cerner le coupable petit à petit: il faut que tes tests offrent des alternatives, à un if() doit correspondre un else avec un résultat différent. Quand tu arrives à un endroit où tu ne devrais pas arriver, il y a forcément une raison. Si une variable n'est pas remplie, il faut la faire afficher en remontant petit à petit dans le code. À un moment donné, tu retrouves des valeurs normales: là, ça devient intéressant parce que ça veut dire que tu as remonté un cran plus loin que l'erreur et ça se passe entre le dernier test concluant et le précédent qui a loupé: entre les deux, il faut chercher l'erreur de syntaxe, le nom de variable mal orthographié, l'appel à une fonction qui ne retourne pas la valeur attendue... et là on dévie vers une autre possibilité d'erreur qui en fin de compte est dans un autre script. etc, etc...

Est-ce que tu saisi ce système ?