DB Abfrage wird nicht beendet

promotionhouse.rs

Grünschnabel
Hallo

Brauch wiedermal eure Hilfe
Ich mache ein Datenbank abfrage mit while-schleife leider wird diese manchmal nicht beendet. Hört einfach auf oder Bricht ab, was auch immer wenn das passiert
möchte ich eine Ausgabe haben.

Wenn Abfrage ordnungsgemäß erfolg bekomme ich eine Email, diese möchte ich auch haben wenn ein Anbruch oder die abfrage einfach nicht weiter macht.
Ist sowas möglich ?


PHP:
<?php
$ergebnis = mysqli_query($conny, "SELECT * FROM artikel_full WHERE intern_status='F' and lieferant='HE' and lager_stati='0'");
while($row = mysqli_fetch_array($ergebnis)) {

$suchstring = $row[ProductID];
$suchstring = trim($suchstring);

$fp= fopen('new_csv/Bestandhz.csv','r');
$found = false;
while ($zeile = fgets($fp,4096)){
if(strstr($zeile,$suchstring)){

$lagerbest = explode(';',$zeile);
$lagerbest[1] = trim($lagerbest[1]);
$found = true;
print $i." (".$row[id].")<BR>Artikel-ID: ".$suchstring." in der CSV gefunden Der String:<br>";
print $zeile."( ".$lagerbest[1].")<BR>";
    
}

if(!$found) {
print $i." (".$row[id].")<BR>kein Eintrag für Artikel: ".$suchstring." in der CSV vorhanden<br><br>";
}
$i++;

}
$betreff="lagerbestand aktuallisieren";
$anzahl_abgearbeitet = $i;
$timestamp2 = time();
$datum2 = date("d.m.Y - H:i", $timestamp2);
smail($betreff, $datum1, $datum2, $anzahl_in_db, $anzahl_abgearbeitet);
?>


vielen Dank für eure Hilfe
Gruss Ralf
 
Sollte schon möglich sein.
Da du deinen Code nicht formatiert hast, sehe ich grad nicht wirklich, was er da machen sollte.

Grundsätzlich solltest du dich mit Error-Exceptions auseinandersetzen, wenn du bei einem Abbruch reagieren willst.
 
Tabulatoren verwenden, damit man weiss, wo welche Klammer endet.
Bei dir muss man {} zählen um zu wissen, wie Schleife endet, wo welches if endet, etc.
PHP:
while($row = mysqli_fetch_array($ergebnis)) {
    $suchstring = $row[ProductID];
    $suchstring = trim($suchstring);
    if(true){
        //TODO mach was
    }
}
 
aha

PHP:
<?php
$ergebnis = mysqli_query($conny, "SELECT * FROM artikel_full WHERE intern_status='F' and lieferant='HE' and lager_stati='0'");
while($row = mysqli_fetch_array($ergebnis)) {

$suchstring = $row[ProductID];
$suchstring = trim($suchstring);

$fp= fopen('new_csv/Bestandhz.csv','r');
$found = false;
    while ($zeile = fgets($fp,4096)){
    
        if(strstr($zeile,$suchstring)){
        $lagerbest = explode(';',$zeile);
        $lagerbest[1] = trim($lagerbest[1]);
        $found = true;
        print $i." (".$row[id].")<BR>Artikel-ID: ".$suchstring." in der CSV gefunden Der String:<br>";
        print $zeile."( ".$lagerbest[1].")<BR>";
        }

    
        if(!$found) {
        print $i." (".$row[id].")<BR>kein Eintrag für Artikel: ".$suchstring." in der CSV vorhanden<br><br>";
        }
    }
$i++;
}

$betreff="lagerbestand aktuallisieren";
$anzahl_abgearbeitet = $i;
$timestamp2 = time();
$datum2 = date("d.m.Y - H:i", $timestamp2);
smail($betreff, $datum1, $datum2, $anzahl_in_db, $anzahl_abgearbeitet);
?>

Hoffe das ist jetzt besser.
 
Nö. So sollte es aussehen, dann erkennt man auch gleich Schwachstellen
PHP:
<?php
    $ergebnis = mysqli_query($conny, "SELECT * FROM artikel_full WHERE intern_status='F' and lieferant='HE' and lager_stati='0'");
    while($row = mysqli_fetch_array($ergebnis)) {

        $suchstring = $row[ProductID];
        $suchstring = trim($suchstring);

        $fp= fopen('new_csv/Bestandhz.csv','r');
        $found = false;
        while ($zeile = fgets($fp,4096)){
        
            if(strstr($zeile,$suchstring)){
                $lagerbest = explode(';',$zeile);
                $lagerbest[1] = trim($lagerbest[1]);
                $found = true;
                print $i." (".$row[id].")<BR>Artikel-ID: ".$suchstring." in der CSV gefunden Der String:<br>";
                print $zeile."( ".$lagerbest[1].")<BR>";
            }
            if(!$found) {
                print $i." (".$row[id].")<BR>kein Eintrag für Artikel: ".$suchstring." in der CSV vorhanden<br><br>";
            }
        }
        $i++;
    }

    $betreff="lagerbestand aktuallisieren";
    $anzahl_abgearbeitet = $i;
    $timestamp2 = time();
    $datum2 = date("d.m.Y - H:i", $timestamp2);
    smail($betreff, $datum1, $datum2, $anzahl_in_db, $anzahl_abgearbeitet);
?>

1) Der if(!$found) führst du auf jeder Zeile der Datei aus. Sollte wohl eher nach der Datgeiverarbeitung passieren

2) für csv-Dateien gibt es den fgetcsv() Befehl. Das erspart dir das Zerlegen der Zeile

3) Ein Fehlerhandling muss erstellt werden
 
Bin Ich Blind oder führst Du deinen CSV Import bei jeden Schleifen Durchgang durch.
Da ist es kein Wunder dass die ins Endlose geht :)

Zudem wo oder wann setzt du $i ein?!
Du sagst nach deiner Schleife $i++;

Aber dein Indikator ist nicht gesetzt, daher weiß PHP garnicht um welchen Wert er erhöhen soll.

$row[id] => $row['id'] sowie $row[ProductID] => $row['ProductID'].

Gibt es einen Grund warum Du print benutzt?

Zudem sprichst Du Variablen an, die laut deinem Code nirgends Definiert ist. :)
 
Es sind alle variable gesetzt auch $i das ganze Script zu posten wäre der Wahnsinn.

Das script funktioniert tadellos denn manchmal macht er die komplette abfrage aber eben manchmal nicht und wenn es endlos laufen würde wäre es ein kleineres Problem.
aber das Problem ist eben das es einfach aufhört und ich einfach nur ne Meldung will wenn das passiert.

print nutze ich um eine Kontrollausgabe zu haben.

PHP:
<?php
    $i=1;
    $ergebnis = mysqli_query($conny, "SELECT * FROM artikel_full WHERE intern_status='F' and lieferant='HE' and lager_stati='0'");
    while($row = mysqli_fetch_array($ergebnis)) {

        $suchstring = $row[ProductID];
        $suchstring = trim($suchstring);

        $fp= fopen('new_csv/Bestandhz.csv','r');
        $found = false;
        while ($zeile = fgets($fp,4096)){
       
            if(strstr($zeile,$suchstring)){
                $lagerbest = explode(';',$zeile);
                $lagerbest[1] = trim($lagerbest[1]);
                $found = true;
                print $i." (".$row[id].")<BR>Artikel-ID: ".$suchstring." in der CSV gefunden Der String:<br>";
                print $zeile."( ".$lagerbest[1].")<BR>";
            }
            if(!$found) {
                print $i." (".$row[id].")<BR>kein Eintrag für Artikel: ".$suchstring." in der CSV vorhanden<br><br>";
            }
        }
        $i++;
    }

    $betreff="lagerbestand aktuallisieren";
    $anzahl_abgearbeitet = $i;
    $timestamp2 = time();
    $datum2 = date("d.m.Y - H:i", $timestamp2);
    smail($betreff, $datum1, $datum2, $anzahl_in_db, $anzahl_abgearbeitet);
?>
 
Naja am einfachsten ist es zu prüfen ob es Datensätze gibt und erst dann die While-Schleife los schicken :)
Zumindestens ist mit mir jetzt nicht bekannt dass es für die While eine Exception-Handling gibt :)

Ich mach es mit einer einfachen Prüfung mittels Anzahl der Datensätze. :D

Habs natürlich jetzt nicht gleich getestet :D

Bei deinem Beispiel:
PHP:
<?php
    $i=1;
    $ergebnis = mysqli_query($conny, "SELECT * FROM artikel_full WHERE intern_status='F' and lieferant='HE' and lager_stati='0'");
    //$anzahlErg = mysqli_num_rows($ergebnis);
    //if($anzahlErg > 0) {}
    if(mysqli_num_rows($ergebnis) > 0) {
        while($row = mysqli_fetch_array($ergebnis)) {

            $suchstring = $row[ProductID];
            $suchstring = trim($suchstring);

            $fp= fopen('new_csv/Bestandhz.csv','r');
            $found = false;
            while ($zeile = fgets($fp,4096)){

                if(strstr($zeile,$suchstring)){
                    $lagerbest = explode(';',$zeile);
                    $lagerbest[1] = trim($lagerbest[1]);
                    $found = true;
                    print $i." (".$row[id].")<BR>Artikel-ID: ".$suchstring." in der CSV gefunden Der String:<br>";
                    print $zeile."( ".$lagerbest[1].")<BR>";
                }
                if(!$found) {
                    print $i." (".$row[id].")<BR>kein Eintrag für Artikel: ".$suchstring." in der CSV vorhanden<br><br>";
                }
            }
            $i++;
        }
    }

    $betreff="lagerbestand aktuallisieren";
    $anzahl_abgearbeitet = $i;
    $timestamp2 = time();
    $datum2 = date("d.m.Y - H:i", $timestamp2);
    smail($betreff, $datum1, $datum2, $anzahl_in_db, $anzahl_abgearbeitet);
?>
 
Zurück