refresh-Problem

Alles, was PHP betrifft, kann hier besprochen werden.

refresh-Problem

Postby airis » 12. March 2005 16:03

Hallo Zusammen,

ich frage in einem Rechnungsscript die letzte eingetragene "RECHNUNGID" folgendermaßen ab:
Code: Select all
<?php
//=====================================
// user-daten von address auslesen
//=====================================
  $query = "SELECT FIRSTNAME, LASTNAME, ADDRESS, POSTALCODE, CITY, COUNTRY
   FROM address
   WHERE nickname='".$_SESSION["nickname"]."'";
  $result = @mysql_query($query);
//=====================================
// naechste rechnungsid auslesen
//=====================================
   $query2 = "SELECT RECHNUNGID FROM rechnung ORDER BY RECHNUNGID DESC LIMIT 1";
   $result2 = @mysql_query($query2);
   while ($f = @mysql_fetch_array($result2)) {
      $rechnungid = $f['RECHNUNGID'] + 1;
   }
  if ($result){
    $f = @mysql_fetch_array($result);
?>
HTML-Teil ........

Es funktioniert auch alles soweit, bis auf ein kleines Problem.
Wenn jemand im Browser auf aktualisieren oder F5 drückt, erfolgt ein refresh und die Rechnung-ID wird um eins hochgezählt und es erfolgt ein neuer DB-Eintrag.

Hat jemand eine Idee, wie man dies unterbinden kann?
Airis
airis
 
Posts: 134
Joined: 18. May 2004 12:33

Postby Stefan » 12. March 2005 17:35

Servus,

Ich denke mal vor diesem Ausschnitt erfolgt ein "INSERT INTO", Richtig?
Nach dem Insert willst Du die ID des letzten Eintrages haben, Richtig?
Du hast noch nie was von "mysql_insert_id()" gehört, Richtig?

-> http://www.php.net/manual/de/function.m ... ert-id.php

Zum Reloadproblem:
Dein script weist vermutlich einen eklatanten Mangel an Abbruchkriterien bzw. Fallunterscheidungen auf.

Als Lösung würde ich folgedes vorschlagen:

Code: Select all

$resultat = mysql_query("INSERT INTO `Tabelle` [...] ");

if (result == true)
{
  $_SESSION['LetzteID'] = mysql_insert_id();
  $_SESSION['Meldung'] = "Eintrag erfolgreich";
  header("location:http://meinhost.tld/eintragen.php");
  exit();
}


Dies ist auch nur ein Ausschnitt, natürlich fehlen noch Kriterien um das Insert überhaupt an zu stoßen.



Viel Erfolg
ciao, Stefan

PS: Ich hoffe, das Dein aktuelles script nicht schon von willkürlichen Benutzern bedient wird.
User avatar
Stefan
 
Posts: 475
Joined: 26. December 2002 22:36
Location: Mitten in der sonnigen Südpfalz

Postby airis » 12. March 2005 17:53

Hallo Stefan,

besten Dank für Deine Anwort und Deine Sorge.

... nein, Script läuft momentan nur lokal.

Aber Deine Antwort löst leider nicht mein Problem.
Mein Script bekommt der User nicht zu Gesicht. Am Ende der Formularabarbeitung tritt dieses Rechnungsscript in Aktion und erstellt automatisch eine Rechnung in HTML für den User. Hierzu habe ich o.g. "RECHNUNGID" im Einsatz.
Das Problem mit dem "refresh" greift erst in der HTML-Rechnung und nicht in dem PHP-Script, d.h. die Rechnungs-Nr. wird um +1 hochgezählt und es erfolgt ein neuer DB-Eintrag.

Airis
airis
 
Posts: 134
Joined: 18. May 2004 12:33

Postby Stefan » 12. March 2005 18:51

Mahlzeit,

also wie ich das erkenne, würde ich fast schreiben wollen, daß in Deinem Konzept was nicht stimmt. Auf der Seite, welche die Rechnung ausgibt, dürften wohl kaum irgendwelche "Eintragungsfunktionen" notwendig sein.
Du machst das insert auf einer Seite, speicherst die letzte ID in die Session, verweist per header auf die Rechungsseite, liest dort den Datenstatz anhand der mitgeführten ID wieder ein und fülltst das Template damit. Sollte der Anwender nun die Seite aktualisieren, wird nur erneut seine Rechnung erstellt. Sonst nichts. Gut möglich das ich auch nicht verstehe, wie Du das willst. Poste doch mal mehr von Deinen Script.

ciao, Stefan
User avatar
Stefan
 
Posts: 475
Joined: 26. December 2002 22:36
Location: Mitten in der sonnigen Südpfalz

Postby airis » 12. March 2005 19:17

Hallo Stefan,

das Scipt hat mehr als 1000 Zeilen, ich glaube es ist zu lang zum Posten, oder?

Airis
airis
 
Posts: 134
Joined: 18. May 2004 12:33

Postby airis » 12. March 2005 19:38

Hallo Stefan,

ich nochmal, habe zwischenzeitlich folgendes geschrieben:
Code: Select all
<?php
  $doppelt =  mysql_query("Select DATUM, MYID, RE_SUMME, BEZAHLT, MITTEILUNGTXT, RECHNUNGID
    FROM db_phprechnung.rechnung
    ORDER BY RECHNUNGID DESC LIMIT 1");

  echo mysql_error();
  $anzahl = mysql_num_rows($doppelt);
  print $anzahl;

  if($anzahl==0)
  {
   mysql_query("Insert INTO db_phprechnung.rechnung
               (DATUM, MYID, RE_SUMME, BEZAHLT, MITTEILUNGTXT, RECHNUNGID)
     VALUES (DATUM, MYID, RE_SUMME, BEZAHLT, MITTEILUNGTXT, RECHNUNGID)");
  }
  else{
  echo "Daten existieren schon <br>\n";
}
?>

Es wird auch erkannt, ob Datensatz vorhanden oder nicht. Ich bekomme 0 bzw. 1 angezeigt, aber die RECHNUNGID wird trotzdem hochgezählt.
Kannst Du mir sagen wie ich eine Abhängigkeit zu der letzten RECHNUNGID hinbekomme?

Airis
airis
 
Posts: 134
Joined: 18. May 2004 12:33

Postby airis » 13. March 2005 01:38

Hallo Stefan,

das ist mein momentaner Stand, funzt aber noch nicht richtig.
Ich habe Probleme die 1. Select-Abfrage eindeutig genug zu definieren.
Code: Select all
<?php
//1 =====================================
// doppelter Rechnungseintrag durch aktualisieren verhindern
//=====================================
  $doppelt =  mysql_query("Select DATUM, MYID, nickname, RE_SUMME, BEZAHLT, MITTEILUNGTXT, RECHNUNGID
    FROM db_phprechnung.rechnung
    WHERE nickname='".$_SESSION["nickname"]."'
    ORDER BY RECHNUNGID DESC LIMIT 1");
  echo mysql_error();
  $anzahl3 = mysql_num_rows($doppelt);
  echo $anzahl3;
?>

<?php
//2 =====================================
// user-daten von address auslesen
//=====================================
  $query = "SELECT PREFIX, FIRSTNAME, LASTNAME, COMPANY, ADDRESS, POSTALCODE,
             CITY, COUNTRY, ZAHLUNGSWEISE, NAME_DRUCKEN, MYID, ALTFIELD3
   FROM db_phprechnung.address
   WHERE nickname='".$_SESSION["nickname"]."'
   LIMIT 1";
  $result = @mysql_query($query);

//3 =====================================
// naechste rechnungsid auslesen
//=====================================
   $query2 = "SELECT RECHNUNGID FROM db_phprechnung.rechnung ORDER BY RECHNUNGID DESC LIMIT 1";
   $result2 = @mysql_query($query2);
   while ($f = @mysql_fetch_array($result2)) {
      $rechnungid = $f['RECHNUNGID'] + 1;
   }
  if ($result && $anzahl3==0){
    $f = @mysql_fetch_array($result);
?>

dazwischen HTML-TEILE
Code: Select all
<?php
//4 =====================================
// Rechnungsdaten nach Tabelle
// "rechnung" schreiben
//=====================================
   echo $anzahl3;
  if ($result && $anzahl3==0){  ## von doppelter Rechnungseintrag durch aktualisieren verhindern
   $auslesen=mysql_query("SELECT MYID FROM db_phprechnung.address WHERE `nickname`='"$_SESSION[nickname]"'");
    $row=mysql_fetch_array($auslesen);

   $eintragen=mysql_query("INSERT INTO db_phprechnung.rechnung (`DATUM`, `MYID`,`RE_SUMME`,`BEZAHLT`)
                             VALUES(NOW(), '".$row["MYID"]."', '$zws2', 'N')");
   }
  else{
  echo "Daten existieren schon <br>\n";
}
?>


Vielleicht gehe ich auch in die falsche Richtung?
Airis
airis
 
Posts: 134
Joined: 18. May 2004 12:33

Postby Stefan » 13. March 2005 16:48

ola Airis,

1000 Zeilen Code sind an sich nicht sehr ungewöhlich, doch habe ich die Befürchtung, das in diesen 1000 Zeilen alles möglichen passiert. Von vielleicht Anwendereingabe über Datenbankzugriffe bis hin zur Ausgabe der ausdruckbaren Rechnung. Anhand Deiner Codefragmente kann ich auch nicht richtig rauslesen, was Du eigentlich erreichen willst. Schilder doch mal den Ablauf und was am Ende rauskommen soll.

Und nochmal letzte ID:
ich frage in einem Rechnungsscript die letzte eingetragene "RECHNUNGID" folgendermaßen ab:

Der Code ist schlecht! Benutze "mysql_insert_id()" um die letzte ID in Erfahrung zu bringen.
http://www.php.net/manual/de/function.m ... ert-id.php

Und nochmal Relaodproblem:
Es ist simpel, entweder Du bindest das INSERT in eine angemessene Kontrollstruktur ein, oder Du sorgst dafür, daß Die Rechnung einfach eine eigene Seite herhält, die als Parameter schlicht nur die "RechID" erwartet.

// user-daten von address auslesen

haben die User keine ID?
naechste rechnungsid auslesen

Das kapier ich nicht... Willst Du die nächste ID haben, um sie der nächsten Rechung zu verpassen? Wenn das so ist, werden sich viele Problem und Codezeilen in Luft auflösen, wenn Du es mal mit "AUTO_INCREMENT" versuchst.

dazwischen HTML-TEILE

Versuche so gut wie möglich den PHP-Krempel aus HTML herauszuhalten.
// Rechnungsdaten nach Tabelle
// "rechnung" schreiben

Schon wieder dieser merkwürdig anmutende Versuch einen doppelten Eintrag zu verhindern. Noch dazu fußt der auf Variablen wie "$anzahl3". Versuche Deine Variablennamen besser zu wählen, den wenn Du in ein paar Monaten das Ding mal warten willst, wirst Du Kirre werden, da Du durch Deinen eignen Kram nicht mehr durchblickst.

Wenn etwas zu ersten mal in eine Datenbank eingetragen wird, kann es einen Fall wie Deinen
echo "Daten existieren schon <br>\n";
eigentlich nicht geben. Das es in bei Dir gibt bzw. geben kann .... Hab ich eigentlich schon erwähnt das ich glaube, daß Dein Konzept huft?

Versuchs, schildere in Worten was passieren soll.

don't panic, alles wird gut
ciao, Stefan
User avatar
Stefan
 
Posts: 475
Joined: 26. December 2002 22:36
Location: Mitten in der sonnigen Südpfalz

Postby airis » 13. March 2005 18:16

Cómo está Stefan,

habe einiges geändert und probiert, ich glaube ich lasse diese Sache sein.

Die Seite die ich ersellt habe "neu_2.php" sammelt eigentlich nur in verschiedenen DB-Tabellen die entsprechenden User-Daten zusammen, selektiert nach verschiedenen Kriterien, faßt alles zusammen und gibt innerhalb einer LOGIN-Session dem User eine Rechnung aus. Ferner werden die Rechnungsdaten per insert an ein Rechnungsprogramm weitergegeben wo nur ich Zugriff habe.

Zitat:
naechste rechnungsid auslesen

Das kapier ich nicht... Willst Du die nächste ID haben, um sie der nächsten Rechung zu verpassen? Wenn das so ist, werden sich viele Problem und Codezeilen in Luft auflösen, wenn Du es mal mit "AUTO_INCREMENT" versuchst.

Die ID ist auto_increment. Das Auslesen ist eigentlich nur, um in der Rechnungsseite die nächste Nr. zu erhalten.
Vieleicht gibt es eine bessere Methode?

Mein Gedanke ist im Moment folgender:
Ich schreibe die "RECHNUNGID" in eine temp. Tabelle und lese Sie hier für die Rechnungs-Seite aus.
Im letzten Script der Session lösche ich den Eintrag in der temp. Tabelle.
Damit ereiche ich, das keine "RECHNUNGID" hochgezählt wird.
Wenn der User auf aktualisieren oder F5 drückt wird, so hoffe ich, wird lediglich die Rechnung mit der alten "RECHNUNGID" nochmals aufgerufen.
Doppelter Eintrag verhindern:
Eintrag nur erlauben, wenn "mysql_insert_id()" bzw. "LAST_INSERT_ID()"
!="RECHNUNGID" ist.
FERTIG.

Wie denkst Du darüber?
Viele Grüsse aus Frankreich
Airis
airis
 
Posts: 134
Joined: 18. May 2004 12:33

Postby Stefan » 13. March 2005 18:45

Muito bem, obrigado.
habe einiges geändert und probiert, ich glaube ich lasse diese Sache sein.
nunca rendição!
User avatar
Stefan
 
Posts: 475
Joined: 26. December 2002 22:36
Location: Mitten in der sonnigen Südpfalz

Postby Stefan » 13. March 2005 19:05

Hoppla, ist mir einfach abgehauen.....

Die ID ist auto_increment. Das Auslesen ist eigentlich nur, um in der Rechnungsseite die nächste Nr. zu erhalten.

Dachte ich mir schon.
Vieleicht gibt es eine bessere Methode?

Code: Select all
mysql_query("SELECT (max(RECHID)+1) FROM `Tabelle`[...]")

Bei verwenden von Auto_Increment, ist der größte Wert auch automatisch der letzte. Also suche den größten Wert und füge im 1 hinzu.

Ansonsten kapier ich das immer noch nicht richtig. Wo kommen die Daten eigentlich her bzw. warum wird erst jetzt, beim anfordern der Rechung auch der Eintrag in die DB des Buhaprogramms gemacht?

Vorschlag:

Zusammentragen der Daten, prüfen der Daten, alles OK -> mache den Eintrag in der BuHaProgrammtabelle und per header und in Session gespeicherter RECHID auf die "rechung.php". Rechung.php wird nur noch die ID der Rechung erhalten, die sie auszugeben hat.
Wenn es irgendeinen Fehler gab, sorge dafür, das eben der Eintrag in die DB nicht stattfindet und nicht per header weitergeleitet wird.

Dann wird sich auch das reloadproblem von alleine gelöst haben.

FERTIG!
Was hälst Du davon?

zeig mal Deine Datenbankstruktur.
Und erzähl mal wo die Daten herkommen.

Eu gostaria de pagar
Stefan
User avatar
Stefan
 
Posts: 475
Joined: 26. December 2002 22:36
Location: Mitten in der sonnigen Südpfalz

Postby airis » 13. March 2005 19:33

Hallo Stefan,
es heißt "muy bien".

Alles andere werde ich mir morgen reinziehen.
Habe meiner Freundin versprochen mit Ihr ins Kino und zum Essen zu gehen.

una guapa noche y hasta mañana
Airis
airis
 
Posts: 134
Joined: 18. May 2004 12:33

Postby Stefan » 13. March 2005 19:45

muito brincadeira
User avatar
Stefan
 
Posts: 475
Joined: 26. December 2002 22:36
Location: Mitten in der sonnigen Südpfalz

Postby airis » 17. March 2005 07:00

Hallo Stefan,

Zusammentragen der Daten, prüfen der Daten, alles OK -> mache den Eintrag in der BuHaProgrammtabelle und per header und in Session gespeicherter RECHID auf die "rechung.php". Rechung.php wird nur noch die ID der Rechung erhalten, die sie auszugeben hat.

Dann wird sich auch das reloadproblem von alleine gelöst haben.

Das Reload-Problem hat sich erledigt. Es war die einzige Möglichkeit dieses Problem in den Griff zu bekommen.

Nochmals Danke, wenn auch spät, für Deine Hilfe und Deinen Super-Tipp.
Die Umsetzung benötigte seine Zeit.

Muito sol no coração
Airis
airis
 
Posts: 134
Joined: 18. May 2004 12:33

Postby Stefan » 17. March 2005 19:15

Grüß Dich!

Die Umsetzung benötigte seine Zeit.

Es ist nie zu spät, alles dauert seine Zeit. Viel Erfolg.

ciao, und noch ein paar sonnige Tage wie der heutige.
Stefan
User avatar
Stefan
 
Posts: 475
Joined: 26. December 2002 22:36
Location: Mitten in der sonnigen Südpfalz


Return to PHP

Who is online

Users browsing this forum: No registered users and 9 guests