Permalänk
Medlem

[PHP]eval object + var

... class user_data { private $path = ""; private $message_posts = 0; private $message_posts_time = 0; private $messages = 0; private $messages_time = 0; private $messages_new = 0; private $messages_new_time = 0; private $topics = 0; private $topics_time = 0; private $posts = 0; private $posts_time = 0; public function user_data($path) { $this->path = $path; if(file_exists($this->path)) { $data = file_get_contents($this->path); $row = explode("\n",$data); $i = 0; $vars = get_object_vars($this); foreach($vars as $name) { eval('$this->' . $name . ' = $row[' . $i . '];'); // andra felet $i++; } } else { $this->save(); } } public function save() { $data = ""; $value = ""; $vars = get_object_vars($this); foreach($vars as $name) { eval('$value = $this->' . $name . ';'); //första felet $data .= $value."\n"; } file_put_contents($this->path,$data); } //SET public function set_message_posts($value) { $this->message_posts = $value; $this->message_posts_time = time(); } public function set_messages($value) { $this->messages = $value; $this->messages_time = time(); } public function set_messages_new($value) { $this->messages_new = $value; $this->messages_new_time = time(); } public function set_topics($value) { $this->topics = $value; $this->topics_time = time(); } public function set_posts($value) { $this->posts = $value; $this->posts_time = time(); } //GET public function message_posts(){return $this->message_posts;} public function message_posts_time(){return $this->message_posts_time;} public function messages(){return $this->messages;} public function messages_time(){return $this->messages_time;} public function messages_new(){return $this->messages_new;} public function messages_new_time(){return $this->messages_new_time;} public function topics(){return $this->topics;} public function topics_time(){return $this->topics_time;} public function posts(){return $this->posts;} public function posts_time(){return $this->posts_time;} }

Parse error: syntax error, unexpected T_VARIABLE, expecting T_STRING in ...\includes\user.class.php(239) : eval()'d code on line 1 ...

Hej! Skulle vilja ha hjälp med att lista ut hur jag ska skriva i eval funktionen så att det står rätt. Har testat $this->$name utan att använda eval men det funkar inte. Det ska bli en loop där alla object var får ett värde men problemet är att omvandla namnet till att inte bli en sträng så det blir "$this->name".

Tack på förhand.

Visa signatur
Permalänk

Testa escapa $ i eval:

eval("\$value = \$this->".$name.";");

Permalänk
Medlem

eval("\$this->".$name." = \$row[".$i."];"); och eval("\$value = \$this->".$name.";");

Parse error: syntax error, unexpected '.', expecting T_STRING or T_VARIABLE or '{' or '$' in E:\Web\htdocs\azuraz\includes\user.class.php(239) : eval()'d code on line 1 Parse error: syntax error, unexpected T_LNUMBER, expecting T_STRING or T_VARIABLE or '{' or '$' in E:\Web\htdocs\azuraz\includes\user.class.php(239) : eval()'d code on line 1 ...

Tyvärr hjälpte inte det. Jag undrade om det var något med $row som var fel kanske för att eval skippar annan kod utanför funktionen men i data filen borde det stå 0\n0\n... i vilket fall ändå men det står bara \n\n\n...

Visa signatur
Permalänk

testa spara ner row[i] innan eval.

$tmp = row[$i]; eval("\$this->$name = $tmp;");

Permalänk
Medlem

Fungerar inte får samma fel, tror det har något att göra med this->...

Testade även:

$tmp = $row[$i]; $str = "\$this->".($name)." = ".($tmp).";"; eval($str);

Visa signatur
Permalänk
Medlem

Dokumentationen ger ett exempel som du borde kunna utgå från och prova olika varianter. Dubbla citattecken, enkla citattecken, skapa variabel med strängen på en rad och printa ut den för debug, escape på dollar, etc.

Permalänk
Medlem

Gjorde om koden lite, och nu fungerar den för mig.

public function __construct($path) { $this->path = $path; if(file_exists($this->path)) { $classes = array_keys(get_object_vars($this)); $data = file_get_contents($this->path); $lines = explode("\r\n", $data); if (count($lines) != count($classes)) throw new Exception('Filen har inte lika många rader som classen.'); foreach($lines as $line => $content) $this->$classes[$line] = $content; } else $this->save(); } public function save() { $classes = array_values(get_object_vars($this)); $data = implode($classes, "\r\n"); file_put_contents($this->path, $data); } ... print_r($test = new User_Data('test.txt'));

Får man fråga varför du inte använder en databas? SQLite brukar följa med PHP.

Permalänk
Medlem

Tack! Ska se om det funkar för mig. Jag använder MySQL men jag tänkte det kanske är snabbare om man använder en fil med all statistik istället.
Kanske ska jag lägga in det i "users" tabellen i SQL istället för att ha det i en fil.

Jag kom faktiskt på att jag kunde göra en nytt fält som räknar antal istället för att gå igenom alla poster för att räkna antalet.
Just nu använder jag mig av en fil där bara ett värde är sparat, då kan jag även kolla vilken tid filen är ändrad. Finns det någon funktion som kan kolla när ett fält i en tabell i MySQL också är ändrad?

Visa signatur