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
Olivier Miakinen
Bonjour,

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

[...] 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 ?



Je n'y connais rien en bases de données, mais mon intuition me dit
que la commande DELETE portant sur le champ que tu ne comprends pas
pourrait être la raison de la disparition des messages.

Regardons-y de plus près.

$tm=microtime();$tm2=explode(" ",$tm);$tm3=$tm2[1];
$query = "DELETE FROM $table WHERE (temp+7777)<$tm3";



Pour commencer, découvrons ensemble la fonction microtime.

<cit. http://fr2.php.net/microtime>
microtime() retourne le timestamp Unix, avec les microsecondes. Cette
fonction est uniquement disponible sur les systèmes qui supportent la
fonction gettimeofday().

Par défaut, microtime() retourne une chaîne de caractères au format
"msec sec", où sec est le temps courant mesuré en nombre de secondes
depuis l'époque Unix (1 Janvier 1970, 00:00:00 GMT), et msec est le
nombre de microsecondes qui se sont écoulées depuis sec exprimé en
secondes.
</cit.>

Si $tm est le résultat de microtime, alors $tm2 est un tableau dont
la seconde valeur est le nombre de secondes depuis l'origine des
temps, et $tm3 est justement ce nombre de secondes.

Et donc, si l'entrée a été créée avec un code similaire (ce qui semble
être le cas si j'en crois la commande INSERT plus loin dans le code),
le code commence par virer tous les messages vieux de plus de 7777
secondes, soit un peu plus de deux heures (2 h 9 mn 37 s sauf erreur).

Si tu vires ce DELETE ou si tu mets un nombre de secondes plus grand
que 7777, ça devrait changer le comportempent.


Cordialement,
--
Olivier Miakinen
Avatar
docanski
Alors que les eleveurs et agriculteurs empoisonnent toujours la
Bretagne, Olivier Miakinen ecrit ce qui suit en ce 14/05/2013 18:34 :
Bonjour,



Salut Olivier !

Et donc, si l'entrée a été créée avec un code similaire (ce qui semble
être le cas si j'en crois la commande INSERT plus loin dans le code),
le code commence par virer tous les messages vieux de plus de 7777
secondes, soit un peu plus de deux heures (2 h 9 mn 37 s sauf erreur).
Si tu vires ce DELETE ou si tu mets un nombre de secondes plus grand
que 7777, ça devrait changer le comportempent.



C'est ce que je pensais au départ et j'avais modifié ce délai, pour les
essais.
Mais c'est lakelos et qui m'interpelle : malgré sa longueur, la totalité
des messages n'est pas affichée dans la fenêtre du chat alors qu'elle
est bien présente pendant plus de 2 heures dans la BdD. Et en disparaît,
évidemment, une fois le délai de 7777 secondes dépassé.
J'ai gardé le DELETE, évidemment, pour ne pas engorger la BdD au delà de
ce délai.
C'est donc ailleurs que se situe le problème.

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
Le 14/05/2013 18:42, docanski a écrit :

Et donc, si l'entrée a été créée avec un code similaire (ce qui semble
être le cas si j'en crois la commande INSERT plus loin dans le code),
le code commence par virer tous les messages vieux de plus de 7777
secondes, soit un peu plus de deux heures (2 h 9 mn 37 s sauf erreur).
Si tu vires ce DELETE ou si tu mets un nombre de secondes plus grand
que 7777, ça devrait changer le comportempent.



C'est ce que je pensais au départ et j'avais modifié ce délai, pour les
essais.



Ok.

Mais c'est lakelos



<https://www.google.fr/search?q=lakelos>
Lake Los Angeles
</>

???

et qui m'interpelle : malgré sa longueur, la totalité
des messages n'est pas affichée dans la fenêtre du chat alors qu'elle
est bien présente pendant plus de 2 heures dans la BdD. Et en disparaît,
évidemment, une fois le délai de 7777 secondes dépassé.
J'ai gardé le DELETE, évidemment, pour ne pas engorger la BdD au delà de
ce délai.
C'est donc ailleurs que se situe le problème.



Il y a un truc qui me semble bizarre, à moi qui -- je le rappelle -- ne
gère pas de base de données :

$query = "INSERT INTO $table VALUES
('0','$pseudo','$message3','$datime','$formatage','$tmp3')";

Pourquoi y a-t-il six valeurs au lieu de cinq ?


Note que si ta question n'est pas un problème de PHP mais un problème
de sgbd, c'est dans f.c.a.sgbd que tu devrais la poser.
Avatar
Denis Beauregard
Le Tue, 14 May 2013 19:02:05 +0200, Olivier Miakinen
<om+ écrivait dans fr.comp.lang.php:

Mais c'est lakelos



<https://www.google.fr/search?q=lakelos>
Lake Los Angeles
</>

???



C'est là qu'est l'os...


Denis
Avatar
Olivier Miakinen
Le 14/05/2013 19:57, Denis Beauregard m'a répondu :

Mais c'est lakelos



<https://www.google.fr/search?q=lakelos>
Lake Los Angeles
</>

???



C'est là qu'est l'os...



Ha ! :-D

(je le prononçais intérieurement « lèïk lôce » au lieu de
« la quai losse »)
Avatar
docanski
Alors que les eleveurs et agriculteurs empoisonnent toujours la
Bretagne, Olivier Miakinen ecrit ce qui suit en ce 14/05/2013 19:02 :

Il y a un truc qui me semble bizarre, à moi qui -- je le rappelle -- ne
gère pas de base de données :

$query = "INSERT INTO $table VALUES
('0','$pseudo','$message3','$datime','$formatage','$tmp3')";

Pourquoi y a-t-il six valeurs au lieu de cinq ?



Un oubli : c'est une variable abandonnée au cours de la mise au point de
l'affichage.
J'avais oublié de l'éliminer du code, c'est fait désormais.
Le problème reste entier : impossible d'afficher tous les messages
stockés dans la BdD.
J'ai observé le comportement du bidule et je constate que le nombre de
messages affichés dans la fenêtre du chat est toujours limité à 20,
quelle qu'en soit la longueur.
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.

Note que si ta question n'est pas un problème de PHP mais un problème
de sgbd, c'est dans f.c.a.sgbd que tu devrais la poser.



Je ne vois pas en quoi : une table toute simple ne comportant que 5
champs créés au départ du code que j'ai reproduit dans ma question initiale.
Heeeeelp !

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
Denis Beauregard
Le Wed, 15 May 2013 23:37:15 +0200, docanski
écrivait dans
fr.comp.lang.php:

Je ne vois pas en quoi : une table toute simple ne comportant que 5
champs créés au départ du code que j'ai reproduit dans ma question initiale.
Heeeeelp !



Un truc que j'utilise : faire afficher avec phpmyadmin et reprendre le
même code. En d'autres mots, par exemple, je demande à phpmyadmin de
modifier tel valeur, puis je reprends son code (il est affiché) et
je l'adapte à mes besoins.

La recette :

Choisir une base
Faire "rechercher"
Modifier un des champs de l'enregistrement trouvé (si on veut)
Recopier le code SQL utilisé avec les changements appropriés.


Ne pas oublier que ce code est limité à 30 lignes par phpmyadmin.


Si cela ne fonctionne pas comme phpmyadmin, on a au moins une base
de comparaison. Dans ton cas, pourquoi il sort 20 lignes au lieu de
la quantité attendue.


Denis
Avatar
Olivier Miakinen
Le 15/05/2013 23:37, docanski a écrit :

$query = "INSERT INTO $table VALUES
('0','$pseudo','$message3','$datime','$formatage','$tmp3')";

Pourquoi y a-t-il six valeurs au lieu de cinq ?



Un oubli : c'est une variable abandonnée au cours de la mise au point de
l'affichage.
J'avais oublié de l'éliminer du code, c'est fait désormais.



Je ne comprends toujours pas comment ça a pu fonctionner : ce ne sont
pas 20 messages qui devraient s'afficher correctement, s'il y a un
décalage entre l'écriture et la lecture, mais aucun ! Ou alors, si ce
sont toujours les 20 mêmes qui s'affichent, ce sont probablement les
20 pour lesquels le code d'écriture était en phase avec le code de
lecture !

Cela dit, j'ai essayé de suivre ton code pas à pas, en allant lire la
doc à chaque fonction. Tout d'abord, il y a à chaque fois un gros
avertissement sur fond rose pour dire que toutes ces fonctions sont
dépréciées. Ensuite, je remarque que tu ne testes jamais le code de
retour de mysql_query(), or cette fonction peut très bien retourner
FALSE à la place de la « ressource » utilisable par mysql_fetch_row().
Enfin, il faut peut-être remplacer $row[1] à $row[4] par $row[0] à
$row[3].

Le problème reste entier : impossible d'afficher tous les messages
stockés dans la BdD.
J'ai observé le comportement du bidule et je constate que le nombre de
messages affichés dans la fenêtre du chat est toujours limité à 20,
quelle qu'en soit la longueur.
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.



C'est toujours 20 ? Ce sont les 20 premiers ou les 20 derniers ?
Si tu ajoutes un nouveau message, il s'affiche et le 20e plus vieux
disparaît ? 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 ? Quelle est la hauteur de l'Everest ? Tu ne vois pas une
autre question stupide que je pourrais poser ?

Note que si ta question n'est pas un problème de PHP mais un problème
de sgbd, c'est dans f.c.a.sgbd que tu devrais la poser.



Je ne vois pas en quoi : une table toute simple ne comportant que 5
champs créés au départ du code que j'ai reproduit dans ma question initiale.



???

Ta table a beau être toute simple (je te crois sur parole, encore une
fois je n'y connais rien et je ne sais pas juger de la simplicité d'une
table), si c'est un problème de SGBD et pas un problème de PHP il est
logique de poser la question aux experts en SGBD plutôt qu'aux experts
en PHP !

C'est comme si tu trouvais normal de demander la recette des ½ufs en
meurette sur fr.rec.cuisine parce que c'est compliqué, mais que tu
t'adresses à fr.comp.lang.php pour la recette de l'½uf à la coque
parce que c'est tout simple...

Heeeeelp !



Je dooooo ce que je caaaaan.
Avatar
docanski
Alors que les eleveurs et agriculteurs empoisonnent toujours la
Bretagne, Denis Beauregard ecrit ce qui suit en ce 16/05/2013 00:13 :

La recette :

Choisir une base
Faire "rechercher"
Modifier un des champs de l'enregistrement trouvé (si on veut)
Recopier le code SQL utilisé avec les changements appropriés.



La table est réduite à sa plus simple expression : 5 variables avec une
longueur de champ limitée (varchar) dont la 1ère (id) utilise
l'opérateur "=" et les 4 autres le "LIKE" (varchar(nombre paramétré)).
Bref, pas de quoi fouetter un chat ... et pas plus de code que de beurre
en branche.
Les champs "Valeur" sont vides.

Ne pas oublier que ce code est limité à 30 lignes par phpmyadmin.



Je ne vois vraiment pas ce que je pourrais y changer.

Dans ton cas, pourquoi il sort 20 lignes au lieu de
la quantité attendue.



Il n'y a aucune variable où s'affiche ce chiffre 20 sorti de nulle part. :-(
A moins qu'il ne soit possible d'ajouter un champ obligeant SQL à
afficher la totalité des messages stockés, je ne vois pas comment m'en
sortir.

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
docanski
Alors que les eleveurs et agriculteurs empoisonnent toujours la
Bretagne, Olivier Miakinen ecrit ce qui suit en ce 16/05/2013 00:20 :

Ou alors, si ce
sont toujours les 20 mêmes qui s'affichent, ce sont probablement les
20 pour lesquels le code d'écriture était en phase avec le code de
lecture !



Ah non ! pas du tout ! le 21ème message affiché provoque la disparition
du 1er, le 22ème du suivant, etc ... de sorte qu'il ne reste jamais plus
de 20 messages dans la fenêtre.

Cela dit, j'ai essayé de suivre ton code pas à pas, en allant lire la
doc à chaque fonction. Tout d'abord, il y a à chaque fois un gros
avertissement sur fond rose pour dire que toutes ces fonctions sont
dépréciées.



C'est du vieux code récupéré dans les fonds de tiroir, j'avais prévenu ;-)
Mais je n'ai pas eu de message d'erreur en retour quand j'ai installé le
bouzin.

C'est toujours 20 ? Ce sont les 20 premiers ou les 20 derniers ?
Si tu ajoutes un nouveau message, il s'affiche et le 20e plus vieux
disparaît ?



Oui.

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.

Quelle est la hauteur de l'Everest ? Tu ne vois pas une
autre question stupide que je pourrais poser ?



Une question n'est jamais stupide. Seule la réponse peut l'être :-)

Ta table a beau être toute simple (je te crois sur parole, encore une
fois je n'y connais rien et je ne sais pas juger de la simplicité d'une
table), si c'est un problème de SGBD et pas un problème de PHP il est
logique de poser la question aux experts en SGBD plutôt qu'aux experts
en PHP !



Sauf que ne détectant aucune anomalie frappante (vu la simplicité de
celle-ci) dans la table, je n'envisage, peut-être à tort, que la
possibilité d'un problème PHP. Une commande (query) oubliée, peut-être ?
Mais comment la créer ?

Je dooooo ce que je caaaaan.



Tu caaaaan beaucoup plus que ce que je peux doooooer ;-)

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/
1 2 3 4