php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2008

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 26.08.2007, 22:40  
Neuer Benutzer
 
Registriert seit: 07.08.2007
Beiträge: 9
elwood
Standard Problem beim Aufruf einer Funktion

Guten Abend!

Ich habe ein Problem beim Aufruf einer Funktion. Leider ist es sehr umständlich, die Problematik kurz und verständlich wieder zu geben, aber ich werde mich bemühen.

In meinem Online-Shop werden nur 4 Produkte angeboten.
Auf der "Order"- Seite sieht man die Abbildungen der 4 Produkte und entsprechende Eingabefelder für Bestellmenge und "Add to Cart-Buttons".

Sind alle Eingaben korrekt, wird der Kunde auf die "Shipping Detail"- Seite weitergeleitet.

Dort erscheint ein Formular für die üblichen Kundendaten (Name, Lieferadresse, eMail usw.) sowie eine Auflistung der bestellten Waren.

Sind auch hier alle Eingaben korrekt, erscheint nach Klick auf den "Complete Transaction"-Button eine Meldung, dass die Bestellung erfolgreich war. Die gesammelten Daten werden in der Datenbank erfasst.

Das ganze spielt sich auf einer Seite ab, die einzelnen Aktionen habe ich in Funktionen ausgelagert.

Hier der Code in gekürzter Fassung:

PHP-Code:
<?php
include("header.php");
?>

<?php
// *** Beginn Formular Choose Items ****
if (!$_POST['gesendet']=="1" && !$_POST['gesendet1']=="1")
ChooseItems();

if (
$_POST['gesendet']=="1"){
if ((isset(
$_POST['set1'])) && (!ereg("^[1-5]{1}$",$_POST['set1'])) &&
    (isset(
$_POST['set2'])) && (!ereg("^[1-5]{1}$",$_POST['set2'])) &&
    (isset(
$_POST['set3'])) && (!ereg("^[1-5]{1}$",$_POST['set3'])) &&
    (isset(
$_POST['set4'])) && (!ereg("^[1-5]{1}$",$_POST['set4'])))
ChooseItems();
else
ShippingDetails();
// *** Ende Formular Choose Items ***
}

// *** Beginn Formular Shipping Details ***
if ($_POST['gesendet1']=="1"){
if (
$_POST['title'] && $_POST['first_name'] && $_POST['last_name'] && $_POST['adress1'] &&
    
$_POST['city'] && $_POST['state'] && (ereg("^[0-9]{5}$",$_POST['zip'])) &&
    (
ereg("^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@([a-zA-Z0-9-]+\.)+([a-zA-Z]{2,4})$",$_POST['email'])))
CompleteTransaction();
else
ShippingDetails();
// *** Ende Formular Shipping Details ****
}
?>


// ab hier greift das Skript
<?php
// *** Beginn Funktion ChooseItems() ***
function ChooseItems(){ ?>

<form action="<?php $PHP_SELF ?>" method="POST">
<table>
  hier Order-Seite
</table>
<?php
// *** Ende Funktion ChooseItems() ***
}

// *** Beginn Funktion ShippingDetails() ***
function ShippingDetails(){ ?>
<table>
  hier Shipping Detail-Seite
</table>

<?php
// *** Ende Funktion ShippingDetails() ***
}

// *** Beginn Funktion CompleteTransaction() ****
function CompleteTransaction(){ ?>
<table>
  hier CompleteTransaction -Seite
</table>
<?php
// *** Ende Funktion CompleteTransaction() ***
}
?>

<?php
include("footer.php");
?>
Bis hier funktioniert alles tadellos.

Nun das Problem: ich möchte auf der "Shipping Detail"-Seite noch einmal die 4 Produkte mit den zuvor eingegebenen Bestellmengen anzeigen, damit der Kunde seine Bestellung ändern kann. Er korrigiert also ggf. die Bestellmenge oder das Produkt, klickt auf den "Change Order"-Button (welchem die Funktion ChangeOrder() zugwiesen wurde) und es erscheint noch einmal die "Shipping Detail"-Seite jetzt mit den geänderten Eingaben.

Hierzu habe ich folgenden Code eingefügt(vgl. obige Zeilen 21-31):

PHP-Code:
<?php
// *** Beginn Formular Shipping Details ****************************************
if ($_POST['gesendet1']=="1"){
if ((isset(
$_POST['set1'])) && (!ereg("^[1-5]{1}$",$_POST['set1'])) &&
    (isset(
$_POST['set2'])) && (!ereg("^[1-5]{1}$",$_POST['set2'])) &&
    (isset(
$_POST['set3'])) && (!ereg("^[1-5]{1}$",$_POST['set3'])) &&
    (isset(
$_POST['set4'])) && (!ereg("^[1-5]{1}$",$_POST['set4'])))
ChangeOrder();
elseif (
$_POST['gesendet2']=="1"){
if (
$_POST['title'] && $_POST['first_name'] && $_POST['last_name'] && $_POST['adress'] &&
    
$_POST['city'] && $_POST['state'] && (ereg("^[0-9]{5}$",$_POST['zip'])) &&
    (
ereg("^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@([a-zA-Z0-9-]+\.)+([a-zA-Z]{2,4})$",$_POST['email'])))
CompleteTransaction();
else
ShippingDetails();
// *** Ende Formular Shipping Details ******************************************
}
}
?>
Ich erhalte zwar keine Fehlermeldung, wenn ich aber den „Change Order“-Button anklicke passiert gar nichts.

Bzw. erscheinen im noch nicht ausgefüllten Kundendatenformular die üblichen Fehlermeldungen (please enter name, please enter Adress usw.) so als ob ich den "Complete Transaction"-Button angeklickt hätte.

Verständlich???

Wenn Ihr noch weitere Informationen benötigt bzw. etwas unklar sein sollte, bitte nachfragen.

Danke im Voraus für Eure Hilfe,

Matthias
elwood ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 27.08.2007, 07:40  
Erfahrener Benutzer
 
Registriert seit: 16.08.2007
Beiträge: 702
PHP-Kenntnisse:
Anfänger
Igäl befindet sich auf einem aufstrebenden Ast
Standard

Ich nehme mal an die ganzen if($_POST['gesendet']) {...} sind Abfagen, ob ein Submit-Button gedrückt wurde, oder? Hast du dazu eine kleine Legende, welcher gesendet, welchem deiner beschriebenen Buttons entspricht?
__________________
Das Recht auf Dummheit gehört zur Garantie der freien Entfaltung der Persönlichkeit.
Mark Twain
Igäl ist offline  
Alt 27.08.2007, 09:06  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo elwood,

ich würde das Design hier zunächst mal überdenken. So einen Spaghetti-Code kann doch keiner mehr pflegen, wenn der fertig ist. Versuch dir doch mal aufzumalen, wie die 4 Seiten genau aussehen sollen und entwickle dann genau für diese Seiten deine Ausgaben und parametrisier deine URL so, dass diese dynamisch zusammengesetzt werden kann. Alles in den Code zu schreiben ist wahnsinnig unübersichtlich. Zudem kannst du Sessions für die Stati der Bestellung speichern und dort nachfragen, ob einer schon auf die "Shipping-Details" darf.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Alt 27.08.2007, 23:29  
Neuer Benutzer
 
Registriert seit: 07.08.2007
Beiträge: 9
elwood
Standard

Guten Abend!

Danke Euch beiden zunächst für die schnelle Reaktion! Beim Schreiben dieser Zeilen ist mir aufgefallen, warum der "Change Order"-Button die gleiche Aktion ausführt wie der "Complete Transaction"-Button, obwohl ich beiden eine andere Funktion zugewiesen habe!!! Es ist zwar eine Schande, ich gestehe es aber trotzdem. Ich habe den "Complete Transaction"-Button einfach nur kopiert (schreibfaul) und lediglich den image-Namen geändert, NICHT aber name. Natürlich zeigt er mir dann bei beiden Buttons das gleiche Ergebnis an. Und natürlich erhalte ich auch keinen Parse-Error, da ja programmiertechnisch kein Fehler besteht.


@Igäl

Es gibt 3 Buttons. Jedem Button wird eine Funktion zugewiesen. Zusätzlich werden die Formulareingaben geprüft. Ist z.B. die Bestellmenge leer oder höher als 5, wird man erst gar nicht auf die Shipping Detail-Seite weitergeleitet usw.

if $_POST['gesendet']=="1" {ShippingDetails();}
if $_POST['gesendet1']=="1" {ChangeOrder();}
if $_POST['gesendet2']=="1" {CompleteTransaction();}

Add To Cart auf der "Order"-Seite
<input type="image" name="gesendet" border="0" src="images/button_add.gif" width="120" height="19" onFocus="if(this.blur)this.blur()">
<input type="hidden" name="gesendet" value="1">

Change Order auf der "Shipping Detail"-Seite
<input type="image" name="gesendet1" border="0" src="images/button_change.gif" width="120" height="19" onFocus="if(this.blur)this.blur()">
<input type="hidden" name="gesendet1" value="1">

Complete Transaction auf der "Shipping Detail"-Seite
<input type="image" name="gesendet2" border="0" src="images/button_complete.gif" width="120" height="19" onFocus="if(this.blur)this.blur()">
<input type="hidden" name="gesendet2" value="1">


@dr.e.

Ziel dieses Projekts war es, einen kleinen Online-Shop mit geringer Produktzahl zu programmieren. Er sollte so unkompliziert wie möglich, aber dennoch voll funktionsfähig sein.

Als Anregung suchte ich im Netz unter etlichen php-free Skripten nach entsprechendem Material.

Der "kleinste" Shop den ich fand -ausgerichtet für ca. 100 Produkte- besteht aus gezählten 4 Ordnern, 13 Unterordnern, sowie 163 Dokumenten exkl. Bilddateien.

Mein Minishop aus einem Ordner namens MyShop, einem Unterordner namens images, 1 Dokument namens order.php und 1 Dokument namens admin.php = Online-Admin zum ändern der Preise, Ust, Artikelbilder, Anzeige der Monats-u. Jahresstatistik etc.

Dass sich auch bei mir die Anzahl an Ordnern oder Dateien erhöhen kann, z.B. bei Skripterweiterung oder auslagern der admin.php in eine .htaccess-Datei ist selbstredend.

Was meinst Du mit "so einen Spaghetti-Code kann doch keiner mehr pflegen, wenn der fertig ist"?

Ich -als Anfänger- finde ihn gut strukturiert und dank der Kommentare leicht verständlich. Der komplette Bestellvorgang in order.php (Artikel wählen/ Kundendaten/ Bestellung ändern/ Bestellung absenden umfasst gerade mal 650 Zeilen.

Unkomplizierter geht’s nicht mehr...

Aber ich lerne gern dazu -deshalb holt man sich ja Denkanstöße von Profis in einem Forum- und lasse mich eines Besseren belehren!!!

Einmal fertig, braucht man ja nichts mehr pflegen, oder habe ich da gerade einen Denkfehler? Änderungen der Preise, Artikelbilder usw. werden mit der Admin getätigt, und sollte man sich entscheiden, dass komplette Layout zu wechseln, geschieht das in der header.php bzw. einer externen CSS-Datei.

Übrigens ist der Code schon fertig und funktioniert reibungslos. Die Idee mit dem nochmaligen Anzeigen der Produktpalette auf der "Shipping Detail"-Seite ist als zusätzlicher "Service" gedacht, damit der Kunde bei evt. Änderungen nicht noch mal zurückblättern muss. Zuvor hatte ich einen "Continue Shopping"-Button gehabt, welcher wieder zur "Order"-Seite führte.

Gerne werde ich dem Shop noch ein ansprechendes Layout verpassen und das Skript zum freien Gebrauch bzw. Weiterverarbeitung/ Verbesserung in Eurem Forum posten.

In diesem Sinne,
mfg Matthias
elwood ist offline  
Alt 28.08.2007, 11:08  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo elwood,

Zitat:
Was meinst Du mit "so einen Spaghetti-Code kann doch keiner mehr pflegen, wenn der fertig ist"?
Damit bezeichne ich den Code, den du oben geschrieben hast. Wie du sehr richtig bereits bemerkt hast, sortieren andere Vorbilder ihren Code in mehrere Unterordner und in mehrere darin enthaltenen Dateien. Das mag auf den ersten Blick unübersichtlich erscheinen - ist es aber nicht. Es ist eine konsequente Ordnung von Dingen. Ich würde dir raten die einzelnen Funktionen in kleine Dateien auszulagern ud bei Bedarf einzubinden, sonst wird dein Code - wie ich schon sagte - nach einer Zeit nicht mehr zu pflegen sein.


Zitat:
Einmal fertig, braucht man ja nichts mehr pflegen, oder habe ich da gerade einen Denkfehler? Änderungen der Preise, Artikelbilder usw. werden mit der Admin getätigt, und sollte man sich entscheiden, dass komplette Layout zu wechseln, geschieht das in der header.php bzw. einer externen CSS-Datei.
Wird der Online-Shop einmal produktiv eingesetzt und du lässt ein paar Leute diesen teste, wette ich um jeden Betrag, dass die Amazon & Co. verwöhnten Leute dir 10 Features nennen, die Fehlen, die du aber unbedingt - und das auch aus Marketing- und Absatzsteigerungs-Gründen (X-Selling z.B.) - noch mit aufnehmen solltest. Allein beim ersten Feature wirst du an mich denken...


Zitat:
Übrigens ist der Code schon fertig und funktioniert reibungslos. Die Idee mit dem nochmaligen Anzeigen der Produktpalette auf der "Shipping Detail"-Seite ist als zusätzlicher "Service" gedacht, damit der Kunde bei evt. Änderungen nicht noch mal zurückblättern muss. Zuvor hatte ich einen "Continue Shopping"-Button gehabt, welcher wieder zur "Order"-Seite führte.
Dass der Code zum jetzigen Zeitpunkt "as is" funktioniert ist schon klar. Nur von ästhetischem Code ist er weit entfernt. Services? Also doch noch weitere Funktionen? Wenn ja, dann kommst du da ganz schnell an deine Grenzen.


Zitat:
Gerne werde ich dem Shop noch ein ansprechendes Layout verpassen und das Skript zum freien Gebrauch bzw. Weiterverarbeitung/ Verbesserung in Eurem Forum posten.
Das ist ein guter Gedanke, jedoch solltest du dir vorher ein paar strukturelle Gedanken machen, sonst bekommst du das Wort "Spaghetti-Code" noch öfter zu hören.


Nimm bitte meine Kritik positiv auf, ich möchte dir nur mit ein paar (vielleicht auch machmal sarkatischen) Beispielen zeigen, dass du hier noch viel strukturelle Gedanken investieren solltest.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Alt 30.08.2007, 02:00  
Neuer Benutzer
 
Registriert seit: 07.08.2007
Beiträge: 9
elwood
Standard @dr.e.

Hallo, dr.e.!

Hatte bis jetzt eine andere Sichtweise.

Mir ist schon öfters aufgefallen, das es gerade beim Programmieren mehrere Lösungen für ein Problem bzw. verschiedene Wege gibt, ein Projekt zu realisieren.

Habe zum Beispiel einmal den Code eines "freien" Counters aus dem Internet um mehr als 50% gekürzt, bei gleichbleibender Funktionalität!!!

Daher mein Grundgedanke, so wenig Code und so unkomliziert wie möglich bei gleichem Endergebnis...

Verstehe aber Deine Ratschläge und werde sie mir zukünftig zu Herzen nehmen!

Alles Gute weiterhin, wir werden sicher noch voneinander hören.

Von mir aus kann dieser Thread jetzt geschlossen werden.

mfg Matthias
elwood ist offline  
Alt 30.08.2007, 12:54  
Erfahrener Benutzer
 
Registriert seit: 08.11.2004
Beiträge: 2.079
Der_Gerhard ist zur Zeit noch ein unbeschriebenes Blatt
Der_Gerhard eine Nachricht über ICQ schicken
Standard

Zitat:
Zitat von elwood
Was meinst Du mit "so einen Spaghetti-Code kann doch keiner mehr pflegen, wenn der fertig ist"?

Ich -als Anfänger- finde ihn gut strukturiert und dank der Kommentare leicht verständlich. Der komplette Bestellvorgang in order.php (Artikel wählen/ Kundendaten/ Bestellung ändern/ Bestellung absenden umfasst gerade mal 650 Zeilen.

Unkomplizierter geht’s nicht mehr...
Dass wenige Zeilen nichts mit unkompliziertem Code zu tun haben, hat ja dr.E schon geschrieben.

Zusätzlich solltest Du mal Deine Einrückungen angucken.
Da stehen wild if, elseif und else untereinander, die so rein gar nichts auf der gleichen Ebene zu suchen haben.

Die Einrückung der Bedingung im if ist deutlich besser als Block zu erkennen (was aber hier nicht stimmt) als der bedingt auszuführende Code.
Genau so ein Durcheinander wird ja durch Spaghetticode recht gut beschrieben. Man sieht keinen Anfang und kein Ende.
__________________
**********************************
Nein, ich bin nicht die Signatur.
Ich putze hier nur.
**********************************
Der_Gerhard ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] Problem mit ereg Funktion! Horvi PHP Tipps 2008 7 20.05.2008 14:29
Startseite soll nur beim ersten Aufruf eine Funktion laden andrew22 HTML, Usability und Barrierefreiheit 4 02.03.2007 18:44
problem mit einer Funktion LP PHP Tipps 2006 9 27.06.2006 12:56
krankes Problem, schwer zu beschreiben ZeHa PHP Tipps 2006 6 21.04.2006 13:35
funktion soll funktion aufrufen, welche datei einbindet PHP Tipps 2006 12 13.03.2006 18:31
(schnellere) Funktion zum Zusammenfassen von CSS PHP-Fortgeschrittene 21 08.08.2005 16:47
In einer Funktion auf eine Funktion der Klasse zugreifen phpbeginner PHP Tipps 2005-2 2 28.07.2005 00:30
[Erledigt] Problem mit Backslash Patrick Schwarz PHP Tipps 2005-2 5 26.07.2005 09:54
Problem mit PFad Firefox - Verzeichnis löschen PHP Tipps 2005-2 0 19.07.2005 16:05
problem mit der "die" funktion aircrash PHP Tipps 2005 2 08.01.2005 19:44
Problem mit Umsetzung einer Funktion Datenbanken 1 20.12.2004 14:37
problem mit update funktion aircrash PHP Tipps 2004-2 3 17.11.2004 16:55
[Erledigt] Referenz auf Funktion übergeben PHP-Fortgeschrittene 7 20.07.2004 09:51
Problem mit Funktion PHP Tipps 2004 3 17.07.2004 14:30
Problem mit mail() - Funktion PHP Tipps 2004 2 06.07.2004 18:21

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
if (isset( $_post[\'ordernbutton\'] ))

Alle Zeitangaben in WEZ +2. Es ist jetzt 19:05 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.