Rückgabewert einer Funktion [PHP]

TTlong

Angesehenes Mitglied
Hallo,

sitz jetzt schon 2 Tage an diesem Problem und mir fällt einfach keine Lösung ein, wär nett wenn ihr mir hier mal helft.

Es geht hier darum, einen per Zufall generierten Wert in zwei unterschiedlichen Dateien verfügbar zu machen. Der Code (Token) wird in einer Klassen-Funktion generiert und soll einmal in der Klasse selbst, in einer weiteren Funktion genutzt werden können als auch in einer Datei, in der die Klasse eingebunden wird.

Die Klasse:
QUOTE class myClass {

public function generateToken() {
 
$del_token = "";
$laenge = 20;
$string = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

mt_srand((double)microtime()*1000000);

for ($i=1; $i <= $laenge; $i++) {
$del_token .= substr($string, mt_rand(0,strlen($string)-1), 1);
  }
return $del_token;
}


public function show_error_string($br = "<br />\n") {

$msg_string = "";
foreach ($this->message as $value) {
$msg_string .= $value.$br;
  }
return $msg_string;
}
 
 
public function error_text($err_num) {
 
$error[0] = "<table width=\"600\" border=\"0\" cellspacing=\"0\" cellpadding=\"3\">
   <tr>
     <td>".$this->generateToken()."</td>
   </tr>
 </table>";


return $error[$err_num];
}
 
}



Die Datei:

QUOTE
require_once('myClass.class.php');

$obj = new myClass();

$mysql->query("INSERT INTO <table> SET
          uid = '0',
          file_del = '".$obj->generateToken()."'"); // HIER DAS ZWEITE MAL


An jeweils fett markierten Stellen benötige ich den genrierten Token. Allerdings benötige ich den Token nur ein einzigstes Mal geneiriert und nicht wie in meinem versuch, hier wird er nämlich 2 mal erzeugt (da die Funktion generateToken() eben 2 mal aufgerufen wird.

Bin Neuling in OOP und würd mich freuen, wenn ihr mir hier helft.


Danke schonmal und Gruß

TTlong
 
Hi, so wirklich habe ich dein Problem nicht verstanden aber ich versuchs trotzdem mal:

klasse:
QUOTE class myClass {
private $Token = '';

public function generateToken() {

$del_token = "";
$laenge = 20;

  if(strlen($this->Token)==$laenge)
  {
return $this->Token;
  }

$string = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

mt_srand((double)microtime()*1000000);

for ($i=1; $i <= $laenge; $i++) {
$del_token .= substr($string, mt_rand(0,strlen($string)-1), 1);
  }
 

  $this->Token = $del_token;
  return $this->Token;

}


public function show_error_string($br = "<br />\n") {

$msg_string = "";
foreach ($this->message as $value) {
$msg_string .= $value.$br;
  }
return $msg_string;
}


public function error_text($err_num) {

$error[0] = "<table width=\"600\" border=\"0\" cellspacing=\"0\" cellpadding=\"3\">
  <tr>
    <td>".$this->generateToken()."</td>
  </tr>
</table>";


return $error[$err_num];
}

}



Gruß
Philip
 
So ungefähr könntest du es verbessern, allerdings konnte ich auch nur bruchstückhaft nachvollziehen was du da tun willst... die show_error_string und error_text-Funktionen sind nicht erklärt (aus den Funktionsnamen heraus kann man auch nicht erkennen, wo der Unterschied sein soll). Wieso wirft du keine Exception bei einem error?

CODE
class myClass
{
  public static $TOKEN_LENGTH = 20;
  private $token = null;

  public function __construct() {
     $this->setToken( $this->generateToken() );
  }

  private function generateToken() {
     $token = '';
     $tokenLength = self::$TOKEN_LENGTH;
     $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
     $charsLength = strlen($chars);

     mt_srand((double)microtime()*1000000);

     for ($i=1; $i <= $tokenLength; ++$i) {
        $token .= $chars{ mt_rand(0,$charsLength-1) };
     }
     return $token;
  }

  public function getToken() { return $this->token; }
  public function setToken($t) {
     if (is_string($t) && isset($t{0})) { $this->token = $t; }
    else { throw new InvalidTokenException(); }
  }


  // ?????
  // was steht in $this->message ??
  public function showErrorString($br = "<br />\n") {
     $msg_string = '';
     foreach ($this->message as $value) {
        $msg_string .= $value.$br;
     }
     return $msg_string;
  }

 
  // ?????
  // Die Funktion ergibt einen Fehler bei errorText(100000) oder ähnlichem !
  public function errorText($err_num) {
     $error[0] = '<table width="600" border="0" cellspacing="0" cellpadding="3">
        <tr>
           <td>'.$this->getToken().'</td>
        </tr>
     </table>';

     return $error[$err_num];
  }
}




CODE
require_once('myClass.class.php');

$obj = new myClass();
$tblName = 'table';

$result = $mysql->query('INSERT INTO '.$tblName.' (uid, file_del) VALUES (0, '.$obj->getToken().')');
if ($result===false) {
  echo($obj->errorText());
}

 
Hau doch das Token in die Session, dann kannst du das beliebig oft wieder rausholen ohne dass es neu generiert wird..
 
QUOTE (wichtl @ Mi 24.06.2009, 12:05) So ungefähr könntest du es verbessern, allerdings konnte ich auch nur bruchstückhaft nachvollziehen was du da tun willst... die show_error_string und error_text-Funktionen sind nicht erklärt ...

Die sind im Prinzip auch nicht relevant, ich hab sie nur erwähnt, damit deutlich wird, dass, wenn diese Funktion show_error_string() aufgerufen wird, der generierte Token dort verfügbar sein MUSS (das meinte ich im ersten Post, dass dieser Token eben innerhalb einer weiteren Funktion innerhalb der eigentlichen Klasse verfügbar sein muss).

Ebenso MUSS der Token in einer anderen Datei verfügbar sein. Aber eben ein und der selbe Wert, es soll also im Prinzip die Funktion generateToken() aufgerufen werden und ich brauche den Wert dieser Funktion (den Token) in zwei unterschiedlichen Dateien.
 
Speichere den Wert beim ersten Funktionsaufruf in einer Variablen.

Und übergib die Variable an die Funktion in der anderen Datei.

Sprich: Die Funktion in der Datei muß eine Variable entgegennehmen.

Bzw. bei deiner Konstruktion: Die Klasse myClass braucht entweder eine öffentliche Eigenschaft, die mit dem Token belegt wird oder eine überladende New (keine Ahnung, ob es das in PHP gibt), so daß bei der Initialisierung der Wert übergeben werden kann.

PS: Nochmals den Code angesehen: Bei dir ist das ja umgekehrt: Überall dort, wo der Wert genutzt wird, ist die Klasse bereits initialisiert. Also generiere beim Initialisieren ein Token und speichere das in einer Eigenschaft der Klasse - und dann wird zweimal drauf zugegriffen, einmal intern und einmal extern.
 
Ok, hab es jetzt so gelöst, dass der Token nicht innerhalb einer Funktion erzeugt wird sondern in der bearbeitenden Datei selbst und als Objekt geliefert wird. So kann ich auch in der Klasse daruf zugreifen.

Datei.php
QUOTE // Löschtoken generieren
$del_token = "";
$laenge = 20;
$string = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
mt_srand((double)microtime()*1000000);
for ($i=1; $i <= $laenge; $i++) {
$del_token .= substr($string, mt_rand(0,strlen($string)-1), 1);
}

$obj->del_token = $del_token;


myClass.class.php

QUOTE $this->del_token



Danke für die Denkanstöße.


MfG TTlong
 
QUOTE (TTlong @ Mi 24.06.2009, 13:51) Ebenso MUSS der Token in einer anderen Datei verfügbar sein. Aber eben ein und der selbe Wert, es soll also im Prinzip die Funktion generateToken() aufgerufen werden und ich brauche den Wert dieser Funktion (den Token) in zwei unterschiedlichen Dateien.

Das sollte ja kein Problem sein wenn du ihn einmal generierst und dann über getToken() abrufst. Die Dateien spielen dabei praktisch keine Rolle. Die notwendigen Klassen müssen nur includiert werden, was über eine __autoload()-Funktion erledigt werden kann.
Da du aber immer wieder von Dateien sprichst habe ich irgendwie das Gefühl, dass dein OOP-Schema nicht sehr ausgeklügelt ist. Du solltest keinen prozeduralen mit objektorientiertem Code vermengen. Der prozedurale Code gehört nur in eine Startdatei und greift dann auf die Klassen - die in Dateien ausgelagert sind - zurück:

CODE
index.php:
<?php
$out = 'Script wurde gestartet.<br />';

if (isset($_GET['page']) && $_GET['page'] === 'InsertByToken')
{
$token = new Token();
$tokenInserter = new TokenInserter();
$success = $tokenInserter->insertByToken( $token );
if ($success) {
$out .= 'Erfolgreich anhand von Token "'.$token->getToken().'" eingefügt.';
} else {
$out .= $tokenInserter->generateErrorMessageByToken( $token );
}
}
else
{
$out .= 'Keine Seite ausgewählt oder unbekannte Seite!';
}

echo($out);


function __autoload($className) {
switch ($className) {
case 'Token': include_once('Token.class.php'); return;
case 'TokenInserter': include_once('TokenInserter.class.php'); return;
}
die('Klasse '.$className.' nicht gefunden.');
}
?>



Das ist nur ganz grob wie es gehen könnte (Token = Deine myClass, TokenInserter = das wofür deine Datei da ist). Dem TokenInserter könnte man z.B. auch direkt im Konstruktur schon ein Token übergeben.
 
Zurück
Oben