Probleme bei if-Anweisung

Alles, was PHP betrifft, kann hier besprochen werden.

Probleme bei if-Anweisung

Postby Poison of the Cursed » 16. May 2010 13:44

Hallo Zusammen,

also, zuerst entschuldige ich mich mal für den blöden Titel im Betreff, wusste aber leider nicht, wie ich es anders nennen sollte.
Falls es einen Thread in ähnlicher Form schon gibt, gleich nochmal "Entschudligung", ich habe ihn nicht gesehen.

Nun zu meinem Problem. Ich bin schon total am Verzeifeln.

Meine Besucher können auf meiner Seite in verschiedenen Läden einkaufen. Damit ein Einkauf nicht möglich ist, wenn jemand nichts mehr oder zu wenig auf dem Konto hat, habe ich mir folgendes überlegt.

Ich lese den Kontostand aus der Datenbank aus und speichere ihn in eine Variable.

Code: Select all
$abfrage = "SELECT galleonen, hut, umhang FROM profil WHERE benutzername='" . mysql_real_escape_string($_SESSION["username"]) . "'";
$ergebnis = mysql_query($abfrage);
$row = mysql_fetch_object($ergebnis);

$galleonen=$row->galleonen;
$hut=$row->hut;
$umhang=$row->umhang;


Dann erfolgt der Einkauf, bei dem das Geld vom Konto abgezogen und die Zutat in die dafür vorgesehene Spalte der Datenbank eingefügt wird:

Code: Select all
if(isset($_POST["umhanggrau"]))
{
$aendern = "UPDATE profil Set
galleonen=galleonen-5 WHERE benutzername='" . mysql_real_escape_string($_SESSION["username"]) . "'";
$update = mysql_query($aendern);

$aendern = "UPDATE profil Set
umhang='<img src=\"../images/umhang02.gif\" alt=\"\">' WHERE benutzername='" . mysql_real_escape_string($_SESSION["username"]) . "'";
$update = mysql_query($aendern);
}


Am Ende wird der Kontostand erneut geprüft. Ist das Konto im Minus wird der Einkauf abgelehnt. Hier kommt nun die Variable $galleonen, $hut und $umhang ins Spiel, mit denen ich den Kontostand, und die Tabellenspalten mit dem Bildern auf den Wert vor dem Einkauf zurücksetzen kann.

Code: Select all
$abfrage = "SELECT galleonen FROM profil WHERE benutzername='" . mysql_real_escape_string($_SESSION["username"]) . "'";
$ergebnis = mysql_query($abfrage);
$row = mysql_fetch_object($ergebnis);

if($row->galleonen < 0)
{
$error = "Dein Einkauf konnte nicht getätigt werden.
<br>Du hast zu wenig Geld in Deinem Verlies.";

$aendern = "UPDATE profil Set
galleonen='" . mysql_real_escape_string($galleonen) . "' WHERE benutzername='" . mysql_real_escape_string($_SESSION["username"]) . "'";
$update = mysql_query($aendern);

$aendern = "UPDATE profil Set
hut='" . mysql_real_escape_string($hut) . "' WHERE benutzername='" . mysql_real_escape_string($_SESSION["username"]) . "'";
$update = mysql_query($aendern);

$aendern = "UPDATE profil Set
umhang='" . mysql_real_escape_string($umhang) . "' WHERE benutzername='" . mysql_real_escape_string($_SESSION["username"]) . "'";
$update = mysql_query($aendern);
}


Soweit klappt auch alles.

ABER:
Sind genug Galleonen auf dem Konto und der Besucher hat bereits einen Umhang in grau, wird bei einem weiteren Einkauf z.B. Umhang grün, das Feld in Datenbank einfach überschrieben.

Mit diesem Codeschnipsel, den ich gleich unter die erste Abfrage der Datenbank gehängt hatte (noch vor dem speichern von "row-> in eine Variable), wollte ich dieses Problem aus der Welt schaffen:

Code: Select all
if($row->hut != "" OR $row->umhang != "")     // habe statt OR auch schon AND probiert
{
$error = "Du hast bereits einen Hut und/oder einen Umhang.";
}


Die Meldung wird zwar dargestellt, jedoch bricht das Script an dieser Stelle natürlich nicht ab, sondern läuft bis zum Ende durch (musste mir schon sagen lassen, ein Script einfach abzubrechen wäre ganz schlecht!) und der ausgewählte grüne Umhang wird trotzdem in die Datenbank geschrieben, obwohl dort schon der graue Umhang eingetragen ist.

Wie kann ich diesen Fehler beheben? Habe ich den Codeschnipsel an die falsche Stelle gesetzt?

Ich habe das ganze auch schon in anderer Form versucht und zwar, indem ich direkt beim Einkauf, die Bedingung gesetzt habe, das die Spalte "umhang" nicht gefüllt sein darf. Also so:

Code: Select all
if(isset($_POST["umhanggrau"]) AND $umhang == "")   // hier $umhang und nicht $row->umhang, weil ich an dieser Stelle, den Wert der Tabellenspalte ja schon
                                                                                       in die Variable übergeben habe!!
{
$aendern = "UPDATE profil Set
galleonen=galleonen-5 WHERE benutzername='" . mysql_real_escape_string($_SESSION["username"]) . "'";
$update = mysql_query($aendern);

$aendern = "UPDATE profil Set
umhang='<img src=\"../images/umhang02.gif\" alt=\"\">' WHERE benutzername='" . mysql_real_escape_string($_SESSION["username"]) . "'";
$update = mysql_query($aendern);
}
else
{
$error = "Du besitzt bereits einen Umhang.";
}


Er gibt die Meldung in $error auch aus. Aber die gleiche Meldung kommt seltsamerweise auch, wenn ich nicht den Umhang in grau ausgewählt habe, sondern den Hut in grau, der im Formular an der Stelle darüber sitzt.
Ich komme einfach nicht weiter, drehe mich schon seit einer Stunde im Kreis.

Wäre echt super, wenn ihr mir helfen könntet.

Liebe Grüße
Poison

P.S. hier noch das ganze Script zum besseren Überblick, allerdings ohne Bedingung, dass die Felder "hut" und "umhang" noch nicht gefüllt sein dürfen!!

Code: Select all
<?php
error_reporting(E_ALL);

if(empty($_POST["hutgrau"]) AND empty($_POST["umhanggrau"]) AND empty($_POST["hutgruen"])
AND empty($_POST["umhanggruen"]))
{
$error =  "Du hast vergessen die gewünschten Kleidungsstücke auszuwählen.
<br>
<br><a href=\"../dorf/pumpkins.php\">Zurück</a>";
}
else
{

$verbindung = mysql_connect('localhost', 'Vesta', 'vesta');

if(!$verbindung)
{
$error =  "Dein Einkauf konnte leider nicht verarbeitet werden. Sollte dieser Fehler nochmals auftreten sende
mir bitte Deine Einkaufsliste per E-Mail:
<br>
<br><a href=\"mailto:mail@potionmaster.de\">mail@potionmaster.de</a>";
}
else
{

mysql_select_db("homepage");

if(!mysql_select_db("homepage"))
{
$error =  "Dein Einkauf konnte leider nicht verarbeitet werden. Sollte dieser Fehler nochmals auftreten sende
mir bitte Deine Einkaufsliste per E-Mail:
<br>
<br><a href=\"mailto:mail@potionmaster.de\">mail@potionmaster.de</a>";
}
else
{

$abfrage = "SELECT galleonen, hut, umhang FROM profil WHERE benutzername='" . mysql_real_escape_string($_SESSION["username"]) . "'";
$ergebnis = mysql_query($abfrage);
$row = mysql_fetch_object($ergebnis);

$galleonen=$row->galleonen;
$hut=$row->hut;
$umhang=$row->umhang;


if(isset($_POST["hutgrau"]))
{
$aendern = "UPDATE profil Set
galleonen=galleonen-3 WHERE benutzername='" . mysql_real_escape_string($_SESSION["username"]) . "'";
$update = mysql_query($aendern);

$aendern = "UPDATE profil Set
hut='<img src=\"../images/hutgrau.gif\" alt=\"\">' WHERE benutzername='" . mysql_real_escape_string($_SESSION["username"]) . "'";
$update = mysql_query($aendern);
}



if(isset($_POST["umhanggrau"]))
{
$aendern = "UPDATE profil Set
galleonen=galleonen-5 WHERE benutzername='" . mysql_real_escape_string($_SESSION["username"]) . "'";
$update = mysql_query($aendern);

$aendern = "UPDATE profil Set
umhang='<img src=\"../images/umhang02.gif\" alt=\"\">' WHERE benutzername='" . mysql_real_escape_string($_SESSION["username"]) . "'";
$update = mysql_query($aendern);
}



if(isset($_POST["hutgruen"]))
{
$aendern = "UPDATE profil Set
galleonen=galleonen-3 WHERE benutzername='" . mysql_real_escape_string($_SESSION["username"]) . "'";
$update = mysql_query($aendern);

$aendern = "UPDATE profil Set
hut='<img src=\"../images/hutgruen.gif\" alt=\"\">' WHERE benutzername='" . mysql_real_escape_string($_SESSION["username"]) . "'";
$update = mysql_query($aendern);
}


if(isset($_POST["umhanggruen"]))
{
$aendern = "UPDATE profil Set
galleonen=galleonen-5 WHERE benutzername='" . mysql_real_escape_string($_SESSION["username"]) . "'";
$update = mysql_query($aendern);

$aendern = "UPDATE profil Set
umhang='<img src=\"../images/umhang03.gif\" alt=\"\">' WHERE benutzername='" . mysql_real_escape_string($_SESSION["username"]) . "'";
$update = mysql_query($aendern);
}



$abfrage = "SELECT galleonen FROM profil WHERE benutzername='" . mysql_real_escape_string($_SESSION["username"]) . "'";
$ergebnis = mysql_query($abfrage);
$row = mysql_fetch_object($ergebnis);

if($row->galleonen < 0)
{
$error = "Dein Einkauf konnte nicht getätigt werden.
<br>Du hast zu wenig Geld in Deinem Verlies.";

$aendern = "UPDATE profil Set
galleonen='" . mysql_real_escape_string($galleonen) . "' WHERE benutzername='" . mysql_real_escape_string($_SESSION["username"]) . "'";
$update = mysql_query($aendern);

$aendern = "UPDATE profil Set
hut='" . mysql_real_escape_string($hut) . "' WHERE benutzername='" . mysql_real_escape_string($_SESSION["username"]) . "'";
$update = mysql_query($aendern);

$aendern = "UPDATE profil Set
umhang='" . mysql_real_escape_string($umhang) . "' WHERE benutzername='" . mysql_real_escape_string($_SESSION["username"]) . "'";
$update = mysql_query($aendern);
}

mysql_close($verbindung);

// schließen der noch offenen "else"-Befehle
}
}
}

?>

Poison of the Cursed
 
Posts: 31
Joined: 27. April 2010 17:56

Re: Probleme bei if-Anweisung

Postby Nobbie » 16. May 2010 19:49

Poison of the Cursed wrote:Die Meldung wird zwar dargestellt, jedoch bricht das Script an dieser Stelle natürlich nicht ab, sondern läuft bis zum Ende durch (musste mir schon sagen lassen, ein Script einfach abzubrechen wäre ganz schlecht!) und der ausgewählte grüne Umhang wird trotzdem in die Datenbank geschrieben, obwohl dort schon der graue Umhang eingetragen ist.

Wie kann ich diesen Fehler beheben? Habe ich den Codeschnipsel an die falsche Stelle gesetzt?^


Natürlich bricht das Script dort nicht ab, wieso glaubst Du das? Du fragst bestimmte Variablenwerte ab und wenn einer von beiden nicht leer ist, weist Du Du einer normalen PHP Variablen mit dem Namen $error (ein verführerischer, aber dennoch bedeutungsloser Name) einen String zu (mit einer bestimmten Meldung, die vielleicht irgendwo mal ausgegeben werden soll).

Das ist für PHP selbstverständlich kein Grund, an dieser Stelle die Verarbeitung abzubrechen.
Nobbie
 
Posts: 7014
Joined: 09. March 2008 13:04

Re: Probleme bei if-Anweisung

Postby Poison of the Cursed » 22. May 2010 21:16

Hallo Zusammen,

ich bin jetzt kurz vorm ausflippen. Bastle immer noch an diesem "blöden" Fehler rum.

@Nobbie
Danke für deine Rückmeldung. Ich weiß, dass PHP das Script an dieser Stelle nicht abricht, dazu müsste ich irgendwo ein "exit" setzen. Aber das soll man ja nicht (wurde mir zumindest in einem anderen Forum eingebleut).
Ich will ja auch gar nicht, das PHP die Verarbeitung abricht. Ich will doch nur, das meine if-Bedingung nicht einfach ignoriert wird.

Nochmal zum Problem:
Nachdem die Werte aus der Datenbank abgefragt sind

Code: Select all
$abfrage = "SELECT profil.galleonen, zaubertraenke.* FROM profil INNER JOIN zaubertraenke ON profil.benutzername='" . mysql_real_escape_string($_SESSION["username"]) . "'
AND zaubertraenke.benutzername='" . mysql_real_escape_string($_SESSION["username"]) . "'";
$ergebnis = mysql_query($abfrage);
$row = mysql_fetch_object($ergebnis);


folgt die Definition der Variablen und die Verabeitung der Werte aus dem Formular.

Code: Select all
$kontostand=$row->galleonen;
$vielsafttrank=$row->vielsafttrank;
$furunkeltrank=$row->furunkeltrank;
$stimmbandtrank=$row->stimmbandtrank;
$glueckstrank=$row->glueckstrank;
$staerkungstrank=$row->staerkungstrank;


if(isset($_POST["vielsafttrank"]))
{
$einkauf1=5;
$trank1="Blutegel, Florfliegen, Flussgras";
}
else
{
$einkauf1=0;
$trank1=$vielsafttrank;
}

//insgesamt 5 if-Anweisungen mit abschließendem UPDATE der Datenbank

$einkauf=$einkauf1+$einkauf2+$einkauf3+$einkauf4+$einkauf5;
$galleonen=$kontostand-$einkauf;


if($galleonen < 0)
{
$error = "Dein Einkauf konnte nicht getätigt werden.
<br>Du hast zu wenig Geld in Deinem Verlies.";
}
else
{
$aendern = "UPDATE profil Set galleonen='" . mysql_real_escape_string($galleonen) . "'
WHERE benutzername='" . mysql_real_escape_string($_SESSION["username"]) . "'";
$update = mysql_query($aendern);

$aendern = "UPDATE zaubertraenke Set vielsafttrank='" . mysql_real_escape_string($trank1) . "', furunkeltrank='" . mysql_real_escape_string($trank2) . "',
stimmbandtrank='" . mysql_real_escape_string($trank3) . "', glueckstrank='" . mysql_real_escape_string($trank4) . "',
staerkungstrank='" . mysql_real_escape_string($trank5) . "' WHERE benutzername='" . mysql_real_escape_string($_SESSION["username"]) . "'";
$update = mysql_query($aendern);


Zur Erklärung der vielen Variablen:
Ich hatte in jeder if-Anweisungen schon die UPDATES der Datenbank drin, also insgesamt 10x UPDATE. Da mir, ebenfalls in einem anderen Forum gesagt wurde, dass sowas absolut hirnrissig ist, habe ich versucht das ganze auf die Art zu lösen. Ich kann nur nicht alles in eine Abfrage packen, weil jeder Artikel unterschiedlich kostet, und immer andere Werte in die Datenbank müssen. Falls es auf eine elegantere Art geht, bin ich für TIPPS und Hinweise dankbar.

Zwischen dem "Auslesen Datenbank" und "der Verarbeitung des Formulars" möchte ich nun einen Schritt einfügen, der heißt:
- prüfe ob in den Spalten Vielsafttrank... bereits etwas steht
- wenn ja, Hinweis an den User, dass er diesen Artikel schon gekauft hat
- wenn nein, weiter mit dem Einkauf

Und genau dieser Schritt wird ignoriert. Ich habe es auf verschiedene Arten versucht:

Code: Select all
if($row->vielsafttrank != "")
{
$error = "Du hast diese Zutaten bereits gekauft.";
}
else if($row->furunkeltrank != "")
{
$error = "Du hast diese Zutaten bereits gekauft.";
}
else if($row->stimmbandtrank != "")
{
$error = "Du hast diese Zutaten bereits gekauft.";
}
else if($row->glueckstrank != "")
{
$error = "Du hast die Zutaten bereits gekauft.";
}
else if($row->staerkungstrank != "")
{
$error = "Du hast die Zutaten bereits gekauft.";
}
else
{

//oder

if($row->vielsafttrank == "" OR $row->furunkeltrank == ""  OR ...)
{

// auch mit != und OR / $vielsafttrank == / $vielsafttrank !=


Bei der oberen Variante kommt zwar die Meldung, dass in der Datenbank schon ein Wert vorhanden ist (..diese Zutaten sind bereits gekauft.) Aber nicht nur bei den Spalten, wo wirklich schon was drinsteht, sondern bei allen anderen auch. Das heißt, es wird kein weiterer Einkauf mehr zugelassen, obwohl der Besucher noch gar nicht alle Artikel gekauft hat. Bei der unteren Variante wird der Einkauf immer zugelassen, der Wert in der Datenbank einfach überschrieben wird und wieder Galleonen abgezogen. Sehr schlecht bei unterschiedlich farbigen Artikeln, von denen der Besucher nur einen kaufen darf.
Ich weiß nicht mehr, was ich tun soll.

Kann man so eine Überprüfung gar nicht machen?

Liebe Grüße
Poison
Poison of the Cursed
 
Posts: 31
Joined: 27. April 2010 17:56

Re: Probleme bei if-Anweisung

Postby Nobbie » 23. May 2010 09:42

Poison of the Cursed wrote:Ich weiß nicht mehr, was ich tun soll.


Uns das ganze Script zeigen und nicht nur so ein paar unzusammenhängende Codeschnipsel.

Poison of the Cursed wrote:Kann man so eine Überprüfung gar nicht machen?


Natürlich kann man so eine Überprüfung machen, aber weil ich das Script nicht komplett sehe, kann ich nicht beurteilen, wo Dein logischer Fehler ist.
Nobbie
 
Posts: 7014
Joined: 09. March 2008 13:04

Re: Probleme bei if-Anweisung

Postby Altrea » 23. May 2010 14:26

Poison of the Cursed wrote:
Code: Select all
if(isset($_POST["vielsafttrank"]))


POST-Variablen (mit ausnahme von Werten aus Checkfeldern) aus Formularen werden beim Abschicken IMMER gesetzt, egal ob in diesem Feld etwas drin steht oder nicht. Vielleicht liegt hier ja der Fehler, ohne dein komplettes Script gesichtet zu haben. Möchtest du darauf prüfen, ob ein Feld nicht leer ist, bietet sich die Funktion !empty() an.
We don't provide any support via personal channels like PM, email, Skype, TeamViewer!

It's like porn for programmers 8)
User avatar
Altrea
AF Moderator
 
Posts: 6828
Joined: 17. August 2009 13:05
XAMPP Version: 5.5.19
Operating System: W7Ux64

Re: Probleme bei if-Anweisung

Postby Poison of the Cursed » 23. May 2010 15:19

Hallo Zusammen,

sorry, ich wollte euch nicht mit einem (meiner Meinung nach) Riesen-Script zumüllen. Aber klar, wenn ihr nicht alles seht, könnt ihr mir auch nicht weiterhelfen.
OK, hier also nochmal alles, was ich in das Script reingepackt hab:

Code: Select all
<?php
error_reporting(E_ALL);

if(empty($_POST["vielsafttrank"]) AND empty($_POST["furunkeltrank"]) AND empty($_POST["stimmbandtrank"])
AND empty($_POST["glueckstrank"]) AND empty($_POST["staerkungstrank"]))
{
$error =  "Du hast vergessen ein Zutatenpacket auszuwählen.
<br>
<br><a href=\"../dorf/apotheke.php\">Zurück</a>";
}
else
{

include("../connect.php");

if(!$verbindung OR !mysql_select_db("homepage"))
{
$error = "Dein Einkauf konnte nicht verarbeitet werden. Sollte dieser Fehler nochmals auftreten, sende
mir bitte Deine Einkaufsliste per E-Mail:
<br>
<br><a href=\"mailto:mail@potionmaster.de\">mail@potionmaster.de</a>";
}
else
{

$abfrage = "SELECT profil.galleonen, zaubertraenke.* FROM profil JOIN zaubertraenke ON profil.benutzername='" . mysql_real_escape_string($_SESSION["username"]) . "'
AND zaubertraenke.benutzername='" . mysql_real_escape_string($_SESSION["username"]) . "'";
$ergebnis = mysql_query($abfrage);
$row = mysql_fetch_object($ergebnis);

if($row->vielsafttrank != "")
{
$error = "Du hast diese Zutaten bereits gekauft.";
}
else if($row->furunkeltrank != "")
{
$error = "Du hast diese Zutaten bereits gekauft.";
}
else if($row->stimmbandtrank != "")
{
$error = "Du hast diese Zutaten bereits gekauft.";
}
else if($row->glueckstrank != "")
{
$error = "Du hast die Zutaten bereits gekauft.";
}
else if($row->staerkungstrank != "")
{
$error = "Du hast die Zutaten bereits gekauft.";
}
else
{

$kontostand=$row->galleonen;
$vielsafttrank=$row->vielsafttrank;
$furunkeltrank=$row->furunkeltrank;
$stimmbandtrank=$row->stimmbandtrank;
$glueckstrank=$row->glueckstrank;
$staerkungstrank=$row->staerkungstrank;


if(isset($_POST["vielsafttrank"]))
{
$einkauf1=5;
$trank1="Blutegel, Florfliegen, Flussgras";
}
else
{
$einkauf1=0;
$trank1=$vielsafttrank;
}

if(isset($_POST["furunkeltrank"]))
{
$einkauf2=7;
$trank2="Nesseln, Schlangenzähne, Stachelschweinpastillen, Wellhornschnecken";
}
else
{
$einkauf2=0;
$trank2=$furunkeltrank;
}

if(isset($_POST["stimmbandtrank"]))
{
$einkauf3=6;
$trank3="Alraune, Honigwasser, Nieswurzsirup, Minzzweige";
}
else
{
$einkauf3=0;
$trank3=$stimmbandtrank;
}

if(isset($_POST["glueckstrank"]))
{
$einkauf4=4;
$trank4="Schlafbohne, Schrumpelfeige, Wermutsud";
}
else
{
$einkauf4=0;
$trank4=$glueckstrank;
}

if(isset($_POST["staerkungstrank"]))
{
$einkauf5=6;
$trank5="Feuersalamanderblut, Flubberwurmschleim, Löwenfischgräten";
}
else
{
$einkauf5=0;
$trank5=$staerkunstrank;
}

$rechnung=$einkauf1+$einkauf2+$einkauf3+$einkauf4+$einkauf5;
$galleonen=$kontostand-$rechnung;


if($galleonen < 0)
{
$error = "Dein Einkauf konnte nicht getätigt werden.
<br>Du hast zu wenig Geld in Deinem Verlies.";
}
else
{
$aendern = "UPDATE profil Set galleonen='" . mysql_real_escape_string($galleonen) . "'
WHERE benutzername='" . mysql_real_escape_string($_SESSION["username"]) . "'";
$update = mysql_query($aendern);

$aendern = "UPDATE zaubertraenke Set vielsafttrank='" . mysql_real_escape_string($trank1) . "', furunkeltrank='" . mysql_real_escape_string($trank2) . "',
stimmbandtrank='" . mysql_real_escape_string($trank3) . "', glueckstrank='" . mysql_real_escape_string($trank4) . "',
staerkungstrank='" . mysql_real_escape_string($trank5) . "' WHERE benutzername='" . mysql_real_escape_string($_SESSION["username"]) . "'";
$update = mysql_query($aendern);

mysql_close($verbindung);
}

// schließen der noch offenen else-Befehle
}
}
}
?>


Ich habe die Abfrage, ob Werte in den einzelnen Spalten der Tabelle vorhanden sind, bereits in mehreren Varianten geschrieben und getestet. Auch mit logischen Operatoren wie "AND" und "OR" habe ich es schon versucht.
Ist ein Wert in der Spalte Vielsafttrank vorhanden, ist es korrekt, dass die Meldung kommt. Seltsam ist nur, die Meldung kommt auch, wenn ich im Formular den Stimmbandtrank ausgewählt habe und das Feld hierzu in der Datenbank noch leer ist. Das Formular habe ich mit Checkboxen erstellt, weil in verschiedenen Handbüchern drinsteht, dass nur eine Übertragung von dem erfolgt, was ausgewählt ist.
Habt ihr eine Idee, wo ich den Denkfehler bei der ganzen Sache gebaut habe? Ich komme einfach nicht drauf. Vielleicht steht meine Abfrage einfach nur an der falschen Stelle.

Liebe Grüße
Poison
Poison of the Cursed
 
Posts: 31
Joined: 27. April 2010 17:56

Re: Probleme bei if-Anweisung

Postby Altrea » 23. May 2010 16:00

Dein Denkfehler liegt in folgendem Abschnitt:

Code: Select all
if($row->vielsafttrank != "") {
            $error = "Du hast diese Zutaten bereits gekauft.";
        } else if($row->furunkeltrank != "") {
            $error = "Du hast diese Zutaten bereits gekauft.";
        } else if($row->stimmbandtrank != "") {
            $error = "Du hast diese Zutaten bereits gekauft.";
        } else if($row->glueckstrank != "") {
            $error = "Du hast die Zutaten bereits gekauft.";
        } else if($row->staerkungstrank != "") {
            $error = "Du hast die Zutaten bereits gekauft.";
        } else {
//...


Hier prüfst du ab, ob schon irgendeine der Zutaten in der Datenbank steht. NUR wenn ALLE diese Prüfungen fehlschlagen, führt dein Script den else-Block aus, in dem die übertragung von neuen Zutaten stattfindet.
Du musst dir also nochmal Gedanken über die Struktur deiner Abfragen machen.
Was du brauchst wären Prüfungen ob die aus dem Formular gesetzten Checkfelder/Zutaten bereits in den Datenbankfeldern des Users existieren.

Ich weiß auchnicht, inwiefern du deinen Code übersichtlich einrückst oder nicht. Ein übersichtlich eingerückter Code kann sehr das logische Debugging erleichtern, vorallem wann welche Abschnitte abgearbeiten werden und wann welche nicht.
We don't provide any support via personal channels like PM, email, Skype, TeamViewer!

It's like porn for programmers 8)
User avatar
Altrea
AF Moderator
 
Posts: 6828
Joined: 17. August 2009 13:05
XAMPP Version: 5.5.19
Operating System: W7Ux64

Re: Probleme bei if-Anweisung

Postby Poison of the Cursed » 24. May 2010 15:35

Hallo Altrea,

juuhuuu, ich glaube es funktioniert.
Ich habe mein Script folgendermaßen angepasst (hier der Einkauf in der Schneiderei mit Radio-Buttons, da zwischen zwei Hüten und zwei Umhängen gewählt werden muss):

Code: Select all
// vor diesem Schnipsel steht nur die Abfrage, ob überhaupt etwas im Formular ausgewählt wurde und der Verbindungsaufbau zur Datenbank

$abfrage = "SELECT profil.galleonen, einkauf.hut, einkauf.umhang FROM profil JOIN einkauf ON profil.benutzername='" . mysql_real_escape_string($_SESSION["username"]) . "'
AND einkauf.benutzername='" . mysql_real_escape_string($_SESSION["username"]) . "'";
$ergebnis = mysql_query($abfrage);
$row = mysql_fetch_object($ergebnis);

if($row->hut != "" AND $row->umhang != "")                  //Ablehnung des Einkaufs, wenn alle beiden Artikel bereits gekauft sind
{
$error = "Du besitzt schon einen Hut und einen Umhang.
<br>
<br>><a href=\"../dorf/pumpkins.php\">Zurück</a>";
}
else
{

$kontostand=$row->galleonen;


if(isset($_POST["hut"]) AND !empty($_POST["hut"]))
{
  if($row->hut != "")
  {
  $einkauf1=0;
  $hut=$row->hut;
  $error = "Du besitzt schon einen Hut.
  <br>
  <br><a href=\"../dorf/pumpkins.php\">Zurück</a>";
  }
  else
  {

$einkauf1=3;
$hut=$_POST["hut"];
}
}
else
{
$einkauf1=0;
$hut=$row->hut;
}

if(isset($_POST["umhang"]) AND !empty ($_POST["umhang"]))
{
  if($row->umhang != "")
  {
  $einkauf2=0;
  $umhang=$row->umhang;
  $error = "Du besitzt schon einen Umhang.
  <br>
  <br><a href=\"../dorf/pumpkins.php\">Zurück</a>";
  }
  else
  {
 
$einkauf2=5;
$umhang=$_POST["umhang"];
}
}
else
{
$einkauf2=0;
$umhang=$row->umhang;
}

$rechnung=$einkauf1+$einkauf2;
$galleonen=$kontostand-$rechnung;


if($galleonen<0)
{
$error = "Dein Einkauf konnte nicht getätigt werden.
<br>Du hast zu wenig Geld in Deinem Verlies.";
}
else
{
$aendern = "UPDATE profil Set galleonen='" . mysql_real_escape_string($galleonen) . "' WHERE benutzername='" . mysql_real_escape_string($_SESSION["username"]) . "'";
$update = mysql_query($aendern);

$aendern = "UPDATE einkauf Set hut='" . mysql_real_escape_string($hut). "',
umhang='" . mysql_real_escape_string($umhang) . "' WHERE benutzername='" . mysql_real_escape_string($_SESSION["username"]) . "'";
$update = mysql_query($aendern);

mysql_close($verbindung);
}



Ich habe alles getestet.
Als erstes, Kauf des grünen Hutes. Danach versuchter Kauf des grauen Hutes -> Fehlermeldung "Du besitzt schon einen Hut" -> kein Abzug von Galleonen, Hut grün bleibt in der Datenbank stehen. Dasselbe beim Umhang. Am Ende ist beides gekauft und es erscheint die gewünschte Fehlermeldung -> "Du hast schon einen Hut und einen Umhang".
Das gleiche habe ich jetzt mit den Artikeln der Apotheke versucht (Script von gestern) und es scheint zu funktionieren. Vielen Dank für deinen Tip.

Nun habe ich noch eine Frage zu mySQL. Ich habe im Formular das Attribut VALUE bereits mit den Werten befüllt, die ich in der Datenbank haben möchte. Nun sind da Umlaute dabei. Beispiel: Schlangenzähne, in der Datenbank = Schlangenzähne. Sollte ich Umlaut besser so schreiben, wie ich es in HTML tun muss, also = Schlangenz&auml;hne?
Wenn ich den Wert an anderer Stelle wieder ausgebe, versteht das PHP/HTML dann? OK, für Variablen muss ich bei der Ausgabe sowieso htmlspecialchars() benutzen. Das müsste dann funktionieren oder?

Liebe Grüße
Poison
Poison of the Cursed
 
Posts: 31
Joined: 27. April 2010 17:56

Re: Probleme bei if-Anweisung

Postby Altrea » 24. May 2010 16:40

Poison of the Cursed wrote:Vielen Dank für deinen Tip.

Nichts zu Danken :D

Poison of the Cursed wrote:Nun habe ich noch eine Frage zu mySQL. Ich habe im Formular das Attribut VALUE bereits mit den Werten befüllt, die ich in der Datenbank haben möchte. Nun sind da Umlaute dabei. Beispiel: Schlangenzähne, in der Datenbank = Schlangenzähne. Sollte ich Umlaut besser so schreiben, wie ich es in HTML tun muss, also = Schlangenz&auml;hne?

Würde ich nicht.

Poison of the Cursed wrote:Wenn ich den Wert an anderer Stelle wieder ausgebe, versteht das PHP/HTML dann?

Darauf kann ich ein ganz glasklares: "Kommt drauf an!" antworten :D Willkommen in der wunderbaren Welt der Zeichensätze/-codierungen.
In aller Regel solltest du keine probleme mit Umlauten und Sonderzeichen haben, wenn du:
- die Datei bereits im richtigen Zeichensatz gespeichert hast
- du in den meta-Angaben deines HTML-head den korrekten Zeichensatz mitangibst, damit der Browser diesen verwendet
- du in der Kommunikation zwischen deinem Formular und der Datenbank darauf achtest, dass du der Datenbank mitteilst, wenn das Formular/der Browser des Users einen anderen Zeichensatz als die Datenbank verwendet.

Zeichensätze sind keine triviale Sache. In Verbindung mit Datenbanken erst Recht nicht.
Wenn du mich fragst, verwende überall von vorn herein denselben Zeichensatz! Ich zum Beispiel verwende ausschließlich UTF-8 in allen html-/php-Dateien sowie meinen Datenbanken.
Auf HTML-Notationen für Umlaute (&auml;, etc) kannst du in der Regel gänzlich verzichten (vorausgesetzt der meta-Tag ist gesetzt!), außer du verarbeitest dein Script mit Funktionen/Programmen, die nur den ASCII-Zeichensatz kennen (äußerst selten).

Poison of the Cursed wrote:OK, für Variablen muss ich bei der Ausgabe sowieso htmlspecialchars() benutzen. Das müsste dann funktionieren oder?

Kommt auf den Einsatzzweck an. Um Javascript und HTML in HTML-Ausgaben zu entschärfen bieten sich htmlspecialchars() oder htmlentities() an. Für SQL mysql_real_escape_string(), für die Verwendung in URLs steht urlencode() zur Verfügung.
We don't provide any support via personal channels like PM, email, Skype, TeamViewer!

It's like porn for programmers 8)
User avatar
Altrea
AF Moderator
 
Posts: 6828
Joined: 17. August 2009 13:05
XAMPP Version: 5.5.19
Operating System: W7Ux64

Re: Probleme bei if-Anweisung

Postby Poison of the Cursed » 25. May 2010 18:01

Hallo Altrea,

das mit den Zeichensätzen, scheint für meinen Rechner ein Problem zu sein. Vielleicht bin ich aber auch bloß zu blöd.

Am Anfang habe ich alle meine HTML-Dateien mit ISO-8859-1 geschrieben. Auf dem Rechner hat auch alles super funktioniert. Dann habe ich die Dateien online gestellt und plötzlich hatte ich bei den Umlauten sowas auf dem Bildschirm: �

Wenn ich so eine Seite aufmache, bekomme ich das große Grausen und mache sie ganz schnell wieder zu. Auf der Suche nach einer Lösung für das Problem, bin ich über die Möglichkeit gestoßen, die Umlaute zu ersetzen, also statt ä = &auml;. Ich habe daraufhin alle Umlaute in meinen Dateien durch diese Zeichenfolgen (ö=&ouml;...) ersetzt und der Fehler war gebannt.

Dann wurde mir von mehreren Leuten empfohlen, lieber UTF-8 statt ISO zu verwenden. Brav wie ich bin :mrgreen: , habe ich sämtliche "charsets" auf UTF-8 geändert, die ersetzten Umlaute aber dringelassen. Bis mir jetzt die Ungereimtheit in der Datenbank auffiel (Einstellung SQL = latin1...). Ich habe die Einstellung gleich auf UTF-8 geändert. Leider habe ich heute abend nicht sehr viel Zeit mich meiner Homepage zu widmen, aber deine Aussage

In aller Regel solltest du keine probleme mit Umlauten und Sonderzeichen haben, wenn du:
- die Datei bereits im richtigen Zeichensatz gespeichert hast
- du in den meta-Angaben deines HTML-head den korrekten Zeichensatz mitangibst, damit der Browser diesen verwendet
- du in der Kommunikation zwischen deinem Formular und der Datenbank darauf achtest, dass du der Datenbank mitteilst, wenn das Formular/der Browser des Users einen anderen Zeichensatz als die Datenbank verwendet.

...

Auf HTML-Notationen für Umlaute (&auml;, etc) kannst du in der Regel gänzlich verzichten (vorausgesetzt der meta-Tag ist gesetzt!), außer du verarbeitest dein Script mit Funktionen/Programmen, die nur den ASCII-Zeichensatz kennen (äußerst selten).


musste ich jetzt doch kurz testen. Ich habe bei einigen meiner Seiten (alles bis jetzt nur auf dem localhost, nicht Online) die Umlaute wieder eingetragen.

Also, in meinem HTML-Head steht folgendes:

Code: Select all
<meta http-equiv="content type" content="text/html; charset=UTF-8">


Wenn ich mir (localhost) die Codierung ansehe, in der Firefox die Seite ausgibt steht da: Unicode(UTF-8)
und meine Seite macht das hier:

Hier lagert alles, was Snape zum Brauen von Zaubertr�nken benötigt. Es ist k�hler, was f�r einige Zutaten sehr wichtig ist.
Oh, das sind aber viele Gef��e und alle auf Latein beschriftet. Kannst Du die gesuchten Dinge herausfinden?

Seltsam ist nur:

1. die gleiche Seite mit Internet Explorer geöffnet, und die seltsamen Fragezeichen sind weg.
2. bei Ausgabe von PHP-Code, wie z.B.

Code: Select all
$error ="Du hast keinen Artikel ausgewählt.";


wird das "ä" ganz normal ausgegeben.

Wie geht das denn? Mein Rechner läuft mit Vista, liegt es vielleicht daran? Aber dann müsste ja auch der PHP-Code falsch ausgegeben werden, oder?
Habe ich vielleicht doch einen Fehler in meinem HTML-Head:

Code: Select all
<head>
<title>Keller</title>
<meta name="author" content="Regina Jost">
<meta name="keywords" content="Rustle Oaks, Harry Potter, Orden des Phönix, Rätsel, Abenteuer, Severus Snape">
<meta http-equiv="content type" content="text/html; charset=UTF-8">
<meta http-equiv="content type="Content-Style-Type" content="text/css">
<link rel="stylesheet" type="text/css" href="../style.css">
</head>


Wäre für weitere Hilfe echt dankbar und hoffe, ich stelle mich nicht zu blöd an.

Liebe Grüße
Poison
Poison of the Cursed
 
Posts: 31
Joined: 27. April 2010 17:56

Re: Probleme bei if-Anweisung

Postby Altrea » 25. May 2010 19:24

Wichtig für die korrekte codierung der Umlaute aus HTML ist nichtnur die Angabe in dem meta-tag sondern der Zeichensatz der schon bei Speicherung der Seite verwendet wird.
Wie du das bei deinem Editor sehen/ändern kannst, hängt von deinem Editor ab. Bei Notepad++ (meinem liebsten Editor für kleine Codespielereien) findet man die Einstellung direkt im Menü "Kodierung" (deutsche Sprachdatei).
Da würde ich also Ansetzen um dem problem auf dem grund zu gehen.

Außerdem würde ich im Browser überprüfen, welchen charset er beim aufruf der Seite wählt. Bei FF3.5 findest du den Punkt unter Ansicht->Zeichenkodierung. Steht hier schon trotz des meta-Tags ein falscher Zeichensatz als aktiv, muss man mal schauen, was da schief läuft.

Poison of the Cursed wrote:
Code: Select all
<head>
<title>Keller</title>
<meta name="author" content="Regina Jost">
<meta name="keywords" content="Rustle Oaks, Harry Potter, Orden des Phönix, Rätsel, Abenteuer, Severus Snape">
<meta http-equiv="content type" content="text/html; charset=UTF-8">
<meta http-equiv="content type="Content-Style-Type" content="text/css">
<link rel="stylesheet" type="text/css" href="../style.css">
</head>


Bei meta-Tags würde ich ganz genau auf die korrekte Schreibweise achten. Was ein Browser nicht versteht, das interpretiert er werweißwie.
Die korrekte Bezeichnung des meta-tags für die Zeichenkodierung ist folgende:
Code: Select all
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" >

Die Angabe des charsets würde ich ganz ganz oben direkt hinter dem <head>-Starttag setzen. Denn schon dein title bezieht sich auf den charset.

Auch deine Angabe für den content-style-type ist nicht korrekt.
Im Zweifel Google nach den jeweiligen meta-tags befragen und auf qualifizierte Quellen (w3c zum Beispiel) achten.

Anhand deiner meta-Angaben vermute ich, dass du nach HTML4-Standard programmierst. Hier wäre noch zu beachten, den korrekten DOCTYPE zu setzen, sofern nochnicht geschehen. Das kann schon so manche Fehler von alleine lösen (auch wenn dies nichts mit deinem jetzigen problem zu tun hat).
We don't provide any support via personal channels like PM, email, Skype, TeamViewer!

It's like porn for programmers 8)
User avatar
Altrea
AF Moderator
 
Posts: 6828
Joined: 17. August 2009 13:05
XAMPP Version: 5.5.19
Operating System: W7Ux64

Re: Probleme bei if-Anweisung

Postby Poison of the Cursed » 27. May 2010 20:47

Hallo Altrea,

ok, ich bin wirklich zu blöd.

Ich habe die Seiten von SELFHTML mehrer Male durchgelesen und der Fehler im Head-Tag ist mir nicht aufgefallen. Irgendwie habe ich da was doppelt gemoppelt und mich dazu auch noch vertippt. Uuuaaaaahhhhhh!!!
Aber jetzt weiß ich woher diese seltsamen Fragezeichen kommen und kann den Fehler wirklich "beheben" und nicht nur die "Symptome" bekämpfen.

Da wir aber gerade mal wieder beim Thema sind. Ich habe noch eine Frage bezüglich BOM.
Wegen der Byte Order Mark hatten wir es, glaube ich, schon mal. :-)

Ich habe auf meinen Seiten als erstes (über der DOCTYPE und allem anderen) den Schnipsel

Code: Select all
<?php
session_start();
?>


eingefügt. Die Änderung, dass man die Seite nur aufrufen kann, wenn man eingeloggt ist, also die Überprüfung der $_SESSION['username'], wollte ich erst später einfügen, wenn ich die Seite soweit getestet habe. Nun bekomme ich auf vielen Seiten immer wieder folgende Fehlermeldung:

Code: Select all
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent in...


Daraufhin habe ich geggogelt und bin in mehreren Foren auf die Rückmeldung gestoßen, es wäre vielleicht im Code ein Leerzeichen oder so drin und deswegen käme die Meldung. Leider konnte ich kein Leerzeichen entdecken, weder beim Öffnen mit Notepad++, noch mit einem einfachen Editor. Wenn ich Kodierung allerdings von UTF-8 auf UTF-8 ohne BOM setze, ist die Meldung verschwunden. Wäre ja jetzt einfach, das bei allen Dateien zu machen, aber dann ist die Datei ja wieder nicht in UTF-8 gespeichert (unten steht dann nicht mehr UTF-8, sondern ANSI AS UTF-8). Wie ich jetzt gelernt habe, ist es aber wichtig, dass sowohl die Datenbank, als auch der Browser, das charset und die Kodierung beim Speichern der Datei auf die gleiche Zeichensätze eingestellt sind.

Ist UTF-8 ohne BOM trotzdem ok? Wenn nicht, wie kann ich den Fehler wegbekommen? Soll ich das Script (wenn ich am Ende sowie die SESSION-Variable ganz oben noch einfüge) in eine leere Datei kopieren und neu mit UTF-8 speichern oder muss ich dann meine knapp 120 Dateien nochmal komplett schreiben?

Möchte mich hier auch nochmal für deine Geduld bedanken, meine Begriffstutzigkeit ist mitunter ziemlich nervig.

Liebe Grüße Poison
Poison of the Cursed
 
Posts: 31
Joined: 27. April 2010 17:56

Re: Probleme bei if-Anweisung

Postby Altrea » 28. May 2010 05:32

Poison of the Cursed wrote:Ich habe die Seiten von SELFHTML mehrer Male durchgelesen und der Fehler im Head-Tag ist mir nicht aufgefallen.

SELFHTML war einmal eine gute Referenzseite. Mttlerweile kann man aufgrund zuvieler zu alter Informationen dort aber eigentlich nur davon abraten, diese Referenz alzu wörtlich zu nehmen. SELFHTML ist gerade dabei, sich in einem Wiki-System neu zu erfinden. Mein letzter Stand dort war, dass dieses Wiki noch weit davon entfernt ist als Referenz genannt zu werden.
Also wenn du mich fragst: Finger weg von SELFHTML :D

Poison of the Cursed wrote:Nun bekomme ich auf vielen Seiten immer wieder folgende Fehlermeldung:

Code: Select all
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent in...

[...]
Wenn ich Kodierung allerdings von UTF-8 auf UTF-8 ohne BOM setze, ist die Meldung verschwunden. Wäre ja jetzt einfach, das bei allen Dateien zu machen, aber dann ist die Datei ja wieder nicht in UTF-8 gespeichert (unten steht dann nicht mehr UTF-8, sondern ANSI AS UTF-8).

Gut dass du fragst. UTF-8 ohne BOM (Byte Order Mark)ist die Zeichenkodierung der Wahl! Die ersten 128 Zeichen des UTF-8 Standards sind absolut identisch mit dem ASCII-Zeichensatz (auf dem auch die ISO-Norm 8859 basiert), werden also auch jeweils in 1-Byte Blöcken gespeichert. Da die Interpreter (in dem Falle die Browser) wissen, wie man mit solchen Zeichen umgeht, ohne dass man ihnen das sagt, ist ein BOM absolut überflüssig (der PHP-Interpreter kann mit dem BOM nichteinmal etwas anfangen und gibt es deshalb mit aus, was dann zu solchen PHP-Fehlern führen kann).

Zwei Ausnahmen gibt es:
- Wenn du XHTML nach striktem XML-Standard programmieren würdest und diesen auch als solchen ausliefern würdest (mit den zugehörigen headern, etc), ist ein BOM auch anzuraten.
- Wenn du statt UTF-8 lieber UTF-16 oder UTF-32 verwenden würdest, wo die Zeichen in mehr als 1-Byte Blöcken gepsichert werden, ist ein BOM pflicht, damit Protokolle, die diesen Standard nicht verstehen nicht zu wirren Zeichenwust führen.

Beide Ausnahmen sind mir noch nicht im Livebetrieb begegnet. Kannst du also getrost vergessen.

Poison of the Cursed wrote:Wie ich jetzt gelernt habe, ist es aber wichtig, dass sowohl die Datenbank, als auch der Browser, das charset und die Kodierung beim Speichern der Datei auf die gleiche Zeichensätze eingestellt sind.

Dass es wichtig ist, würde ich so nicht sagen. Es vereinfacht einfach vieles! Ansonsten musst du auch bei der Übertragung zwischen Webserver und Datenbankserver darauf achten, dass sie dieselbe Sprache sprechen. Da UTF-8 quasi keine Nachteile (bis auf die bei Sonderzeichen leicht größere Speicherbelegung) hat, macht es also Sinn sich als Programmierer(-in) das Leben ein Stückchen leichter zu machen :D

Poison of the Cursed wrote:Ist UTF-8 ohne BOM trotzdem ok?

UTF-8 mit BOM ist identisch mit UTF-8 ohne BOM. Das BOM ist nur ein Steuerzeichen (genauer gesagt das Steuerzeichen für ein Leerzeichen ohne Länge und ohne Zeilenumbruch), welches bei der Datenbankübertragung von und zu Datenbankservern keine Rolle spielt.
Also: mehr als okay :D

Poison of the Cursed wrote:Soll ich das Script (wenn ich am Ende sowie die SESSION-Variable ganz oben noch einfüge) in eine leere Datei kopieren und neu mit UTF-8 speichern oder muss ich dann meine knapp 120 Dateien nochmal komplett schreiben?

siehe oben. Wenn mal der Fall eintritt, dass du eine Zeichenkodierung einer Datei ändern möchtest, solltest du bei Notepad++ immer über den Menupunkt "konvertiere zu UTF-8" auswählen, statt einfach nur auf UTF-8 zu stellen. So sorgt Notepad++ direkt dafür, dass alle deine Sonderzeichen in die neue Zeichenkodierung übertragen werden.

Poison of the Cursed wrote:Möchte mich hier auch nochmal für deine Geduld bedanken, meine Begriffstutzigkeit ist mitunter ziemlich nervig.

Kein Ding. Jeder hat mal klein angefangen. Ich würde es auchnicht als Begriffstutzigkeit, sondern als fehlendes Hintergrundwissen bezeichnen. Und fürs Nichtwissen braucht man sich nicht zu schämen. Auch ich muss immernoch viele Dinge nachschlagen (Wikipedia und diverse Referenzseiten sind meine besten Freunde :D).

Wenn du noch Fragen hast, scheu dich nicht zu fragen.
Wer einmal fragt ist einmal unwissend - wer niemals fragt bleibt immer unwissend.

P.S.: Sorry, ist mal wieder ein Roman mit viel Geschichtsunterricht geworden :oops:
We don't provide any support via personal channels like PM, email, Skype, TeamViewer!

It's like porn for programmers 8)
User avatar
Altrea
AF Moderator
 
Posts: 6828
Joined: 17. August 2009 13:05
XAMPP Version: 5.5.19
Operating System: W7Ux64

Re: Probleme bei if-Anweisung

Postby Nobbie » 28. May 2010 10:16

Altrea wrote:Gut dass du fragst. UTF-8 ohne BOM (Byte Order Mark)ist die Zeichenkodierung der Wahl!


Da muss ich leider ernsthaft widersprechen, ich bin kein Freund von utf8 "ohne Not". Wer nicht plant, internationale Zeichen zu vermischen, sondern für den westeuropäischen Raum (oder gar nur in Deutsch) programmiert, sollte auch den angemessenen Zeichensatz benutzen.

Es sind nämlich durchaus tückische Effekte möglich, die für Einsteiger nur sehr schwer in den Griff zu kriegen sind, und das möchte ich an diesem kleinen Beispielscript demonstrieren. Einfach das Script per copy&paste in einen Editor einfügen und im "empfohlenen" UTF8 ohne BOM speichern und ausführen:

Code: Select all
<?php
   $str = 'Möhre';
   
   echo "Die $str hat ".strlen($str)." Stellen";
?>


Und das ist ein hässliches Problem und tritt nicht auf, wenn man das Script in Latin1 (od. ISO-8859-1 bzw. ISO-8859-15 od. Windows-1252 usw.) abspeichert.
Nobbie
 
Posts: 7014
Joined: 09. March 2008 13:04

Re: Probleme bei if-Anweisung

Postby Altrea » 28. May 2010 12:09

Nobbie wrote:Es sind nämlich durchaus tückische Effekte möglich, die für Einsteiger nur sehr schwer in den Griff zu kriegen sind, und das möchte ich an diesem kleinen Beispielscript demonstrieren. Einfach das Script per copy&paste in einen Editor einfügen und im "empfohlenen" UTF8 ohne BOM speichern und ausführen:

Code: Select all
<?php
   $str = 'Möhre';
   
   echo "Die $str hat ".strlen($str)." Stellen";
?>


Und das ist ein hässliches Problem und tritt nicht auf, wenn man das Script in Latin1 (od. ISO-8859-1 bzw. ISO-8859-15 od. Windows-1252 usw.) abspeichert.


Nobbie hat natürlich recht. Ein paar PHP-Funktionen beziehen sich direkt auf die Anzahl belegter Bytes eines Zeichens, so auch die Funktion strlen(). Es wird also durch diese Funktion nicht die Zeichenlänge eines Strings ausgelesen, sondern dessen Bytebelegung. Und da das ö wie alle Umlaute und einige Sonderzeichen zwei Byte Speicherplatz in Ansprich nimmt, ist diese Ausgabe irreführend.

PHP bietet zu dem Zweck zusätzlich zu den normalen Funktionen sogenannte Multi-Byte-Funktionen an. Diese sind durch ein mb_ gekennzeichnet und verhalten sich ähnlich wie die Funktionen, die sie ersetzen sollen.

Auf Nobbies Beispiel bezogen folgendes Beispiel:
Code: Select all
<?php
   $str = 'Möhre';
   
   echo "Die $str hat ".strlen($str)." Stellen<br />";
   echo "Die $str hat ".mb_strlen($str, 'UTF-8')." Stellen";
?>


Natürlich muss man wissen, dass es solche Funktionen gibt!
Das Ärgernis und die Fehlersuche bei falschen oder unterschiedlichen Zeichensätzen schätze ich für einen Anfänger aber deutlich Zeitaufwendiger ein, weshalb ich dennoch bei meiner Überzeugung bleibe, durchweg UTF-8 zu verwenden.
We don't provide any support via personal channels like PM, email, Skype, TeamViewer!

It's like porn for programmers 8)
User avatar
Altrea
AF Moderator
 
Posts: 6828
Joined: 17. August 2009 13:05
XAMPP Version: 5.5.19
Operating System: W7Ux64

Next

Return to PHP

Who is online

Users browsing this forum: No registered users and 1 guest