Mahlzeit,
wenn ich das nachfolgende Script auf meinem Webspace ausführe, erhalte ich nach ca. 5 Minuten folgende Meldung "504 Gateway Time-out" das bedeutet doch, dass der Server zu lange für das Ausführen des Script benötigt, richtig?
das wäre eine mögliche Erklärung. Eine andere wäre, dass das Script einen fatalen Fehler verursacht hat und PHP keine brauchbare HTTP-Ausgabe mehr erzeugen kann - bei einem direkten Request ohne Umweg über einen Proxy wäre das typischerweise ein "500 Internal Server Error".
$update_preise = update_preise($mysqli); if($update_preise > 0) { foreach($update_preise as $array){
STOP! Das sieht schon mal ziemlich falsch aus.
Erstens ist es keine gute Idee, für eine Funktion und eine Variable den gleichen Bezeichner zu wählen. Das führt früher oder später zu Verwirrung.
Zweitens: Was liefert denn deine Funktion update_preise() als Ergebnis? in der if-Abfrage vergleichst du dieses Ergebnis zunächst mit 0, erwartest also offensichtlich einen Zahlenwert. Und dann lässt du foreach darauf los, das ergibt aber nur einen Sinn, wenn es ein Array ist.
Also was denn nun?
$stmt1 = $mysqli->prepare("SELECT Nr, Netto FROM preise WHERE Nr=?"); $stmt1->bind_param("s", $array['artnr']); $stmt1->execute(); $stmt1->bind_result($Nr, $Netto); $stmt1->store_result(); $stmt1->fetch();
Das sind viele, viele aufeinanderfolgende Datenbankabfragen in einer Schleife. Schon möglich, dass das eine Weile dauert.
$Preis = str_replace(",", ".", $Netto); $Preis = number_format($Preis, 2, ',', ' ');
Auch Unsinn: Erst wandelst du den Zahlenwert $Netto in einen String und ersetzt Punkte durch Kommas, und dann übergibst du den String zur Aufbereitung an number_format()? Dabei wird er natürlich wieder in eine Zahl konvertiert, und das Komma und alles, was danach kommt, wird ignoriert.
if ($stmt = $mysqli->prepare("Update produkte SET preis=? WHERE artnr = ?")) { $preis = $Preis; $artnr = $array['artnr']; $stmt->bind_param("ss", $preis, $artnr);
Autsch. Jetzt auch noch Bezeichner, die sich nur durch Groß/Kleinschreibung unterscheiden. Das ist ganz bestimmt keine gute Idee - abgesehen davon, dass das reine Umkopieren hier völlig unnötig ist, denn du könntest die Originaldaten auch direkt an bind_param() übergeben.
Und ... Moment mal: Preis als String? Das ist'n Irrtum, oder?
So long,
Martin
Logik ist die Theorie, Chaos die Praxis.