Anzeige - [Hier werben / Mediadaten]
(?) Tags raten (?) (edit)
 
Reply to this topicStart new topicStart Poll
Diskussion

Rückgabewert einer Funktion [PHP]

Name nur für Mitglieder sichtbar
Geschrieben am: Mi 24.06.2009, 10:11
Report PostQuote Post

AyomRank 5
**********

Gruppe: Member (aktiv)
Beiträge: 469
Mitglied seit: 8.02.2007


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
Top
PMEmail Poster
Top
 
 
Flips
#2 Geschrieben am: Mi 24.06.2009, 11:49 (+01:37)
Report PostQuote Post

AyomRank 4
********

Gruppe: Member (aktiv)
Beiträge: 110
Mitglied seit: 17.07.2008


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


--------------------
Top
PMEmail Poster
Top
 
wichtl
#3 Geschrieben am: Mi 24.06.2009, 12:05 (+00:16)
Report PostQuote Post

AyomRank 3
******

Gruppe: Member (aktiv)
Beiträge: 42
Mitglied seit: 21.01.2007


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());
}


--------------------
Top
PMEmail Poster
Top
 
Alonso
WEPAX.com
#4 Geschrieben am: Mi 24.06.2009, 12:45 (+00:39)
Report PostQuote Post

AyomRank 6
************

Gruppe: Member (aktiv)
Beiträge: 620
Mitglied seit: 10.02.2005


Hau doch das Token in die Session, dann kannst du das beliebig oft wieder rausholen ohne dass es neu generiert wird..


--------------------
Top
PMEmail PosterUsers WebsiteICQ
Top
 
Name nur für Mitglieder sichtbar
#5 Geschrieben am: Mi 24.06.2009, 12:51 (+00:05)
Report PostQuote Post

AyomRank 5
**********

Gruppe: Member (aktiv)
Beiträge: 469
Mitglied seit: 8.02.2007


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.
Top
PMEmail Poster
Top
 
Jürgen Auer
Server-Daten - Online-CRM-Lösungen
#6 Geschrieben am: Mi 24.06.2009, 13:23 (+00:32)
Report PostQuote Post

AyomRank 9
Group Icon

Gruppe: Experten Entwicklung
Beiträge: 3274
Mitglied seit: 4.02.2006


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.


--------------------
Web-Anwendung 3.0: Ein Online-Kalender für Termine vieler Filialen.

Server-Daten - die Single-Data-Solution: Web-Datenbanken als Online - CRM - Lösung.
Ihre Geschäftsprozesse entscheiden, was Ihre Online-Datenbank macht. Sie konzentrieren sich auf Ihr Kerngeschäft - Ihre Datenbank funktioniert.
Top
PMEmail PosterUsers Website
Top
 
Name nur für Mitglieder sichtbar
#7 Geschrieben am: Mi 24.06.2009, 13:34 (+00:11)
Report PostQuote Post

AyomRank 5
**********

Gruppe: Member (aktiv)
Beiträge: 469
Mitglied seit: 8.02.2007


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
Top
PMEmail Poster
Top
 
wichtl
#8 Geschrieben am: Mi 24.06.2009, 13:49 (+00:15)
Report PostQuote Post

AyomRank 3
******

Gruppe: Member (aktiv)
Beiträge: 42
Mitglied seit: 21.01.2007


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 &quot;'.$token->getToken().'&quot; eingef&uuml;gt.';
  } else {
     $out .= $tokenInserter->generateErrorMessageByToken( $token );
  }
}
else
{
  $out .= 'Keine Seite ausgew&auml;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.


--------------------
Top
PMEmail Poster
Top
 
Thema wird von 0 Benutzer(n) gelesen (0 Gäste und 0 anonyme Benutzer)
0 Mitglieder:
Trackback-Url: http://www.ayom.com/track/t/30199

Topic Options Reply to this topicStart new topicStart Poll

 


> Ähnliche Themen
Wie kann ich mit einer Facebook App Geld verdienen Rhomb 561 6 Do 25.02.2010, 08:15
Fenster vor verlassen einer Seite yoopi 576 31 Mo 25.01.2010, 14:17
Abfrage einer MySQL Datenbank webdoktor 279 10 Fr 8.01.2010, 18:11
Wert einer Domain - gute Frage! bizz2000 356 3 Di 1.12.2009, 09:08
SQL Abfrage von Inhalt einer anderen Tabelle webdoktor 371 11 Do 19.11.2009, 10:43
Unique Text einer Germanistikstudentin anzubieten Sancheck 186 0 Di 27.10.2009, 19:41
Logos Deutscher Firmen in einer Farbskala Thomas Holzmann 267 0 Di 27.10.2009, 08:53
Layout einer Geburtskarte webdoktor 233 8 Di 20.10.2009, 19:10




Anzeige - [Hier werben / Mediadaten]



Anzeigen


[Hier werben / Mediadaten]