Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

variables MySql

34 réponses
Avatar
docanski
Bonjour toutes/tous,

Retiré depuis un bon bout de temps du code destiné au Web, suis obligé
de créer un "chat", avec stockage des messages dans une BdD, Free
refusant ceci dans un fichier tete. Pour ce faire, j'ai récupéré dans
mes archives une série de scripts/pages plus ou moins correctes (enfin,
je pense ...) et envoyé le tout sur site. Ça "marche", c'est déjà un bon
point. Néanmoins, j'ai quelques petites problèmes, le 1er étant
essentiellement la profondeur du stockage et son affichage dans la
fenêtre du chat : cet affichage se limite aux 2/3 de la fenêtre et les
messages les plus anciens disparaissent au fur et à mesure de l'arrivée
des suivants. Or, dans la BdD (qui ne comporte qu'une table, celle qui
stocke les messages), j'ai une profondeur de stockage bien plus
importante. Mais elle ne s'affiche pas et je ne vois pas pourquoi.
Dans les variables de cette table, j'ai ceci, lors de leur création :
<code>
`pseudo` VARCHAR(30) NOT NULL,
`message` VARCHAR(255) NOT NULL,
`date` VARCHAR(30) NOT NULL,
`formatage` VARCHAR(10) NOT NULL,
`temp` INT(30) NOT NULL,
</code>
Pour les 4 premiers, pas de problème, j'en comprends l'intérêt et la
présence.
C'est pour le 5ème que je m'interroge et je ne trouve aucune information
sur le web, du moins en français. Serait-ce celle à modifier ?

La requête vers la BdD destinée à l'affichage comporte le code suivant :

<code>
$ide= MYSQL_CONNECT($host_mysql,$user_mysql,$pass_mysql);
mysql_select_db("$bd_mysql");
$tm=microtime();$tm2=explode(" ",$tm);$tm3=$tm2[1];
$query = "DELETE FROM $table WHERE (temp+7777)<$tm3";
mysql_query($query,$ide);
$query = "SELECT * FROM $table ORDER BY id DESC";
$result = mysql_query($query,$ide);
$cpt=0;
while($row = mysql_fetch_row($result))
{
$cpt++;
$coul=substr($row[4],0,1);
$tail=substr($row[4],1,1);
$appa=substr($row[4],2,1);
$msg=$row[2];
if ($appa==1){$msg.=$row2;}
if ($appa==2){$msg2="<B>";$msg2.=$msg;$msg2.="</B>";$msg=$msg2;}
if ($appa==3){$msg2="<I>";$msg2.=$msg;$msg2.="</I>";$msg=$msg2;}
if ($appa==4){$msg2="<U>";$msg2.=$msg;$msg2.="</U>";$msg=$msg2;}
if ($appa==5){$msg2="<STRIKE>";$msg2.=$msg;$msg2.="</STRIKE>";$msg=$msg2;}
if ($coul==1){$msg2='<FONT
COLOR="#000000">';$msg2.=$msg;$msg2.="</FONT>";$msg=$msg2;}
if (snip la suite des couleurs) ...
echo"- <u>$row[1]</u> <font color=\"999999\">[$row[3]]</font> : $msg<br>";
if ($cpt==20) {break;}
}
MYSQL_CLOSE();
?>
</code>

Celle structurant le message est la suivante :

<code>
<?
$ide= MYSQL_CONNECT($host_mysql,$user_mysql,$pass_mysql);
mysql_select_db("$bd_mysql");
$query = "SELECT * FROM $table";
$result = mysql_query($query,$ide);
$taille = "1";
$datime = date("H:i");
$message2 = htmlentities($txt);
$message3 = nl2br($message2);
$formatage=$couleur;
$formatage.=$taille;
$formatage.=$attrib;
$tmp=microtime();$tmp2=explode(" ",$tmp);$tmp3=$tmp2[1];
if ($txt != "" and $pseudo != "")
{
$query = "INSERT INTO $table VALUES
('0','$pseudo','$message3','$datime','$formatage','$tmp3')";
$result = mysql_query($query,$ide);
}
MYSQL_CLOSE();
?>
</code>

Quelqu'un peut me dépanner sur ce coup ?

Cordialement,
--
docanski

Portail et annuaire du nord-Bretagne : http://armorance.free.fr/
Guide des champignons d'Europe : http://mycorance.free.fr/
La vallée de la Rance maritime : http://valderance.free.fr/
Les côtes du nord de la Bretagne : http://docarmor.free.fr/

10 réponses

1 2 3 4
Avatar
docanski
Alors que les eleveurs et agriculteurs empoisonnent toujours la
Bretagne, docanski ecrit ce qui suit en ce 16/05/2013 00:54 :

Ou il ne s'affiche pas et ce sont les 20 mêmes qui
s'affichent ? C'est juste un problème à l'affichage et tu as tous
tes messages dans la base quand tu passes par les outils d'adminis-
tration, ou bien le 20e plus vieux disparaît quand tu en insères un
nouveau ?



Oui.



Heu ... j'ai répondu trop vite.
Tous les messages sont stockés dans la base pendant le temps paramétré :
7777 ms
Les plus anciens sont éliminés au fur et à mesure du dépassement de ce
paramètre.
--
docanski

Portail et annuaire du nord-Bretagne : http://armorance.free.fr/
Guide des champignons d'Europe : http://mycorance.free.fr/
La vallée de la Rance maritime : http://valderance.free.fr/
Les côtes du nord de la Bretagne : http://docarmor.free.fr/
Avatar
Olivier Miakinen
Le 16/05/2013 00:58, docanski a écrit :

Ou il ne s'affiche pas et ce sont les 20 mêmes qui
s'affichent ? C'est juste un problème à l'affichage et tu as tous
tes messages dans la base quand tu passes par les outils d'adminis-
tration, ou bien le 20e plus vieux disparaît quand tu en insères un
nouveau ?



Oui.



Heu ... j'ai répondu trop vite.
Tous les messages sont stockés dans la base pendant le temps paramétré :
7777 ms
Les plus anciens sont éliminés au fur et à mesure du dépassement de ce
paramètre.



Oui, ok pour cela. Mais quand tu insères (mettons) 40 messages en moins
de 7777 secondes, tu en vois bien 40 dans mysqladmin, et seulement 20
via ton programme PHP ?
Avatar
docanski
Alors que les eleveurs et agriculteurs empoisonnent toujours la
Bretagne, Olivier Miakinen ecrit ce qui suit en ce 16/05/2013 01:21 :

Oui, ok pour cela. Mais quand tu insères (mettons) 40 messages en moins
de 7777 secondes, tu en vois bien 40 dans mysqladmin, et seulement 20
via ton programme PHP ?



Ben oui, il me semble avoir été explicite au sujet de cette anomalie :
elle est la raison de mon questionnement. Me serais-je mal exprimé ?
J'ajoute que rien ne laisse supposer que mysqladmin bloque ces messages.
En tout cas je n'y décèle aucune commande ou limitation dans ce sens.

Cordialement,
--
docanski

Portail et annuaire du nord-Bretagne : http://armorance.free.fr/
Guide des champignons d'Europe : http://mycorance.free.fr/
La vallée de la Rance maritime : http://valderance.free.fr/
Les côtes du nord de la Bretagne : http://docarmor.free.fr/
Avatar
Olivier Miakinen
Bonjour,

Le 16/05/2013 10:39, docanski a écrit :

Oui, ok pour cela. Mais quand tu insères (mettons) 40 messages en moins
de 7777 secondes, tu en vois bien 40 dans mysqladmin, et seulement 20
via ton programme PHP ?



Ben oui, il me semble avoir été explicite au sujet de cette anomalie :
elle est la raison de mon questionnement. Me serais-je mal exprimé ?



Je ne me permettrais pas de penser que tu t'es mal exprimé, alors
que c'est moi qui n'y connais pas grand-chose : j'ai probablement
loupé une explication par manque de vocabulaire. Par exemple je ne
sais pas ce que signifie l'expression « profondeur de stockage »
que tu emploies dans ton premier article.

J'ajoute que rien ne laisse supposer que mysqladmin bloque ces messages.



mysqladmin, c'est bien l'outil d'administration qui ne passe pas par
ton script PHP ? Si oui, je ne comprends pas ta remarque parce qu'il
m'avais semblé que tu disais que justement les messages n'étaient *pas*
bloqués par mysqladmin, mais qu'ils l'étaient par ton script.

En tout cas je n'y décèle aucune commande ou limitation dans ce sens.



Est-ce qu'il t'est possible de faire ce que suggérait Denis Beauregard,
à savoir tester des requêtes exactement identiques dans ton code et dans
mysqladmin pour pointer les différences ?
Avatar
Olivier Miakinen
Dans la série « le béotien découvre les SGBD et tente de deviner ce
que ça fait », je continue ma lecture de ton code...

Le 14/05/2013 17:38, docanski a écrit :

<code>
`pseudo` VARCHAR(30) NOT NULL,
`message` VARCHAR(255) NOT NULL,
`date` VARCHAR(30) NOT NULL,
`formatage` VARCHAR(10) NOT NULL,
`temp` INT(30) NOT NULL,
</code>



Puis :

$query = "SELECT * FROM $table ORDER BY id DESC";
$result = mysql_query($query,$ide);



Je suppose que « ORDER BY id DESC » signifie que les réponses doivent
être triées selon la valeur du champ 'id', non ? Ce champ 'id' ne
serait-il pas celui que tu as supprimé (tu m'as dit être passé de 6
champs à 5 champs) ?

$cpt=0;
while($row = mysql_fetch_row($result))



Je ne crois pas que tu m'aies répondu sur le fait de tester ou non
le fait que $result puisse valoir FALSE. Ni sur la réindexation des
$row[]. Si tu as changé ton code, il serait peut-être temps de
publier la version actuelle, avec corrections.

[...]

Celle structurant le message est la suivante :

<code>
<?
$ide= MYSQL_CONNECT($host_mysql,$user_mysql,$pass_mysql);
mysql_select_db("$bd_mysql");
$query = "SELECT * FROM $table";
$result = mysql_query($query,$ide);
[...]
$query = "INSERT INTO $table VALUES
('0','$pseudo','$message3','$datime','$formatage','$tmp3')";
$result = mysql_query($query,$ide);



À quoi sert le « SELECT * FROM $table » ? Non seulement tu ne testes
pas le $result correspondant, mais en plus tu ne l'utilises même pas.
Avatar
docanski
Alors que les eleveurs et agriculteurs empoisonnent toujours la
Bretagne, Olivier Miakinen ecrit ce qui suit en ce 16/05/2013 11:48 :
Bonjour,



Salut Olivier,

Je ne me permettrais pas de penser que tu t'es mal exprimé, alors
que c'est moi qui n'y connais pas grand-chose : j'ai probablement
loupé une explication par manque de vocabulaire. Par exemple je ne
sais pas ce que signifie l'expression « profondeur de stockage »
que tu emploies dans ton premier article.



Tu ne manques vraiment pas de vocabulaire mais peut-être me suis-je mal
exprimé, faute de savoir, peut-être, quels sont les termes exacts à
employer dans le jargon SQL et les autres joyeusetés qui l'accompagnent.
Lorsque je parle de profondeur de stockage, je me réfère à la notion de
temps. Si le paramètre "temps" est réglé à 7777 sec, tous les messages
émis pendant ce temps sont stockés dans la base.

mysqladmin, c'est bien l'outil d'administration qui ne passe pas par
ton script PHP ? Si oui, je ne comprends pas ta remarque parce qu'il
m'avais semblé que tu disais que justement les messages n'étaient *pas*
bloqués par mysqladmin, mais qu'ils l'étaient par ton script.



Pour être exact, c'est la console phpMyAdmin et non mysqladmin qui
permet d'administrer la base. Celle-ci reprend les champs cités dans ma
réponse à Denis.
Et dans ces champs, je ne vois aucune instruction, aucun paramètre
susceptible de bloquer les messages stockés.

Est-ce qu'il t'est possible de faire ce que suggérait Denis Beauregard,
à savoir tester des requêtes exactement identiques dans ton code et dans
mysqladmin pour pointer les différences ?



Sachant que celles-ci ne concernent que la *longueur* des champs
autorisés pour l'utilisateur pour les 4 principales, y compris
l'affichage de la date et de l'heure et que la 5ème ne constituent que
l'enregistrement de l'ID de celui-ci, je ne vois vraiment pas ce qui
pourrait changer quoi que ce soit.
Le seul que j'ai modifié en connaissance de cause pour remplir jusqu'à
un maximum de 2 lignes de texte dans l'espace de la fenêtre du chat est
celui du message : 375 caractères. "pseudo" en comporte jusqu'à 30,
"date" également et formatage (couleur + typo choisie pour le texte) en
comporte 10.
Mais j'admets bien volontiers que je suis une buse aussi bien en PHP
qu'en administration de BdD. Peut-être ne remarquai-je pas ce qui
sauterait aux yeux de celui qui connaît bien la musique.

Cordialement,
--
docanski

Portail et annuaire du nord-Bretagne : http://armorance.free.fr/
Guide des champignons d'Europe : http://mycorance.free.fr/
La vallée de la Rance maritime : http://valderance.free.fr/
Les côtes du nord de la Bretagne : http://docarmor.free.fr/
Avatar
Antoine Polatouche
Le 14/05/2013 17:38, docanski a écrit :

$cpt=0;
while($row = mysql_fetch_row($result))
{
$cpt++;


...
echo"- <u>$row[1]</u> <font color="999999">[$row[3]]</font> : $msg<br>";
if ($cpt= ) {break;}
}



Je n'ai lu qu'en vitesse ce fil de discussion, est-ce que tu te demandes
pourquoi ça n'affiche que 20 enregistrements ?
Si oui retire les 3 lignes avec $cpt...
Avatar
Olivier Miakinen
Le 16/05/2013 15:01, Antoine Polatouche a écrit :

$cpt=0;
while($row = mysql_fetch_row($result))
{
$cpt++;


...
echo"- <u>$row[1]</u> <font color="999999">[$row[3]]</font> : $msg<br>";
if ($cpt= ) {break;}
}



Je n'ai lu qu'en vitesse ce fil de discussion, est-ce que tu te demandes
pourquoi ça n'affiche que 20 enregistrements ?
Si oui retire les 3 lignes avec $cpt...



Hahaha ! Bravo !

Je n'ai même pas cherché ça, ayant cru sur parole docanski quand il
affirmait :

<news:kn0v6k$2cnr$
[...] toujours limité à 20 [...]
Or, je n'ai aucune restriction de ce genre, ni dans les scripts, ni dans
la BdD.
Ce chiffre mystérieux n'apparaît nulle part.
</news>

:-D
Avatar
docanski
Alors que les eleveurs et agriculteurs empoisonnent toujours la
Bretagne, Olivier Miakinen ecrit ce qui suit en ce 16/05/2013 12:30 :

Je suppose que « ORDER BY id DESC » signifie que les réponses doivent
être triées selon la valeur du champ 'id', non ? Ce champ 'id' ne
serait-il pas celui que tu as supprimé



Non, il demeure bien et est destiné au classement par ID

Je ne crois pas que tu m'aies répondu sur le fait de tester ou non
le fait que $result puisse valoir FALSE. Ni sur la réindexation des
$row[]. Si tu as changé ton code, il serait peut-être temps de
publier la version actuelle, avec corrections.



Je n'ai fait qu'éliminer la variable devenue inutile, rien d'autre.
En attendnt de trouver une solution ...

À quoi sert le « SELECT * FROM $table » ? Non seulement tu ne testes
pas le $result correspondant, mais en plus tu ne l'utilises même pas.



Si mes souvenirs sont bons (je t'ai dit et tu l'as remarqué, c'est du
code développé il y a déjà bien longtemps), c'est la récupération des
messages destinés à être affichés.
Pour ce qui est de tester le $result, les bribes de PHP qui me restent
(et c'est très peu, j'ai prévenu ;-) ) me laissent sans voix (ou
incapable de le mettre en oeuvre, si tu préfères)
Désolé :-(
--
docanski

Portail et annuaire du nord-Bretagne : http://armorance.free.fr/
Guide des champignons d'Europe : http://mycorance.free.fr/
La vallée de la Rance maritime : http://valderance.free.fr/
Les côtes du nord de la Bretagne : http://docarmor.free.fr/
Avatar
Olivier Miakinen
Le 16/05/2013 18:36, docanski a écrit :

Je suppose que « ORDER BY id DESC » signifie que les réponses doivent
être triées selon la valeur du champ 'id', non ? Ce champ 'id' ne
serait-il pas celui que tu as supprimé



Non, il demeure bien et est destiné au classement par ID



Ok, ça doit être un mot-clé réservé alors. Un jour peut-être je
me mettrai à SQL... comme toi un jour peut-être tu te mettras
à PHP. ;-)

Je ne crois pas que tu m'aies répondu sur le fait de tester ou non
le fait que $result puisse valoir FALSE. [...]



Pour ce qui est de tester le $result, les bribes de PHP qui me restent
(et c'est très peu, j'ai prévenu ;-) ) me laissent sans voix (ou
incapable de le mettre en oeuvre, si tu préfères)



Ok.

Là où tu as :

$result = mysql_query($query,$ide);
while ($row = mysql_fetch_row($result)) {
...
}

Faire :

$result = mysql_query($query,$ide);
if ($result === FALSE) {
... afficher une page d'erreur...
} else while ($row = mysql_fetch_row($result)) {
...
}
1 2 3 4