PHP Forum

PHP Forum (http://www.selfphp.de/forum/index.php)
-   PHP Grundlagen (http://www.selfphp.de/forum/forumdisplay.php?f=12)
-   -   PHP Funktion aufrufen (http://www.selfphp.de/forum/showthread.php?t=8294)

bweichel 29.07.2004 14:34:37

PHP Funktion aufrufen
 
Hallo,

ich habe mit eine Funktion warenkorb() geschrieben die den übergebenen Artikel in den Warenkorb legt.

Wie kann ich die Funktion nun über einen Link aufrufen, sodass die Funktion den übergeben Artikel in den Warenkorb legt?

Vielen Dank für eure Hilfe!

Gruß Björn

xabbuh 29.07.2004 14:37:38

Direkt über einen Link kannst du keine Funktion aufrufen. Du könntest aber etwas in dieser Art machen:

Link: datei.php?action=add

PHP-Code:

<?php
    
if($_GET['action'] == "add") {
        
warenkorb();    //<-- Funktion aufrufen
    
}
?>


bweichel 29.07.2004 15:25:27

Super danke...

Ich bin zwar kein Anfänger mehr was PHP betrifft, aber ich habe mich noch nie so besonders mit Funktionen und Klassen beschäftigt. Heute habe ich mir nun mal versucht eine Klasse mit verschiedenen Methoden zu schreiben. Vielleicht könnt ihr ja mal reinschauen und mir Verbesserungsvorschläge unterbreiten. Es ist nicht besonderes... Ist ist eine Klasse warenkorb, die es mir ermöglich Artikel in einen Warenkorb zu legen oder zu löschen. Fehlt noch die update Funktion, aber die kommt noch.

Also bitte schaut`s euch mal an:

PHP-Code:

class warenkorb {
    function 
update($art_nr$anzahl$PHPSESSID) {
        
$query "UPDATE ";
        
$query.= "warenkorb ";
        
$query.= "SET anzahl = $anzahl ";
        
$query.= "WHERE art_nr = '$art_nr' ";
        
$query.= "AND session_id = '$PHPSESSID'";
        
        
$result mysql_query($query);    
    }

    function 
insert($art_nr$anzahl$PHPSESSID) {
        
$query "SELECT * ";
        
$query.= "FROM warenkorb ";
        
$query.= "WHERE art_nr = '$art_nr' ";
        
$query.= "AND session_id = '$PHPSESSID'";
        
        
$result mysql_query($query);
        
        
$row mysql_fetch_array($result);
        
        if(
$row[art_nr] != "") {
            
$anzahl $anzahl $row[anzahl];
            
            
$this->update("$art_nr"$anzahl"$PHPSESSID");    
        }
        else {
            
$query_1 "INSERT ";
            
$query_1.= "INTO warenkorb ";
            
$query_1.= "(session_id, art_nr, anzahl) ";
            
$query_1.= "VALUES('$PHPSESSID', '$art_nr', $anzahl)";
            
            
$result_1 mysql_query($query_1);
        }
    }
    
    function 
delete($art_nr$PHPSESSID) {
        
$query "DELETE * ";
        
$query.= "FROM warenkorb ";
        
$query.= "WHERE art_nr = '$art_nr' ",
        
$query.= "AND session_id = '$PHPSESSID'";
        
        
$result mysql_query($query);    
    }
    
    function 
delete_all($PHPSESSID) {
        
$query "DELETE * ";
        
$query.= "FROM warenkorb ";
        
$query.= "WHERE session_id = '$PHPSESSID'";
        
        
$result mysql_query($query);    
    }    
}

if(
$_GET['action'] == "add") {
    
$mein_warenkorb = new warenkorb;
    
$mein_warenkorb->insert("$_GET[art_nr]"1"$PHPSESSID");
}

if(
$_GET['action'] == "delete") {
    
$mein_warenkorb = new warenkorb;
    
$mein_warenkorb->delete("$_GET[art_nr]""$PHPSESSID");    
}

if(
$_GET['action'] == "delete_all") {
    
$mein_warenkorb = new warenkorb;
    
$mein_warenkorb->delete_all("$PHPSESSID");    



bazubi 29.07.2004 15:52:18

Sieht auf den ersten Blick sehr sauber aus, nur widersprichts in meinem Augen dem OOP Prinzip ein wenig, denn Du erzeugst für jede Aktion eine eigenes Warenkorbobjekt. Geschickter wäre es, nur ein Objekt zu erzeugen und immer dieses zu verwenden, denn der Warenkorb (das Objekt) bleibt immer der gleiche, nur ändern sich Eigenschaften davon.

So fände ich es sinniger:

PHP-Code:


class warenkorb {

 
//Konstruktor - wird bei erzeugung des Objekts aufgerufen.
 
function warenkorb() {
  
//Damit man nicht immer session_id() verwenden muss,
  //wird diese einfach in $id gespeichert, so dass man
  //in den anderen funktionen über $this->id darauf
  //zugreifen kann
  
var $id session_id();
 }

 function 
insert($produktid$menge) {
   
//Checken if $produktid schon drin ist
   //Falls ja -> Menge hinzuaddieren, falls nein
   //neuen Datensatz.
 
}

}

//Außerhalb der Klasse am besten ganz oben von jedem Script:
$meinwarenkorb = new warenkorb();

if (
$_GET['action'] == 'add') {
 
$meinwarenkorb->insert($_GET['productid'], $_GET['menge']);



xabbuh 29.07.2004 15:57:35

Ich würde beim Warenkorb gar nicht mit MySQL arbeiten, sondern die Anzahl der Artikel direkt in der Session speichern. Außerdem kannst du dann die Methoden update und insert zusammenfassen. Dann könnte die Klasse so aussehen:

PHP-Code:

<?php
    
class warenkorb {
        function 
update($art_nr$anzahl)
        {
            if(
$anzahl == 0) {
                unset(
$_SESSION['warenkorb'][$art_nr]);
            } else {
                
$_SESSION['warenkorb'][$art_nr] = $anzahl;
            }
        }
        function 
delete($art_nr) {
            
$this->update($art_nr0);
        }
    
        function 
delete_all($PHPSESSID) {
            unset(
$_SESSION['warenkorb']);
        }    
    }
?>

EDIT: Und um bazubis Ansatz aufzunehmen:

PHP-Code:

<?php
    $mein_warenkorb 
= new warenkorb;

    if(
$_GET['action'] == "add") {
        
$mein_warenkorb->insert($_GET[art_nr]);
    }

    if(
$_GET['action'] == "delete") {
        
$mein_warenkorb->delete($_GET[art_nr]);    
    }

    if(
$_GET['action'] == "delete_all") {
        
$mein_warenkorb->delete_all();    
    }
?>


bweichel 29.07.2004 16:21:07

Sehr gut, auf die Idee mit dem SESSION-Warenkorb bin ich noch nicht gekommen.

Habe nun noch eine Kontruktor wie oben gebaut und darin die Variable $PHPSESSID in $id umwandeln wollen. Leider kommt bei mir ständig die Meldung:

[PHP]
Parse error: parse error, unexpected T_VAR in /var/www/media2be/media2be.de/docs/_php/class_warenkorb.php on line 7
[PHP]

Also ich habe es quasi mehr oder weniger aus dem obigen Script kopiert.

PHP-Code:

class warenkorb {
    function 
warenkorb() {
        var 
$id session_id();
    }
    
    function 
update($art_nr$anzahl) {
        
$query "UPDATE ";
        
$query.= "warenkorb ";
        
$query.= "SET anzahl = $anzahl ";
        
$query.= "WHERE art_nr = '$art_nr' ";
        
$query.= "AND session_id = '$this->id'";
        
        
$result mysql_query($query);    
    }

    function 
insert($art_nr$anzahl) {
        
$query "SELECT * ";
        
$query.= "FROM warenkorb ";
        
$query.= "WHERE art_nr = '$art_nr' ";
        
$query.= "AND session_id = '$this->id'";
        
        
$result mysql_query($query);
        
        
$row mysql_fetch_array($result);
        
        if(
$row[art_nr] != "") {
            
$anzahl $anzahl $row[anzahl];
            
            
$this->update("$art_nr"$anzahl"$this->id");    
        }
        else {
            
$query_1 "INSERT ";
            
$query_1.= "INTO warenkorb ";
            
$query_1.= "(session_id, art_nr, anzahl) ";
            
$query_1.= "VALUES('$this->id', '$art_nr', $anzahl)";
            
            
$result_1 mysql_query($query_1);
        }
    }
    
    function 
delete($art_nr) {
        
$query "DELETE * ";
        
$query.= "FROM warenkorb ";
        
$query.= "WHERE art_nr = '$art_nr' ";
        
$query.= "AND session_id = '$this->id'";
        
        
$result mysql_query($query);    
    }
    
    function 
delete_all() {
        
$query "DELETE * ";
        
$query.= "FROM warenkorb ";
        
$query.= "WHERE session_id = '$this->id'";
        
        
$result mysql_query($query);    
    }
    
    function 
select() {
        
$gesamt_anzahl 0;
        
$gesamt_wert 110;

        
$query "SELECT * ";
        
$query.= "FROM warenkorb ";
        
$query.= "WHERE session_id = '$this->id'";
        
        
$result mysql_query($query);

        while(
$row mysql_fetch_array($result)) {
            
$gesamt_anzahl += $row[anzahl];
        }
        
        return 
$gesamt_anzahl;
        return 
$gesamt_wert;
    }    
}

$mein_warenkorb = new warenkorb;

if(
$_GET['action'] == "add") {
    
$mein_warenkorb->insert("$_GET[art_nr]"1"$PHPSESSID");
}

if(
$_GET['action'] == "delete") {
    
$mein_warenkorb->delete("$_GET[art_nr]""$PHPSESSID");    
}

if(
$_GET['action'] == "delete_all") {
    
$mein_warenkorb->delete_all("$PHPSESSID");    


Was ist ein Kontruktor?

Gruß Björn

bazubi 29.07.2004 16:35:47

Sorry, mein Fehler!

So ist es richtig:
PHP-Code:

class warenkorb {
var 
$id '';

    function 
warenkorb() {
        
$this->id session_id();
    }

    ... 

Der Konstruktor ist die Funktion welche beim erzeugen eines neuen Objektes automatisch aufgerufen wird. Sie hat immer den gleichen Namen wie die Klasse selbst. Den Konstruktor kannst Du dazu verwenden das Objekt zu initalisieren, also Standardwerte setzen, andere Methoden aufrufen. Der Konstruktur ist also sowas wie das Autorun Verzeichnis von KDE oder Windows.

Das Pendant zu Konstruktor ist der Destruktor, welcher automatisch aufgerufen wird, wenn ein Objekt zerstört wird. Allerdings bin ich mir jetzt nicht sicher, ob PHP auch Destruktoren kennt.

xabbuh 29.07.2004 17:29:11

Zitat:

Original geschrieben von bazubi
Der Konstruktor ist die Funktion welche beim erzeugen eines neuen Objektes automatisch aufgerufen wird. Sie hat immer den gleichen Namen wie die Klasse selbst.
Das soll sich in PHP 5 wohl ändern. Da wird dann irgendwie mit __construct gearbeitet. Genaueres weiß ich da aber auch nicht, habe das nur letztens mal in einer Zeitschrift gelesen.

Zitat:

Original geschrieben von bazubi
Das Pendant zu Konstruktor ist der Destruktor, welcher automatisch aufgerufen wird, wenn ein Objekt zerstört wird. Allerdings bin ich mir jetzt nicht sicher, ob PHP auch Destruktoren kennt. [/B]
Ob es den Destruktur in PHP 4 schon gibt, weiß ich auch nicht, soll aber auch in PHP 5 verfügbar sein: __destruct oder so ähnlich. Aber da wird man in Zukunft ja noch mehr hören ;-)

bweichel 30.07.2004 12:59:22

Hallo,

erstmal danke das er mir gestern bei meinem Problem geholfen habt. Ich hoffe ihr seit auch heute wieder mit dabei ;-).

Das mit meiner Klasse warenkorb funktioniert nun bestens. Heute habe ich nun an einer Klasse preise und einer Klasse artikel gearbeitet. Sie steht auch schon soweit, jedoch gibt es bei der Klasse artikel noch das Problem, dass ich aus der Klasse artikel nciht auf die preise zugreifen kann.

Die Klasse preise soll nichts anderes tun als die Preise im richtigen Format auszugeben und ggf. Mwst. draufschlagen oder abziehen.

Die Klasse artikel hingegen besorgt mir alle Artikeldaten und den dazugehörigen Preis. Da ich den Preis sofort im richtigen Format haben möchte, habe ich hierzu aus der Klasse artikel die Klasse preise aufgerufen.

Leider funktioniert es nicht, die Fehlermeldung lautet:
PHP-Code:

Fatal errorCall to a member function on a non-object in /var/www/.../docs/_php/class_artikel.php on line 30 

Hier meine Klasse preise
PHP-Code:

class preise {
    function 
plus($preis$plus) {
        
$preis += $plus;
        
$preis number_format($preis2"," ,".");
        
        return 
$preis;
    }
    
    function 
plus_prozent($preis$plus) {
        
$plus = ($preis 100) * $plus;
        
$preis += $plus;
        
$preis number_format($preis2"," ,".");
        
        return 
$preis;
    }

    function 
minus($preis$plus) {
        
$preis -= $plus;
        
$preis number_format($preis2"," ,".");
        
        return 
$preis;
    }
    
    function 
minus_prozent($preis$plus) {
        
$plus = ($preis 100) * $plus;
        
$preis -= $plus;
        
$preis number_format($preis2"," ,".");
        
        return 
$preis;
    }
    
    function 
gleich($preis) {
        
$preis number_format($preis2"," ,".");
        
        return 
$preis;
    }            


Und zuletzt, die Klasse artikel:
PHP-Code:

class artikel {
    function 
artikel() {
        include(
"class_preise.php");        
        
$mein_preis = new preise();
    }    

    function 
preisliste($art_nr$anzahl) {
        
$query "SELECT * ";
        
$query.= "FROM preisliste ";
        
$query.= "WHERE art_nr = '$art_nr' ";
        
$query.= "AND preisgruppe = 1 ";
        
        if(
$anzahl != "") {
            
$query.= "AND anzahl <= $anzahl ";
        }
        else {
            
$query.= "AND anzahl = 1 ";            
        }
        
        
$query.= "ORDER BY anzahl DESC ";
        
$query.= "LIMIT 1";
        
        
$result mysql_query($query);
        
        
$row mysql_fetch_array($result);
        
        
$this->mein_preis->gleich($row[preis]);
    }
    
    function 
select($art_nr$anzahl) {
        
$query "SELECT * ";
        
$query.= "FROM artikel ";
        
$query.= "WHERE art_nr = '$art_nr'";
        
        
$result mysql_query($query);
        
        
$row mysql_fetch_array($result);
        
        
$this->preisliste("$row[art_nr]"$this->anzahl);    
    }    
}

$mein_artikel = new artikel();

print 
$mein_artikel->select("1010a"1);
print 
"$artikel_nr <br>"

Vielen, vielen Dank für die Hilfe...

Gruß Björn

xabbuh 30.07.2004 13:29:36

Du könntest ja die Klasse artikel von der Klasse preise ableiten. Also so:
PHP-Code:

class artikel extends preise {
    function 
artikel() {
        include(
"class_preise.php");
    }    

    function 
preisliste($art_nr$anzahl) {
        
$query "SELECT * ";
        
$query.= "FROM preisliste ";
        
$query.= "WHERE art_nr = '$art_nr' ";
        
$query.= "AND preisgruppe = 1 ";
        
        if(
$anzahl != "") {
            
$query.= "AND anzahl <= $anzahl ";
        }
        else {
            
$query.= "AND anzahl = 1 ";            
        }
        
        
$query.= "ORDER BY anzahl DESC ";
        
$query.= "LIMIT 1";
        
        
$result mysql_query($query);
        
        
$row mysql_fetch_array($result);
        
        
$this->mein_preis->gleich($row[preis]);
    }
    
    function 
select($art_nr$anzahl) {
        
$query "SELECT * ";
        
$query.= "FROM artikel ";
        
$query.= "WHERE art_nr = '$art_nr'";
        
        
$result mysql_query($query);
        
        
$row mysql_fetch_array($result);
        
        
$this->preisliste("$row[art_nr]"$this->anzahl);    
    }    
}

$mein_artikel = new artikel();

print 
$mein_artikel->select("1010a"1);
print 
"$artikel_nr <br>"

Dann kannst du mit parent::methode() auf die Methoden der Klasse Preise zugreifen.


Alle Zeitangaben in WEZ +2. Es ist jetzt 15:32:44 Uhr.

Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.