8725 sujets

Développement web côté serveur, CMS

Pages :
Bonjour,

Je cale pour récupérer 3 valeurs différentes d'un formulaire (hauteur, largeur et épaisseur).
Voici le code de mon formulaire :

<label for="dimensions">Dimensions en mm : </label>
<input type="text" name="hauteur"size="20" maxlength="20"  value="hauteur :" />
<input type="text" name="largeur"size="20" maxlength="20" value="largeur :" />
<input type="text" name="epaisseur"size="20" maxlength="20" value="épaisseur :" />


A l'affichage de mon formulaire, j'ai donc "Dimensions :" puis, sur la même ligne, 3 petites zones de texte, avec pré-rempli à l'intérieur : "hauteur :", "largeur :" et "épaisseur :".

Impossible de récupérer quoi que ce soit avec le traitement du formulaire. Je souhaiterais récupérer un $hauteur, un $largeur et un $epaisseur. Impossible, tout le traitement est bloqué. Idem en tentant de récupérer $dimensions ???

Un grand merci par avance si vous avez des suggestions surtout un vendredi soir Smiley cligne . Je pense qu'il faudrait procéder autrement au niveau du formulaire ?
Evelyne
Administrateur
Bonjour,

tout input doit avoir son label associé via les attributs respectifs for et id. Ou au minimum un attribut title sur l'input.
Pour regrouper plusieurs éléments de formulaire liés entre eux, il y a l'élément fieldset et son 1er enfant l'élément legend.

Dans l'idée ça donne ça :

<fieldset>
  <legend>Dimensions en mm :</legend>
  <p><label for=aaa">Hauteur : <input type="text" name="hauteur" size="20" maxlength="20" id="aaa"></label></p>
  <p>
    <label for="bbb">Largeur :<label>
    <input type="text" name="largeur" size="20" maxlength="20" id="bbb">
  </p>
  <p>
    <label for="ccc">Épaisseur :<label>
    <input type="text" name="epaisseur" size="20" maxlength="20" id="ccc">
  </p>
</fieldset>


EDIT : j'ai volontairement mélangé 2 manières d"écrirer label et input : input dans le label (mais tout de même associé via for/id avec la même valeur aaa) ou input avant/après label, peu importe. La 1ère méthode est plus mieux pour des raisons pas apparentes au départ mais les 2 feront l'affaire. L'important c'est "Un input ? Un label (unique) !" et for/id Smiley smile

Si la bordure grise ou le positionnement de la légende plaisent pas, ça se style très bien à coup de border: none; et de flottants ou autre.
Il n'y a qu'IE7- qui requiert pour le legend la manière forte à coup de positionnement absolu...
Et Firefox qui nécessite qu'on style "fieldset > legend" (ou "fieldset legend" peu importe) et pas simplement legend parce que par défaut c'est avec un sélecteur composé de ces 2 éléments qu'il style la légende et que le sélecteur "legend" a moins de poids... Erf

EDIT2: et bien entendu le lien vers Openweb qui va bien : Utilisation des formulaires (ex-formulaires accessibles)
Modifié par Felipe (09 Mar 2013 - 10:51)
Outre le fait que le formulaire ne soit pas propre (voir message de Felip), ça ne se récupère pas comme ça côté PHP.

Soit ton formulaire est en "method" "GET":

$_GET['hauteur']


Soit ton formulaire est en "method" "POST":

$_POST['hauteur']


Après, je sais pas si ça pose problème, mais entre l'attribut "name" et l'autre attribut, il n'y a pas d'espace :

name="hauteur"size="20"


==>

name="hauteur" size="20"
Bonsoir Super_baloo8 et Felipe,

Comment vous remercier pour vos réponses ô combien utiles en plus un vendredi soir ? Smiley biggrin

Je viens de tester pour l'affichage la méthode du <fieldset>, c'est une super idée et je vais l'utiliser pour d'autres parties de mon formulaire. Juste quelques petits ajustement à régler en CSS.

Il me reste à tester le traitement du formulaire et l'insertion dans la bdd.

Mon formulaire est en méthode POST.
Bien vu pour l'absence d'espace entre l'attribut "name" et l'attribut "size".

Je teste tout ça en traitement et insertion dans la bdd et je vous tiens au courant.

Je suis bien consciente que mon travail n'est pas très propre mais je fais le max et je pense bien m'améliorer... grâce à ce forum.

Très bonne soirée et 1.001 mercis,
Evelyne
Bonsoir,
Il est un peu tard pour avoir encore les idées claires depuis 8h ce matin Smiley decu .
J'ai rectifié selon vos remarques et j'obtiens le message d'erreur suivant :
Erreur sur la requete : INSERT INTO ECHANTILLON(numEchantillon, GITE_ID_gite1, BAC_ID_bac, ROCHE_ID_roche, COULEUR_ID_couleur, anneePrelevementE, hauteurE) VALUES('019', '67', '20', '3', '2', '2' '2') |Column count doesn't match value count at row 1


En fait tout va bien jusqu'à la récupération de la couleur (valeur = 2). Pour "anneePrelevement" j'obtiens "2" et cela devrait être "2013" ???
Et pour "hauteurE" j'obtiens "2" également au lieu de "20 mm" ???

Je précise qu'en faisant un echo j'ai bien 2013 et 20 mm.

Je sature et j'
désolée, message précédent parti trop vite (cf l'heure qu'il est ?).

Je reprends : je sature et ce post n'est que le 1er, d'autre suivront.

Je ne me décourage pas du tout Smiley biggrin

Merci,

Evelyne
Précision message d'erreur sql :
Quand je fais un echo $anneePrelevement c'est ok : "2013"
Idem pour le echo $hauteur : "20" (pour 20mm).
Mais lors de l'insertion dans la bdd j'ai en value :
- pour anneePrelevement : "2"
- pour hauteur : "2"
D'où sort ce "2" ?????
Merci pour vos suggestions/idées/conseils.....
Evelyne
Bonsoir Lothindil,

.....
if (isset($_POST["anneePrelevement"])
	&&isset($_POST["hauteur"]) )
{
$anneePrelevement = $_POST["anneePrelevement"];
$hauteur = $_POST["hauteur"];

    echo $anneePrelevement;
    echo '<br />' ;
    echo $hauteur;
    echo '<br />' ;
}
$sql = SQLInsert("INSERT INTO ECHANTILLON(numEchantillon, GITE_ID_gite1, BAC_ID_bac, ROCHE_ID_roche, COULEUR_ID_couleur, anneePrelevementE, hauteurE) VALUES('" . $numEchantillon . "',
            '" . $data["ID_gite"] . "', 
            '" . $data2["ID_bac"] . "',
            '" . $roche["ID_roche"] . "',
            '" . $couleur["ID_couleur"] . "',
            '" . $anneePrelevement["anneePrelevement"] . "'
            '" . $hauteur["hauteur"] . "')
            ");
			$ID_echantillon = mysql_insert_id();  
}

J'espère répondre correctement à ta question. Merci pour ta réponse.
Evelyne
Euh pourquoi ceci :

$anneePrelevement["anneePrelevement"]


Cela suffirait amplement:

$annePrelevement


Je ne sais pas si ça vient de là, mais en tout cas, c'est sur, ta variable tel que présenté n'est pas un tableau (array)
Bonsoir Super_baloo8,
J'espère que tu es toujours là ? un samedi soir ?
Cet après-midi j'ai repris mon formulaire et son traitement mais je suis toujours bloquée.
Un des -certainement- nombreux problèmes vient de 2 array où j'ai le message d'erreur :
Notice: Array to string conversion ...

En reprenant ton message tu me dis que ma variable telle que présentée n'est pas un tableau (array). Pourrais-tu STP m'expliquer ce que tu veux dire ?
Je mets le code de ma requête (parcoursRS... c'est une fonction dans un fichier à part) :
    $query = parcoursRS(SQLSelect("
    	SELECT ID_gite
    	FROM GITE
    	WHERE numGite = '" . $numGite . "'
     "));
    foreach ($query as $data);

Et quand je fais un echo $date je n'ai rien.
Vraiment merci d'avance si quelqu'un pouvait me débloquer et très bonne soirée à tous/toutes,
Evelyne
Evelyne31 a écrit :

En reprenant ton message tu me dis que ma variable telle que présentée n'est pas un tableau (array). Pourrais-tu STP m'expliquer ce que tu veux dire ?

Pour faire bref (et approximatif, mais bon, c'est samedi soir ^^)

$blabla c'est une variable
$blabla="string" c'est un "string" (une chaîne de caractère) dans une variable
$blabla['array'] c'est que ta variable est un array (tableau)
$blabla=array('tableau') c'est une autre manière de créer un tableau
$blabla=3 c'est un integer (ou int, nombre entier)
$blabla=3.14 c'est un float (ou nombre à virgule flottante)

Maintenant ton erreur :
Notice: Array to string conversion ...

Php t'annonce que :
1) Notice = une erreur non-critique qui ne l'empêche pas de continuer
2) Conversion = il transforme un type en un autre type
3) Array to string = il a transformé un faux array en chaîne de caractère.

Le résultat du 2+3 est très aléatoire et peut donner des résultats assez marrant. Avoir une valeur qui devient 2 est tout à fait possible.


D'où vient ton soucis ?

Tu initialises (crées) tes variables ainsi :

$anneePrelevement = $_POST["anneePrelevement"];
$hauteur = $_POST["hauteur"];


$anneePrelevement et $hauteur sont des types "string" par défaut, que ça soit des chiffres ou autre.
$_POST est d'ailleurs un array.


Ensuite tu les utilises ainsi :

$anneePrelevement["anneePrelevement"]
$hauteur["hauteur"]

Tu demandes donc à PHP d'utiliser une variable non-tableau comme étant un tableau. Faut pas s'étonner à ce qu'il te fasse des résultats louches ^^


Ensuite ta requête est fausse en sql, il lui manque une virgule entre l'année de prélèvement et la hauteur.


Ensuite, j'ai un doute... tu codes en asp ou c'est une erreur de tutoriel ? (parce que tu utilises "sqlInsert()" qui est une fonction en asp.... et "mysql_insert_id" qui existe en php et sans équivalent direct en asp Smiley rolleyes

(au passage, asp ou php, ça ne change rien à toute la première partie de mon texte^^)
Bonsoir Lothindil,
Super d'avoir une réponse un samedi soir et surtout qui explique bien les choses,merci.
Donc, si je comprends :
$anneePrelevement : c'est ma variable de type "string" par défaut,
$_POST["anneePrelevement"]; : c'est un array

Quand je code :
$anneePrelevement["anneePrelevement"] 

PHP doit passer d'un type "string" à un array et ça pose problème.

Je suis désolée mais je ne vois pas comment procéder, pourtant je comprends tes explications il me semble ?
Je soumets un exemple avec mes commentaires pour anneePrelevement :
- je récupère ce qui est envoyé par le formulaire dans une variable/array $_POST :
isset($_POST['anneePrelevement'])

- j'initialise la variable type string $anneePrelevement (= je transfère/stocke le résultat du array $_POST dans cette nouvelle variable) :
$anneePrelevement = $_POST['anneePrelevement'];

- je l'affiche : echo $anneePrelevement;
Ca fonctionne mais est-ce correct ?

Ce qui ne fonctionne pas :
$query = parcoursRS(SQLSelect("
    	SELECT ID_gite
    	FROM GITE
    	WHERE numGite = '" . $numGite . "'
     "));
    foreach ($query as $data);

Un echo $data; me renvoie "Notice: Array to string conversion..." Je comprends le problème mais comment faire ?

Je code en PHP. sqlInsert est l'appel d'une fonction dans un fichier à part.

Un grand merci par avance et une très bonne fin de soirée,
Evelyne
Evelyne31 a écrit :
Bonsoir Lothindil,
Super d'avoir une réponse un samedi soir et surtout qui explique bien les choses,merci.
Donc, si je comprends :
$anneePrelevement : c'est ma variable de type &quot;string&quot; par défaut,
$_POST[&quot;anneePrelevement&quot;]; : c'est un array

Quand je code :
$anneePrelevement[&quot;anneePrelevement&quot;] 

PHP doit passer d'un type &quot;string&quot; à un array et ça pose problème.

Je suis désolée mais je ne vois pas comment procéder, pourtant je comprends tes explications il me semble ?
Je soumets un exemple avec mes commentaires pour anneePrelevement :
- je récupère ce qui est envoyé par le formulaire dans une variable/array $_POST :
isset($_POST['anneePrelevement'])

- j'initialise la variable type string $anneePrelevement (= je transfère/stocke le résultat du array $_POST dans cette nouvelle variable) :
$anneePrelevement = $_POST['anneePrelevement'];

- je l'affiche : echo $anneePrelevement;
Ca fonctionne mais est-ce correct ?
Oui, jusque là c'est correct.

Ton soucis c'est dans ton "sqlInsert" :
$anneePrelevement["anneePrelevement"].

Là tu transformes $anneePrelevement en $anneePrelevement['anneePrelevement']. Et PHP n'aime pas ^^



a écrit :
Ce qui ne fonctionne pas :
$query = parcoursRS(SQLSelect(&quot;
    	SELECT ID_gite
    	FROM GITE
    	WHERE numGite = '&quot; . $numGite . &quot;'
     &quot;));
    foreach ($query as $data);

Un echo $data; me renvoie &quot;Notice: Array to string conversion...&quot; Je comprends le problème mais comment faire ?

Je code en PHP. sqlInsert est l'appel d'une fonction dans un fichier à part.

Un grand merci par avance et une très bonne fin de soirée,
Evelyne
Que donne un var_dump($query) ? juste après ta requête (var_dump te permet de voir exactement à quoi ressemble le contenu d'une variable ^^ plutôt pratique en débuggage)
Bonsoir Lothindil,
Alors là, super pour var_dump($query) que je ne connaissais pas.
Cela me donne :
array(1) { [0]=> array(1) { ["ID_gite"]=> string(2) "67" } } array(1) { [0]=> array(1) { ["ID_bac"]=> string(2) "20" } } 

J'ai 2 requêtes SQL pour récupérer 2 ID, une pour un gîte et une pour un bac.
avec "var_dump" j'ai plus de détails.
J'ai donc array(1) pour les 2 requêtes. Je ne vois pas à quoi cela correspond ?
Ensuite j'ai, toujours pour les 2 requêtes "string(2)". Je ne vois pas non plus ?
Puis j'ai "67" pour ID_gite et c'est OK et "20" pour ID_bac et c'est OK aussi.
Mais pourquoi cela ne s'affiche pas avec echo ?
Je vois bien ici encore que tu as raison, il y a un problème array/string, c'est clair, mais que faire ?
Pour mon sqlInsert j'ai rectifié mais le problème ci-dessus bloque.
Merci et bonne soirée/nuit, je suis contente d'avancer grâce à toi.
Evelyne
Ce qu'il t'explique c'est que ta variable "query" ressemble à ça là première fois
$query[0]['ID_gite']="67"


et à ça la 2ème fois :
$query[0]['ID_bac']="20"


Ce qui explique que ton foreach plante. Ton foreach parcours $query et dis que la valeur s'appelle désormais $data.

Si tu fais un var_dump dans le foreach sur $data, tu verras qu'elle ressemble à ça :

$data['ID_gite']="67", ce qui, en var_dump donne :

array(1) { ["ID_gite"]=> string(2) "67" }


Ce qui explique l'erreur php, vu que tu echo une variable tableau comme si c'était un string ^^

Pourquoi ça fait ça ? sans doute parce que ta fonction parcoursRS crée un tableau pour prévoir le cas où il y aurait plusieurs lignes dans le résultat de ton select.


Pour mieux décomposer le var_dump, il agit toujours selon la même séquence :
- type de variable (array, string, int,...)
- longueur de la variable (nombre de champs pour un array, nombre de caractère pour un string, nombre de chiffre pour un int)
- le contenu de la variable.

Ce qui donne en décomposant ton premier query :
query est un array, avec 1 seul champ, ayant une certaine valeur
cette valeur [0] est un array, avec un seul champ ayant aussi une valeur
cette dernière valeur est un string de 2 chiffre "67"
Modifié par Lothindil (10 Mar 2013 - 14:00)
Bonjour Lothindil,

Je te remercie pour ces explications, c'est très clair. Je vais utiliser var_dump à présent au moindre souci.
Mais que faire pour régler ce problème de conflit string/tableau ? Si je comprends bien tu me dis que le problème viendrait de ma fonction. Pourtant j'utilise ce fichier de fonctions depuis plus d'un an et tout allait bien ?
Puisque la fonction "parcoursRS" semble poser problème, j'ai testé avec une autre qui permet de récupérer un seul champ, là j'ai un autre message d'erreur :
Warning: Invalid argument supplied for foreach()
et var_dump n'affiche rien ?
Je mets ci-dessous les 2 fonctions que j'ai testées, si tu avais le temps de regarder pour voir ce qui ne va pas ce serait super sympa.
Je t'en remercie par avance et te souhaite une bonne fin de journée,
Evelyne

parcoursRS :
* Parcours les enregistrements d'un résultat mysql et les renvoie sous forme de tableau associatif
 * On peut ensuite l'afficher avec la fonction print_r, ou le parcourir avec foreach
 * @param resultat_Mysql $result
 */
function parcoursRs($result) {
    if ($result == false)
        return array();
    while ($ligne = mysql_fetch_assoc($result))
        $tab[] = $ligne;
    return $tab;
}


et SQLGetChamp :
function SQLGetChamp($sql) {
    global $BDD_host;
    global $BDD_base;
    global $BDD_user;
    global $BDD_password;

    mysql_pconnect($BDD_host, $BDD_user, $BDD_password) or die("<font color=\"red\">Erreur de connexion : " . mysql_error() . "</font>");
    mysql_select_db($BDD_base) or die("<font color=\"red\">Erreur select db : " . mysql_error() . "</font>");
    mysql_query("SET NAMES 'utf8'");
    $rs = mysql_query($sql) or die("Erreur sur la requete : <font color=\"red\">$sql</font>");
    $num = mysql_num_rows($rs);

    // On pourrait utiliser mysql_fetch_field() ??

    if ($num == 0)
        return false;

    $ligne = mysql_fetch_row($rs);
    if ($ligne == false)
        return false;
    else
        return $ligne[0];
}
Tes fonctions marchent très bien, rassure-toi ^^ elles sont juste faites pour prévoir le retour de plusieurs enregistrements dans un select. J'ai +/- la même (à part que la mienne crée des objets, mais c'est autre chose ^^).

Le soucis c'est pas la fonction, mais comment tu utilises ce qu'elle produit.

Elle te produit une variable $var[0]['ID_gite'] et toi tu l'utilises comme étant $var['ID_gite'].

A partir de là, 2 possibilités.

Solution 1: tu es certain que ton select ne te retourne qu'un seul enregistrement. Dans ce cas, tu fais au plus vite, au lieu de parcourir le tableau $var, tu parcours $var[0].

foreach($var[0] as $data)
{
 //ce que tu veux faire de data
}


Solution 2 : tu sais pas combien d'enregistrement ton select te retourne. Dans ce cas, tu fais un double foreach. Le premier va parcourir $var, le second va parcourir le tableau issus de $var (soit $var[0], $var[1], $var[2],...)

foreach($var as $tmp)
{
   foreach($tmp as $data)
   {
        //ce que tu veux faire de data
   }
}
Bonjour Lothindil,
C'est vraiment super comme tu expliques, je te remercie pour cette nouvelle réponse.
Je mets tout ça au propre pour que ce soit bien clair et enregistré puis je teste et j'espère dans la foulée mettre ce post en résolu.
Je te tiens informé et te souhaite une très bonne journée,
Evelyne
Re-Bonjour,
Merci à tous/toutes pour votre aide, particulièrement Lothindil, mon problème est résolu.
De plus, j'ai appris et compris plein de choses nouvelles.
Mais le traitement de mon formulaire n'est pas terminé pour autant, je bute déjà sur un autre problème. Je mets ce post en résolu et en émets un nouveau.
Je vous souhaite une excellente journée et encore merci.
Evelyne
Pages :