[RESOLU] Effacer un écran en php

Guillemein
Invité n'ayant pas de compte PHPfrance

27 févr. 2012, 16:05

Bonjour,
J'ai un écran de saisie pour renseigner des zones afin d'aller rechercher sur une base Mysql les enregistrements correspondants à ma saisie.
Avec ces enregistrements j'affiche un tableau des enregistrements trouvés, jusque là tout va bien.

Seulement quand j'affiche ce tableau, il se mets en superposition avec ma grille de saisie.

Je voudrais donc que la grille de saisie s'efface pour afficher sur l'écran uniquement mon tableau résultat.
Je précise que ma grille de saisie est dans un <form> et mon tableau dans un autre <form> avec un bouton submit pour retour à la grille de saisie pour une autre recherche.
J'ai essayé de rajouter un ncurses_clear(), mais il me provoque une erreur Call to undefined function (je suis en php 5.3.3 sous Apache).
Par contre l'appui sur le bouton retour du tableau me raffiche bien ma grille de saisie et là le tableau n'est plus à l'écran.
Je précise également que les éléments de ma grile de saisie sont affichés d'aprés une position: absolute en css, peut être la cause ??
Merci de vos réponses.

Voici un extrait de ce programme :

Extrait css :

.cadre_a3 {
position: absolute;
top: 150px;
left: 450px;
width: 300px;
height: 30px;
text-align: center;
border-top: 1px solid #333333;
border-left: 1px solid #333333;
border-right: 1px solid #333333;
border-bottom: 1px solid #333333;
background-color: #dee5f4;

Extrait source php :

$mode = empty($_POST['mode']) ? 'SAISIE': $_POST['mode'] ;
$var1 = isset($_POST['nom_nc']) ? $_POST['nom_nc'] : '';
$var2 = isset($_POST['prenom_nc']) ? $_POST['prenom_nc'] : '';
$var3 = isset($_POST['age_nc']) ? $_POST['age_nc'] : '';

function Affiche_enreg ($var1, $var2, $var3)
{
$sqltmp = "select ...";
$result = mysql_query($sqltmp);
if (mysql_num_rows( $result ) == 0 )
{
echo "<script>alert(\"Il n'existe aucun enregistrement correspondant à la demande \")</script>";
}
else
{
print("<form action=\"".$_SERVER['PHP_SELF']."\" method=\"post\">");
print("<div align=center><table border=1>");
print("<tr><th> Nom</th><th>Prénom</th><th>Age</th></tr>\n");
while (list($var1, $var2, $var3) = mysql_fetch_row($result))
{
print("<tr><td>$var1</td><td>$var2</td><td>$var3</td></tr>\n");
}
print("</table></div><br>");
print("<div align=center><input type=submit value=\"Retour\")></div>");
ncurses_clear();
print('</form>');
}
}


function Saisie_Recherche()
{

print("<form action=\"".$_SERVER['PHP_SELF']."\" method=\"post\">");
print("<BR><div align=center><font size=+3>RECHERCHE D'ENREGISTREMENTS</font></div><BR><BR><br>");
print("<div class=\"cadre_a3\">Saisie des éléménts recherchés</div>");
print("<div class=\"cadre_a4\"><br>Nom<br><br>Prénom<br><br>Age</div>");
print("<div class=\"cadre_a5\"><br>");
print("<input type=text name=nom_nc><br><br>");
print("<input type=text name=prenom_nc><br><br>");
print("<input type=text name=age_nc><br><br>");
print("</div>");

print("<div class=\"cadre_a9\">");
print("<input type=hidden name=mode value=RECHERCHE>");
print("<input type=submit value=\"Recherche\" name=ok>");
print("</div>");
print('</form>');
}


Connect_Base();
switch ($mode)
{
case 'SAISIE' :
Saisie_Recherche();
break;
case 'RECHERCHE' :
Affiche_enreg ($var1, $var2, $var3);
Saisie_Recherche();
break;
}

ViPHP
xTG
ViPHP | 7331 Messages

27 févr. 2012, 16:11

PHP -> côté serveur ;)
Donc l'affichage c'est pas lui.

Ton problème est purement CSS, regardes du côté de l'attribut CSS z-index.

Eléphant du PHP | 179 Messages

27 févr. 2012, 16:13

Oula oula, si tu veux faire quelque chose de dynamique -> Javascript + Ajax. Le dynamisme en php pur, je ne pense pas que ceci soit possible ( enfin j'en suis sur vu que c'est un langage serveur ).

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

27 févr. 2012, 16:15

je pense qu'une bonne conception (un if / else) devrait t'aider.

tu choisis d'afficher la validation du formulaire ou le formulaire s'il n'as pas était soumis.


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

Guillemein
Invité n'ayant pas de compte PHPfrance

27 févr. 2012, 18:59

En supprimant l'appel de ma fonction de saisie après l'appel de Affiche_enreg, çà marche, le tableau s'affiche et attends l'appui sur Retour, une fois cliqué sur ce bouton, le tableau s'efface et me réaffiche ma grille de saisie, ceci est (sûrement) dû à ma variable mode qui ne change pas et reste toujours à GRILLE et comme on repasse dessus après le submit ...
donc tout va bien.

Par contre un autre petit problème se pose à moi,

Dans mon tableau j'ai des noms composés séparés par des espaces et il s'affiche autant de lignes que de mots, comment faire pour afficher plusieurs mots à la suite dans une cellule ?
De plus la longueur d'une cellule s'aligne sur la longueur du plus grand mot, malgré un width défini en css, là aussi comment faire pour avoir une cellule à une largeur définie ?

Merci de vos réponses.

ViPHP
xTG
ViPHP | 7331 Messages

27 févr. 2012, 20:13

HTML ne sait pas couper un mot en deux c'est normal.
Mais tu peux utiliser la propriété CSS overflow pour régler ceci.

Guillemein
Invité n'ayant pas de compte PHPfrance

28 févr. 2012, 09:56

merci mais de quelle manière utiliser cet overflow et à quel endroit ?
merci d'avance

ViPHP
xTG
ViPHP | 7331 Messages

28 févr. 2012, 10:46

Un peu de recherche ne fait pas de mal...
http://www.w3schools.com/cssref/pr_pos_overflow.asp

Guillemein
Invité n'ayant pas de compte PHPfrance

28 févr. 2012, 12:54

Pourtant je vous assure que j'en fait des recherches sur tous les forums et les cours, mais je n'ai jamais une réponse qui me permette de finaliser mes problèmes.
Sûrement que je suis dur à comprendre, vous savez à 70 ans se mettre à un langage après plus de 10 ans sans toucher à l'informatique c'est pas évident.
Voilà l'ensemble de ce tableau qui me pose problème :
Je veux un tableau avec l'entête fixe et le corps du tableau qui puisse défiler.
Voilà une partie de mon code concernant ce tableau :

---
{
print("<form action=\"".$_SERVER['PHP_SELF']."\" method=\"post\">");
print("<table width=630 height=300 border><caption>Enregistrements pour $resultat</caption>");
print("<thead><tr>");

print("<th width=70px>Commune</th>");
print("<th width=30px>Naissance</th>");
print("<th width=50px>Nom</th>");
print("<th width=50>Prénom</th>");

print("</tr></thead>");

print("<tbody><tr><td>");
print("<div overflow:auto>");
print("<table>");

$ligne = 0;
while (list($s_paroisse, $s_date_n, $s_nom, $s_prenom) = mysql_fetch_row($result))
{
if ($ligne == 0)
{
print("<tr>");
$ligne = 1;
}
else
{
print("<tr background: #fff>");
$ligne = 0;
}
print("<td width=70>$s_paroisse</td>");
print("<td width=30>$s_date_n</td>");
print("<td width=50>$s_nom</td>");
print("<td width=50>$s_prenom</td>");
print("</tr>");
}
print("</table></div><br>");
print("</td></tr></tbody></table>");
print("<div align=center><input type=submit value=\"Retour\")></div>");
print('</form>');
}
---

En sortie j'ai l'entête comme ceci :

------------------------------------------------------------------------
| Commune |Naissance| Nom |Prénom |
|------------------------------------------| |
|Paris 01/01/1970 TOTO Prénom |
| .....


J'ai donc la cellule th commune de l'entête qui recouvre les 4 cellules td et sous les cellules th naissance, nom et prénom je n'ai rien.
je n'ai pas d'ascenseur à droite (malgré mon overflow:auto ou même scroll), mais je peux quand même défiler avec la souris.
Mais en défilant l'entête remonte, elle ne reste pas fixe.
Mes largeurs de cellule s'alignent sur le plus grand mot et non sur ma largeur que j'ai définie.

Donc mes questions, qu'est ce que j'ai fait ou pas fait dans ce code qui ne convient pas ?
Je souhaiterais que les cellules th de l'entête correspondent aux cellules td des lignes du tableau.
Je souhaiterais qu'il y ait un ascenseur sur la droite et que mon entête reste fixe.
Je souhaiterais alterner une ligne sur 2 avec une couleur (pourtant testé et non pris en compte).
Je souhaiterais que les mots composés s'affichent sur une seule ligne (par ex un prénom comme Jean Marie est écrit sur 2 lignes)
Je souhaiterais que les largeurs définies par mes width soient bien prises en compte.
Et de plus le bouton input type=submit value=\"Retour\" de l'avant dernière ligne ne s'affiche pas car le tableau prend tout l'écran.

J'essaie tout un tas de variantes et je n'arrive toujours pas, alors merci beaucoup si vous pouvez me sortir de ce pétrin.

Amicalement.

Guillemein
Invité n'ayant pas de compte PHPfrance

28 févr. 2012, 13:12

En fait l'ascenseur y est bien et mon bouton retour aussi, mais le tableau fait la hauteur de toutes les lignes de mon fichier malgré la largeur et la hauteur que j'ai pourtant défini en witdh et height dans <table> et là non plus ce n'est pas pris en compte.

ViPHP
ViPHP | 2577 Messages

28 févr. 2012, 17:27

Ce sont de problèmes html et CSS.

print("<tr style="background: #fff>"); (ca doit mieux marcher pour les lignes alternées)

J'aime bien faire $ligne = 1 - $ligne pour alterner 0 et 1

Il faut supprimer le second <table> pour que tes colonnes soit alignées sur les titres (un seul tableau, pas 2).

Il faut remplacer les blancs par des blancs insécable pour ne pas avoir de passage à la ligne : & n b s p ; (sans les blancs)

Les largeurs de colonnes sont des choses capricieuses : ca fait pour le mieux.

C'est tout ce que je peux dire, je suis nul en html et en css

Guillemein
Invité n'ayant pas de compte PHPfrance

29 févr. 2012, 10:26

Bonjour,
Voilà j'avance mais encore des problèmes :

---
print("<div style=\"width=630px; height=320px;overflow:scroll\">");
print("<table border><caption>Enregistrements pour $resultat</caption>");
print("<thead><tr>");

print("<th style=\"width=70px;\">Commune</th>");
print("<th width=30px>Naissance</th>");
print("<th width=50px>Nom</th>");
print("<th width=50>Prénom</th>");
print("</tr></thead>");

print("<tbody style=\"height:300px;\">");
$ligne = 0;
while (list($s_paroisse, $s_date_n, $s_nom, $s_prenom) = mysql_fetch_row($result))
{
if ($ligne == 0)
{
print("<tr>");
$ligne = 1;
}
else
{
print("<tr style=\"background: #fff;\">");
$ligne = 0;
}
print("<td style=\"width=70px;\">$s_paroisse</td>");
print("<td width=30>$s_date_n</td>");
print("<td width=50>$s_nom</td>");
print("<td width=50>$s_prenom</td>");
print("</tr>");
}
print("</tbody></table></div>");
---

J'ai bien mon tableau complet, titre et lignes bien alignés, mais encore ces manques :
Malgré mon width et mon height dans le div de la table, le tableau se cale à gauche avec une largeur correspondante aux plus grands mots des lignes et dépasse l'écran en hauteur.
J'ai sur la droite de l'écran une ligne pour un ascenseur, mais elle est disabled et n'a pas le grand bouton de déplacement malgré mon overflow:scroll
Mon entête n'est pas fixe et remonte quand je déplace les lignes vers le bas avec la roulette de la souris.
Et toujours les largeurs de cellule se calent sur le plus grand mot et non sur mon width qui est pourtant défini.
Je mettrais tous les styles en css quand tout sera au point.
Merci de vos réponses.