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

Tableau d'objets ???

17 réponses
Avatar
Vaguener Frank
Voila, je programme et je voudrais faire une sorte de code Php qui
tourne un peu comme un serveur xchange.
J'ai donc une classe "MessageBox" qui contiendrait un tableau d'objet de
messages, que je parcourerais après.

Or ca bugg, au niveau de la ligne 21 de DAO.Php...

"Parse error: parse error, expecting `T_VARIABLE' or `'$'' in c:\program
files\easyphp1-8\www\msg\dao.php on line 21"

Je n'arrive pas à mettre la dent sur ce qui ne marche pas...
Est=ce la création du tableau d'objets, ou le foreach qui foire ?
Merci d'avance, ci dessous mes 3 codes.


Voici, j'ai 3 codes :




1.: index.php

<?php
include("dao.php");

$MesMessages = New MessageBox();

$Dao = New Dao();

echo ($Dao->GetMessage($MesMessages,"1"));
?>





2.: msg.php

<?php
class Message {
var $idMsg = 0;
var $idFrom = 0;
var $idTo = 0;
var $Subject="";
var $Content="";
}


class MessageBox {
var $Count = 0;
var $Messages;
}
?>





3.: Dao.Php

<?php
include("msg.php");
class Dao
{

function Login()
{
$HostId='localhost'; $Login='root'; $Password=''; $Db='poy';
mysql_connect($HostId,$Login,$Password);
mysql_select_db($Db);
}


function GetMessage($MessageBox, $Parameters) // recoit le
serveur et l'id
{ $this->Login();
$result = mysql_query("SELECT * FROM MESSAGES WHERE ID_TO =
'".$Parameters."' ORDER BY TIMESTAMP ASC;")
or die('Erreur Getting Messages !<br>'.$sql.'<br>'.mysql_error());

while($data = mysql_fetch_array($result)) // boucle
{ foreach ($MessageBox->Messages as new Message()){
$Mailbox->$Messages->idMsg=$data["id_Msg"];
$Mailbox->$Messages->idFrom=$data["Id_From"];
$Mailbox->$Messages->idTo=$data["id_To"];
$Mailbox->$Messages->Subject=$data["Subject"];
$Mailbox.$Messages->Content=$data["Content"];
=} // crée un objet message et le remplit
mysql_close();
return $Mailbox;
}
}


}
?>

10 réponses

1 2
Avatar
Olivier Miakinen

[...] ca bugg, au niveau de la ligne 21 de DAO.Php...

"Parse error: parse error, expecting `T_VARIABLE' or `'$'' in c:program
fileseasyphp1-8wwwmsgdao.php on line 21"


Bien. Voyons donc ce qu'il y a en ligne 21 de dao.php. Si on ne trouve
rien, on pourra regarder aussi à la ligne 20 s'il ne manque pas un
point-virgule.

Je n'arrive pas à mettre la dent sur ce qui ne marche pas...


Ah ? Tu ne sais pas compter jusqu'à 21 ? ;-)

1.: index.php


On s'en fout. C'est une erreur syntaxique (parse error), donc c'est dans
dao.php uniquement.

2.: msg.php


On s'en fout pour la même raison.

3.: Dao.Php


Nous y voilà.

1 <?php
2 include("msg.php");
3 class Dao
4 {
5
6 function Login()
7 {
8 $HostId='localhost'; $Login='root'; $Password=''; $Db='poy';
9 mysql_connect($HostId,$Login,$Password);
10 mysql_select_db($Db);
11 }
12
13
14 function GetMessage($MessageBox, $Parameters) // recoit le
serveur et l'id
15 { $this->Login();
16 $result = mysql_query("SELECT * FROM MESSAGES WHERE ID_TO =
'".$Parameters."' ORDER BY TIMESTAMP ASC;")
17 or die('Erreur Getting Messages !<br>'.$sql.'<br>'.mysql_error());
18
19 while($data = mysql_fetch_array($result)) // boucle
20 { foreach ($MessageBox->Messages as new Message()){
21 $Mailbox->$Messages->idMsg=$data["id_Msg"];


Bon, ça se passe par là.


Personnellement je vois déjà un truc qui me choque à la ligne 20 :

<cit. http://fr3.php.net/foreach>
Il y a deux syntaxes possibles [...]

foreach(array_expression as $value)
commandes
foreach(array_expression as $key => $value)
commandes
</cit.>

Dans ces deux exemples, juste après le « as » il y a un « $ » et pas
un « new »... ça irait bien avec le message d'erreur qui demande une
variable ou un caractère $, non ?


Cela dit, je suis quand même surpris par la ligne suivante aussi, mais
c'est sans doute parce que je n'ai pas encore trop fait de programmation
objet : Dans « $Mailbox->$Messages->idMsg », pourquoi y a-t-il un « $ »
après le premier « -> » mais pas après le deuxième ?

Avatar
Vaguener Frank
Je n'arrive pas à mettre la dent sur ce qui ne marche pas...


Ah ? Tu ne sais pas compter jusqu'à 21 ? ;-)

1.: index.php
On s'en fout. C'est une erreur syntaxique (parse error), donc c'est dans
dao.php uniquement.

2.: msg.php


On s'en fout pour la même raison.



1 et 2 : Pas forcément, on résoud parfois bien souvent des erreurs en
allant voir plus loin, au niveau même du concept dans lequel il pourrait
y avoir un problème....

3.: Dao.Php


Nous y voilà.
...
Bon, ça se passe par là.

Personnellement je vois déjà un truc qui me choque à la ligne 20 :

<cit. http://fr3.php.net/foreach>
Il y a deux syntaxes possibles [...]

foreach(array_expression as $value)
commandes
foreach(array_expression as $key => $value)
commandes
</cit.>

Dans ces deux exemples, juste après le « as » il y a un « $ » et pas
un « new »... ça irait bien avec le message d'erreur qui demande une
variable ou un caractère $, non ?
Cela dit, je suis quand même surpris par la ligne suivante aussi, mais
c'est sans doute parce que je n'ai pas encore trop fait de programmation
objet : Dans « $Mailbox->$Messages->idMsg », pourquoi y a-t-il un « $ »
après le premier « -> » mais pas après le deuxième ?


effectivement, il faut y voir (scuses la fatigues)

{ foreach ($MessageBox->Messages as new Message()){
$MessageBox->Messages->idMsg=$data["id_Msg"];
$MessageBox->Messages->idFrom=$data["Id_From"];
$MessageBox->Messages->idTo=$data["id_To"];
$MessageBox->Messages->Subject=$data["Subject"];
$MessageBox->Messages->Content=$data["Content"];

Mais je vois les choses telles que syntaxiquement

"pour chaque itération du tableau COMME un nouvel objet message"...


Désolé si c'est pas clair..., il est tard :)


Avatar
Olivier Miakinen

1.: index.php
On s'en fout. C'est une erreur syntaxique (parse error), donc c'est dans
dao.php uniquement.

2.: msg.php


On s'en fout pour la même raison.


1 et 2 : Pas forcément, on résoud parfois bien souvent des erreurs en
allant voir plus loin, au niveau même du concept dans lequel il pourrait
y avoir un problème....


Je suis d'accord pour les erreurs à l'exécution, mais pas pour une
erreur d'analyse syntaxique (parse error).

[...]


effectivement, il faut y voir (scuses la fatigues)

{ foreach ($MessageBox->Messages as new Message()){
$MessageBox->Messages->idMsg=$data["id_Msg"];


Ok pour la seconde ligne que je cite (et les suivantes)

Mais je vois les choses telles que syntaxiquement

"pour chaque itération du tableau COMME un nouvel objet message"...


Bon, déjà, je ne vois pas comment $MessageBox->Messages pourrait être
à la fois un « tableau de Message » (ligne foreach) et un « Message »
(lignes suivantes). Si tu me pardonnes cette MÀLC(¹), c'est comme si tu
écrivais : « pour chaque nouvelle pomme de terre d'un sac de pommes de
terres, le sac est une pomme de terre ».

Désolé si c'est pas clair..., il est tard :)


En tout cas, la syntaxe que tu utilises est incorrecte. Explique-nous ce
que tu voudrais faire (c.-à-d. déjà si $MessageBox->Messages doit être
un tableau ou pas).

____________

(¹) Métaphore à la con

--
Olivier Miakinen



Avatar
Pozzo
{ foreach ($MessageBox->Messages as new Message()){


On ne peut pas CREER de nouveau $Message dans une boucle foreach. On ne
fait que PARCOURIR un tableau de $Message déjà existant...

Donc la syntaxe correcte c'est :

foreach ($MessageBox->Messages as $Message) {

$MessageBox->$Messages->idMsg=$data["id_Msg"];


Puis on manipule directement le $Message que foreach vient gentiment de
nous fournr comme cela :

$Message->idMsg = $data["id_Msg"];

Maintenant dans votre code je ne vois nulle part où vous créer votre
tableau de $MessageBox->Messages... Donc à mon avis l'algorithmique est
aussi à revoir. On ne peut pas faire de foreach sur un tableau non
existant... Et pour le créer je vous suggere de regarder du coté de la
fonction array(). Ceci dit je n'ai jamais testé la création d'un array
d'objets. J'imagine que c'est possible. Quitte à sérialiser l'objet au
besoin (cf la fonction serialize() )

--
Pozzo - Coda ex Machina

Avatar
Bruno Desthuilliers
Vaguener Frank wrote:
(snip)

{ foreach ($MessageBox->Messages as new Message()){
$MessageBox->Messages->idMsg=$data["id_Msg"];
$MessageBox->Messages->idFrom=$data["Id_From"];
$MessageBox->Messages->idTo=$data["id_To"];
$MessageBox->Messages->Subject=$data["Subject"];
$MessageBox->Messages->Content=$data["Content"];

Mais je vois les choses telles que syntaxiquement

"pour chaque itération du tableau COMME un nouvel objet message"...


Et si tu prenais le temps de lire la doc au lieu d'écrire n'importe quoi
au hasard en espérant que ça va tomber en marche ?


--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"

Avatar
Bruno Desthuilliers
Olivier Miakinen wrote:
(snip)

Si tu me pardonnes cette MÀLC(¹), c'est comme si tu
écrivais : « pour chaque nouvelle pomme de terre d'un sac de pommes de
terres, le sac est une pomme de terre ».


Mdr !

Oui, ça décrit à peu près bien le problème...



--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"

Avatar
Vaguener Frank
effectivement, il faut y voir (scuses la fatigues)

{ foreach ($MessageBox->Messages as new Message()){
$MessageBox->Messages->idMsg=$data["id_Msg"];


Ok pour la seconde ligne que je cite (et les suivantes)

Mais je vois les choses telles que syntaxiquement

"pour chaque itération du tableau COMME un nouvel objet message"...


Bon, déjà, je ne vois pas comment $MessageBox->Messages pourrait être
à la fois un « tableau de Message » (ligne foreach) et un « Message »
(lignes suivantes). Si tu me pardonnes cette MÀLC(¹), c'est comme si tu
écrivais : « pour chaque nouvelle pomme de terre d'un sac de pommes de
terres, le sac est une pomme de terre ».

Désolé si c'est pas clair..., il est tard :)


En tout cas, la syntaxe que tu utilises est incorrecte. Explique-nous ce
que tu voudrais faire (c.-à-d. déjà si $MessageBox->Messages doit être
un tableau ou pas).


Ben MessageBox est un objet conteneur de messages pour chaque utilisateur.

Donc Un user a Un objet MessageBox qui lui, contient un tableau (nommé
Messages) d'objet de type "Messages"

:)
Le problème se situe donc soit dans ma déclaration de classe "MessageBox
" soit dans le code de parseur entre lui même.


Avatar
Olivier Miakinen

[...]

Maintenant dans votre code je ne vois nulle part où vous créer votre
tableau de $MessageBox->Messages... Donc à mon avis l'algorithmique est
aussi à revoir.


Suite à ta remarque, je crois que j'ai compris ce que Frank voulait
faire. Le code suivant devrait fonctionner :

while ($data = mysql_fetch_array($result)) {
$Message = new Message();

$Message->idMsg = $data["id_Msg"];
$Message->idFrom = $data["Id_From"];
$Message->idTo = $data["id_To"];
$Message->Subject = $data["Subject"];
$Message->Content = $data["Content"];

$MessageBox->Messages[] = $Message;
}

Cela dit, Frank, tu devrais vraiment suivre le conseil de Bruno,
c'est-à-dire lire la doc au lieu d'écrire des trucs au hasard en
espérant que ça tombe en marche.

--
Olivier Miakinen
Troll du plus sage chez les conviviaux : le nouveau venu, avec
son clan, s'infiltre dans les groupes de nouvelles. (3 c.)

Avatar
Bruno Desthuilliers
Pozzo wrote:
{ foreach ($MessageBox->Messages as new Message()){



On ne peut pas CREER de nouveau $Message dans une boucle foreach.


<pédant>
en fait si, mais ils n'auront a priori aucun lien avec le contenu du
tableau parcouru...

foreach($MessageBox->Messages as $existing_message) {
$new_message = new Message();
// ....
}

Mais bon, ça ne nous avance à rien !-)
</pédant>

On ne
fait que PARCOURIR un tableau de $Message déjà existant...

Donc la syntaxe correcte c'est :

foreach ($MessageBox->Messages as $Message) {


$MessageBox->$Messages->idMsg=$data["id_Msg"];



Puis on manipule directement le $Message que foreach vient gentiment de
nous fournr comme cela :

$Message->idMsg = $data["id_Msg"];


Ce qui reste parfaitement inutile AMHA:
1/ en PHP 4, les éléments renvoyés sont en fait des copies, pas des
références sur les originaux. Donc, on peut leur faire ce qu'on veut
comme modification, c'est perdu dès le tour suivant... (je ne sais pas
ce qu'il en est pour PHP 5)

<?php
class Toto {
var $name = 'no name';
}

$ar = Array(new Toto, new Toto, new Toto);

foreach($ar as $id => $toto) {
$toto->name = "toto $id";
}

foreach($ar as $id => $toto) {
echo $toto->name . "<br>";
}
?>

=> affiche:
no name
no name
no name


2/ de toutes façons, même si cette modif était effective, affecter le
même id de message à tous les messages ne me semble pas une idée
lumineuse.... Enfin bon, pour ce que j'en dis, hien...

Maintenant dans votre code je ne vois nulle part où vous créer votre
tableau de $MessageBox->Messages... Donc à mon avis l'algorithmique est
aussi à revoir.


AMHA, et sans vouloir être désagréable, il y plus que ça à revoir...

On ne peut pas faire de foreach sur un tableau non
existant... Et pour le créer je vous suggere de regarder du coté de la
fonction array(). Ceci dit je n'ai jamais testé la création d'un array
d'objets. J'imagine que c'est possible.


Pourquoi ça ne serait pas possible ? Un tableau peut contenir n'importe
quel type de données PHP.

Quitte à sérialiser l'objet au
besoin


Pas besoin.

--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"


Avatar
Antoine Polatouche
Ce qui reste parfaitement inutile AMHA:
1/ en PHP 4, les éléments renvoyés sont en fait des copies, pas des
références sur les originaux. Donc, on peut leur faire ce qu'on veut
comme modification, c'est perdu dès le tour suivant... (je ne sais pas
ce qu'il en est pour PHP 5)


En php5:

<?php

class Toto {
var $name = 'no name';
}

$ar = Array(new Toto, new Toto, new Toto);
$id = 0;

foreach($ar as $obj) {
$obj->name = "toto ".$id++;
}

foreach($ar as $toto) {
echo $toto->name . "<br>";
}

?>

=> affiche:

toto 0
toto 1
toto 2

1 2