[PHP] Code Erklärung

djjlx

---???---
ID: 62937
L
9 Mai 2006
599
21
Hallo!

Ich hab jetzt schon hundertmal probiert den nachfolgenden Code zu verstehen. Schaffe es aber nicht. Darum meine Frage:
Kann mir bitte wer den Code und die Funktionsweise erklären?

Der Code:
PHP:
$code = explode("|", $file);

$i = 0;

while($code[$i])
  {
  $bid = $code[$i];
  $i = $i+2;
  $reload = $code[$i];
  $i = $i+2;
  $wert = $code[$i];
  $i = $i+1;

Ist aus einen Interface der Code.

Meines Achtens ist der Inhalt der Variable $code die Ausgabe des Interfaces zb.
bid|reload|wert|

Ich weiß das es funktioniert aber an was erkennt der Code das nach 3 mal | eigentlich wieder eine neue Zeile ist. bzw. warum wird bei $i einmal +2 und dann wieder nur +1 gemacht?

Danke im Voraus

LG
 
Das hängt ja davon ab, wie die eingelesene Datei bzw. der eingelesene String aufgebaut ist... Offensichtlich wird hier in der Variable $file ein String erwartet, der so aussieht:

bid1|feld2 1|reload1|feld4 1|wert1|bid2|feld2 2|reload2|feld4 2|wert2|bid3|....


Dieser wird per explode in seine Einzelteile zerlegt, so dass dann
PHP:
$code[0] = 'bid1'
$code[1] = 'feld2_1'
$code[2] = 'reload1'
...
Das Feld 2 und das Feld 4 sind dem Skript offenbar wurscht, weshalb nach 0 und nach 2 eben jeweils zwei Felder weitergesprungen wird, nach 4 (also dem Feld "wert" aber nur ein Feld weiter, weil bei 5 der nächste Datensatz beginnt. Und diesen Vorgang macht die Schleife eben so lange, wie es ein $code mit dem entsprechenden Index gibt...
 
Also ich hab das jetzt nochmal probiert

Mein Code:
PHP:
$incoming = '1|1|Test1|2|2|Test2|3|3|Test3|';
$absender = 'Admin';
$code = explode("|", $incoming);

$i = 0;

while($code[$i])
  {
  $empf= $code[$i];
  $i = $i+1;
  $betrag = $code[$i];
  $i = $i+1;
  $betreff = $code[$i];
  $i = $i+1;


  $sql="INSERT INTO test_table(empf, betrag, betreff, abs) VALUES ('$empf, '$betrag', '$betreff', '$absender')";
  mysql_query($sql);
  }

Soweit sogut

Nur wenn ich den Code ausführe wird alles richtig eingetragen aber 3 mal
D.h. statt 3 Zeilen in der DB sind 9 Zeilen und zwar so
Zeile 1
Zeile 2
Zeile 3
Zeile 1
Zeile 2
Zeile 3
usw.

Woran liegt das das es 3 mal eingetragen wird?
 
Woran liegt das das es 3 mal eingetragen wird?
Mehrmals das Script laufengelassen ? :ugly:

Zur Konstruktion while($code[$i])...:
Das kann verdammt in die Hose gehen, wenn ein leerer Betreff oder eine 0 im Array is, da "" und 0 als false ausgewertet werden.
Besser: while(isset($code[$i]))... oder $c=count($code); while($i<$c)...
 
Ne, definitiv nur 3 Einträge. Hab deinen Code von Posting #3 kopiert und ausgeben lassen:
Code:
INSERT INTO test_table(empf, betrag, betreff, abs) VALUES ('1, '1', 'Test1', 'Admin')
INSERT INTO test_table(empf, betrag, betreff, abs) VALUES ('2, '2', 'Test2', 'Admin')
INSERT INTO test_table(empf, betrag, betreff, abs) VALUES ('3, '3', 'Test3', 'Admin')
Mehr Einträge gibt das nicht.

P.S. Betrag und Empfänger werden wohl Zahlen sein ;)
 
Habs jetzt nochmal gemacht zuerst db geleert dann script aufgerufen und db nachgeschaut alles 3 mal drinnen.

Wenn ich den $incoming zb. eine "4" Zeile eintrage dann steht alles 4 mal drin

Für was steht das $i hier:?
PHP:
while($code[$i])

Kann sein das das die anzahl der durchgänge der while schleife bestimmt?

Wenn ich ein isset einfüge dann hab ich eine 5 zeile mit inhalt 0 in jeder spalte und trotzdem alles 3 mal :(
 
Für was steht das $i hier:?
PHP:
while($code[$i])

Kann sein das das die anzahl der durchgänge der while schleife bestimmt?

Nein, es wird der Inhalt der Variablen $code[$i] auf Existenz bzw. auf <> 0 geprüft. Im ersten Durchgang ist das also $code[0], also das erste Element aus deiner Zeichenkette, also die "1", innerhalb der Schleife wird $i ja drei mal jeweils um 1 erhöht (was ich persönlich übrigens eher $i++; schreiben würde, statt $i = $i + 1; aber das nur am Rande), so dass zu Beginn der zweiten Runde $i auf 3 steht, und damit die Variable $code[3], also deine "2" geprüft wird.

Dass das mit isset bei dir nicht funktioniert, liegt am "|" am Ende von $incoming. Nachdem der String ja jeweils am | aufgespaltet wird, erhälst du 10 Elemente (index 0 bis 9), nur dass das letzte aus einem leeren String besteht. Gesetzt ist diese Variable aber, weshalb isset($code[9]) noch ein "wahr" liefert, während der Leerstring direkt als while-Bedingung bereits zum Ende der Schleife führt.
Allgemein muss ich meinem fränkischen Kollegen aber Recht geben, so richtig schön ist diese Form der Schleife nicht...

Wie du zu neun Zeilen Ergebnis kommst, ist mir ebenfalls schleierhaft. Irgendwas steht da wohl noch in deinem Code, was du hier nicht gepostet hast, anders kann ich mir das nicht erklären...
 
Wie du zu neun Zeilen Ergebnis kommst, ist mir ebenfalls schleierhaft. Irgendwas steht da wohl noch in deinem Code, was du hier nicht gepostet hast, anders kann ich mir das nicht erklären...

Nein leider nicht!:(

Hier der Komplette Code der datei

PHP:
<?
include ('config.php');
$incoming = '1|1|Test1|2|2|Test2|3|3|Test3|4|4|Test4|';
$absender = 'admin';
$code = explode("|", $incoming);

$i = 0;

while($code[$i])
  {
  $empf = $code[$i];
  $i = $i+1;
  $betrag = $code[$i];
  $i = $i+1;
  $betreff = $code[$i];
  $i = $i+1;


  $sql="INSERT INTO test_table (empf, betrag, betreff, abs) VALUES ('$tokenid', '$betrag', '$betreff', '$absender')";
  mysql_query($sql);
  }
echo "Daten erfolgreich Übernommen";
?>
 
Nein leider nicht!:(

Also mal davon abgesehen, dass die Variable $tokenid, die du in die Datenbank schreiben willst, nicht definiert ist, sehe ich eigentlich keine Fehler in dem Skript... Bleiben also eigentlich nur die Varianten mehrfacher Aufruf oder fehlendes Leeren der Tabelle vorher... Im Zweifelsfall kannst du das Leeren ja auch im Skript nochmal tun... (Vor der Schleife erstmal ein "truncate table `test_table`" ausführen...)
Damit hätten wir dann - solltest du immer noch neun Zeilen erhalten - alle Ursachen ausgeschlossen. Dann bleiben nur noch Außerirdische :mrgreen:
 
Ne ich bin mir ganz sicher das ich das script nur einmal aufgerufen habe und nicht öfters. Leeren der DB hab ich auch ganz sicher gemacht.

Habs jetzt geschafft indem ich die Spalte empf in der Db auf UNIQUE gesetzt habe.

Hat das irgend einen nachteil?
 
Habs jetzt geschafft indem ich die Spalte empf in der Db auf UNIQUE gesetzt habe.

Hat das irgend einen nachteil?

Naja, sauber ist das sicher nicht, wenn dein Code - aus welchen Gründen auch immer - mehrfach den selben Wert in die Spalte empf einfügen will, sorgt deine UNIQUE-Einschränkung dafür, dass das Einfügen mit einem Fehler abgebrochen wird. Je nach Konfiguration deiner Datenbank donnerst du dir damit dann möglicherweise ein Logfile mit den Fehlern voll, außerdem kannst du selbst keinen mySQL-Fehler mehr auswerten, da du ja (fast) immer einen bekommst... Außerdem - ich weiß ja nicht, was dein Skript letztendlich mal tun soll - ist die Spalte auch wirklich eindeutig? Oder kann der selbe Empfänger auch mehrfach etwas empfangen? Das ginge jetzt natürlich auch nicht mehr...
 
Nein die Spalte ist eindeutig. Es kann 1 Empfänger nur einmal geben das war ja auch mein gedankengang warum ich diese Spalte auf Unique setze.

Wie kann ich feststellen ob das Logfile mit den Fehlern zugeschüttet wird?

Danke jetzt schon mal für deine Tolle Hilfe dauert ja schon fast den ganzen Nachmittag.

LG
 
Wie kann ich feststellen ob das Logfile mit den Fehlern zugeschüttet wird?

Das war eigentlich nur ein Beispiel, prinzipiell sollten beide Seiten (PHP-Skript und Datenbank) jeweils sauber arbeiten. D. h., wenn die empf-Spalte eindeutig ist, ist es zwar richtig, sie auf UNIQUE zu setzen, damit
a) ein fehlerhaftes Skript nicht so viel falsch machen kann und
b) ggf. Abfragen von der Datenbank schneller ausgeführt werden können, weil sie sich darauf verlassen kann, dass sie fertig ist, sobald sie einen Treffer in der Spalte gefunden hat
Trotzdem solltest du versuchen, herauszubekommen, was im PHP-Skript falsch läuft, statt dich einfach darauf zu verlassen, dass die Datenbank das schon gerade zieht...

Deshalb würde ich die Variante, im Skript erstmal die Tabelle zu leeren, zumindest mal ausprobieren (natürlich musst du dann vorher die UNIQUE-Einschränkung zurücksetzen, sonst merkst du ja nicht, ob es klappt). Was du auch mal versuchen kannst, ist, dir jeweils dort, wo du normalerweise dein Query absetzt, dieses statt dessen auf dem Bildschirm auszugeben, dann siehst du auch, welches Query wie oft abgesetzt wird...
 
Mal was Grundsätzliches@djjlx:
Warum probierst du überhaupt mit Fremdcode weiterzuarbeiten, den du gar nicht verstehst ? :hö:

Zum Lernen ok, gut; aber wie mir das hier aussieht, versuchst du ernsthaft darauf aufzubauen. Probier halt mal, das Stückcode Code, dass $incoming parsen soll, selber zu schreiben, wie du es dir vorstellst, dass es funktioniert.
 
Naja ganz so ist es ja nicht!

Ich hab ein Script das ich ausbauen möchte und da ich PHP Anfänger/Mittel bin möchte ich halt herumprobieren. Warum das so und so ist und so weiter. Learning by doing einfach.

LG