Antworten auf deine Fragen:
Neues Thema erstellen

SQL Eintrag wird erst nach weiterm Eintrag angezeigt

MasterT

Nicht mehr ganz neu hier

Hallo,
ich stehe vor einem Rätzel. Ich lasse in die SQL schreiben und dieser Eintrag wird erst dann sichtbar, wenn ich einen weitern in die selbe Tabelle mache. Ich stehe vor einem Mysterium! Die Funktion ,,artikellog" macht die Probleme

PHP:
        if(isset($_GET['save'])) {
        
        $sql=mysql_query("SELECT `anzahl`,`artikelid`,`hersteller` FROM `artikel` WHERE id='".$id."'");
        $row=mysql_fetch_assoc($sql);
        
        $anzahl=$row['anzahl'];
        $geladenid=$row['artikelid'];
        
        if(($art) == "-"){
            $ergebniss=$anzahl - $aenderung;
            $zeile = 'ausgang';
        }
        
        if(($art) == "+"){
            $ergebniss=$anzahl + $aenderung;
            $zeile='eingang';
        }
        
        if((empty($aenderung) OR empty($art)) OR (empty($aenderung) AND empty($art))) {
        GOTO start;
        }
        
        if($ergebniss <= "-1"){
            echo'<span style="background-color: red">Fehler! Bemerkung: Lagerkapazit&auml;t unterschritten!</span>';
            } else {
            
                mysql_query("UPDATE artikel SET anzahl='".$ergebniss."' WHERE id='".$id."'");
                artikellog($zeile,$aenderung,$lieferschein,$ergebniss,$id,$row['hersteller'],$kennzeichen);
                
                writelog("hat den Lagerbestand des Artikel mit der Artikel-ID: ".$geladenid." von ".$anzahl." auf ".$ergebniss." geändert.");
                weiterleitung("?seite=lagerbestand");exit;
            }
        }

Und die Funktion:
PHP:
function artikellog($zeile, $veränderung, $lieferschein, $aktuellerstand, $systemid, $hersteller, $kennzeichen) {
    $sql = mysql_query("SELECT id FROM benutzer WHERE username='".$_SESSION["username"]."'");
    $row = mysql_fetch_assoc($sql);
    
    mysql_query("INSERT INTO artikellog SET
    verantwortlicher='".$row['id']."',
    uhrzeit='".date("H:i:s")."',
    datum='".date("Y-m-d")."',
    systemid='".$systemid."',
    ".$zeile."='".$veränderung."',
    lieferschein='".$lieferschein."',
    standdanach='".$aktuellerstand."',
    hersteller='".$hersteller."',
    kennzeichen='".$kennzeichen."'") OR DIE ("Es ist ein Fehler beim speichern der Daten passiert. Wenden Sie sich an den Administrator");
    
}
 

Duddle

Posting-Frequenz: 14µHz

AW: SQL Eintrag wird erst nach weiterm Eintrag angezeigt

Was bedeutet für dich / in deinem Kontext "sichtbar"?


Duddle
 

MasterT

Nicht mehr ganz neu hier

AW: SQL Eintrag wird erst nach weiterm Eintrag angezeigt

Der Eintrag wird in MySQL angezeigt, aber nicht via PHP ausgegeben, außer man schreibt noch mal in die selbe Tabelle, da erscheint der vorletzte Eintrag aber der letzte wird dann nicht ausgegeben
 
Zuletzt bearbeitet:

Duddle

Posting-Frequenz: 14µHz

AW: SQL Eintrag wird erst nach weiterm Eintrag angezeigt

Du gibst in deinen Code-Ausschnitten nichts aus. Ich kann daher nicht nachvollziehen, wann was wie geladen wird.

Du kannst aber im Allgemeinen a) mit phpMyAdmin o.ä. nachvollziehen, dass die Daten in der DB stehen und b) mit Debug-Ausgaben den Status der eingesetzten Variablen verfolgen, damit du siehst wann was schiefgeht.


Duddle
 

MasterT

Nicht mehr ganz neu hier

AW: SQL Eintrag wird erst nach weiterm Eintrag angezeigt

Entschuldige, hier rufe ich die Tabelle ab:
PHP:
        if(isset($_GET['anzeigen'])) {
            
        $sql = "SELECT 
                    artikel.artikelid,
                    artikellog.datum,
                    artikellog.uhrzeit,
                    artikellog.eingang,
                    artikellog.ausgang,
                    artikellog.standdanach,
                    artikellog.lieferschein,
                    artikellog.kennzeichen,
                    artikellog.verantwortlicher,
                    benutzer.username 
                    
                FROM artikellog,benutzer,artikel WHERE 
                    artikellog.systemid='".$_GET['anzeigen']."' AND 
                    artikellog.verantwortlicher=benutzer.id AND 
                    artikellog.systemid = artikel.id 
                ORDER BY artikellog.datum DESC, artikellog.uhrzeit DESC";
        $result = mysql_query($sql);
        $row1 = mysql_fetch_assoc($result);
        
        echo'
        Sie sehen folgenden Artikel:
        <h2>Artikel-ID: '.$row1['artikelid'].'</h2>
        <table cellspacing="0">
            <tr>
                <th>Datum</th>
                <th>Uhrzeit</th>
                <th>Username</th>
                <th>Eingang</th>
                <th>Ausgang</th>
                <th>Lieferschein</th>
                <th>LKW-Kennzeichen</th>
                <th>Stand</th>
            </tr>';
        
        if (mysql_num_rows($result)){
            while($row=mysql_fetch_object($result)) {
                echo'<tr>
                        <td>'.$row->datum.'</a></td>
                        <td>'.$row->uhrzeit.'</td>
                        <td>'.$row->username.'</td>
                        <td>'.$row->eingang.'</td>
                        <td>'.$row->ausgang.'</td>
                        <td>'.$row->lieferschein.'</td>
                        <td>'.$row->kennzeichen.'</td>
                        <td>'.$row->standdanach.'</td>
                    </tr>';            
                } 
                echo'</table> <br /> <a href="?seite=artikel">Zurück</a>';
            }else {
                    echo "Keine Einträge zu diesem Artikel gefunden";}
        exit;
        }

Also ich kann keinen Grund finden. Das Problem ist, es ist auf meinen beiden Servern so, das bis zum vorletzten Eintrag geladen wird und der letzte nur in der DB schlummert
 

Duddle

Posting-Frequenz: 14µHz

AW: SQL Eintrag wird erst nach weiterm Eintrag angezeigt

Schau dir mal die Beschreibungen von mysql_fetch_row() und mysql_fetch_object() an:
Liefert ein numerisch indizertes Array, das der geholten Zeile entspricht und bewegt den internen Datenzeiger vorwärts.
bzw.
Gibt ein Objekt mit Eigenschaften zurück, die mit der angeforderten Zeile korrespondieren, und bewegt den internen Datenzeiger vorwärts.
Der Fehler liegt rein in der Ausgabe, d.h. wie du du beiden Funktionen kombinierst und was dabei intern mit der temporären Ergebnistabelle passiert.

Falls du es mit diesen Hinweisen weiterhin nicht erkennst, frag nochmal nach.


Duddle
 

MasterT

Nicht mehr ganz neu hier

AW: SQL Eintrag wird erst nach weiterm Eintrag angezeigt

Vielen Dank Duddle! Ich muss sagen, du bist eine gute Hilfe.

Ich habe mir beim genaueren anschauen des Dokuments auch gedacht was ich da für einen Müll programmiert habe. Ich kann aber zum Glück aber Fortschritte in meinen PHP Kenntnissen erkennen

Vielen Dank!
 

Curanai

Aktives Mitglied

AW: SQL Eintrag wird erst nach weiterm Eintrag angezeigt

Guten Morgen,

auch auf die Gefahr hin, dass ich mich unbeliebt mache, aber ich muss Dir mal ein wenig in die Ausbildung reden - denn ich habe nun einige Dinge gesehen, da steuere ich direkt gegen und appelliere an eine stabile und feste Basis. Je früher Du das beherzigst, umso besser, lesbarer und wartbarer wird der Source. Die folgende Aufzählung soll nichts mit Belehrung zu tun haben, sondern dient der besseren Lesbarkeit:


[ 1. ] $sql = mysql_query("SELECT `anzahl`,`artikelid`,`hersteller` FROM `artikel` WHERE id='".$id."'");

[a] 'tick marks' (`) sollen die MySQL Engine entlasten; gerade beim Parsen des Befehls. Demnach verwende diese auch (s. "id" in WHERE-Klausel), denn sonst ist der Vorteil direkt wieder weg.

Du greifst in eine Datenbank in für mich unbekannte Größe - gezielt auf einen logischen Key-Index (danach sieht es aus). Dieser wird daher nur 1x vergeben sein. Die Verwendung von LIMIT 1, dient nicht nur um das Ergebnis einzuschränken, sondern auch für MySQL als Stop-Befehl. Stop im Sinne von "ich benötige keine weiteren Ergebnisse von hier". Zur Verdeutlichung: Es befinden sich 5 Mio. Datensätze in Deiner Table und Du willst Key-ID 1 haben ... MySQL arbeitet 5 Mio. Datensätze durch, um Dein WHERE zu finden (könnte ja noch eines da sein). Also: Wenn Du die Möglichkeit hast, da Key-Index, unique o. ä., schränke immer (!) ein.

[c] mysql_query ist "old school" - wird aber leider immer noch in vielen Büchern geführt und gelehrt (bspw. an Schulen). mysqli_query ist aufgrund besserer Performance und Multi-Queries immer die erste Wahl (aber ich gebe zu: Ich habe selbst noch den einen oder anderen mysql_query im Einsatz).

[d] Ein Script, welches bei mir bequem auf 25.000 Zeilen kommt (ohne Kommentare), ist vollgestopft mit Kommandos und Datenbankabfragen wie -aktualisierungen. Gewöhne Dir möglichst an, mit einer Klasse oder lediglich kleinen Funktion mysql_query() zu verwenden. Der Vorteil: Ein Ort zu ändern (bspw. auf mysqli_query()) und nicht über das komplette Script.


[ 2. ] $row = mysql_fetch_assoc($sql);

[a] Mir fehlt persönlich das Abfangen von fehlgeschlagenen Datenbankanfragen. Goldene Regel: Fragen, ob $sql erfolgreich war und anschließend mit mysql_num_rows() die Anzahl ermitteln - ansonsten bekommst jede Menge Notices und Warnings, da bspw. mal kein Ergebnis geliefert wurde (Datensatz unbekannt, gelöscht o. ä.).

Es darf also gern so aussehen:
Code:
$sql = mysql_query("SELECT ... FROM `artikel` WHERE `id`='".$id."' LIMIT 1");
if($sql){
  if(mysql_num_rows($sql) == 1){ // oder > 0 etc.
      $row = mysql_fetch_assoc($sql);
      // mach damit was ...
  }
}


[ 3. ] $anzahl=$row['anzahl'];

[a] Ja, das kommt aus der Datenbank, sollte aber dennoch - Porzellankiste, Elefanten und so - dennoch einem "cast operator" unterworfen werden. Du erwartest eine Zahl aus der Datenbank? Dann bitte so ...

Code:
$anzahl = (int) $row['anzahl'];

Der Vorteil liegt auf der Hand: Wenn Du mit der Anzahl rechnen willst, kommt Dir nichts anderes dazwischen. Und der nächste Vorteil wäre, dass im Falle von keiner Zahl dort eine 0 stehen würde ... eignet sich genauso hervorragend für übergebene POST/GET Parameter.

Es zieht sich wie ein roter Faden durch den Quellcode: fehlende Leerzeichen. Ich find es super, dass zumindest bei den "{" und "}" es schön lederlich ist, aber für die Lesbarkeit sind Leerschritte um "=" sehr zu empfehlen.


[ 4. ] Unnötige Klammern

[a] if(($art) == "-"){ ... die Klammern um "$art" sind deutlich zu viel ...


[ 5. ] GOTO
Ja, der ist noch richtig frisch eigentlich - der GOTO, der in vielen Bereichen belächelt wird und als unnötig deklariert wurde. Es gibt aber tatsächlich Bereiche, wo der GOTO wirklich Sinn macht. Aber falsch verwendet kann das richtig in den Schlüpfer gehen (wie alles andere auch). Da ich GOTO jetzt aber nur in dem Schnippsel sehe, kann ich nicht sagen, ob das, was in "start" alles kommt, zum Gau führen könnte. Tendenziell erwarte ich dort initialisierte Werte, entwertete GET-Arrays usw. Ansonsten: GOTO kenne ich noch aus qbasic (c64) - hurra! :D Ob ich den aber je selbst mal in PHP verweden würde ... ?!


[ 6. ] if($ergebniss <= "-1")
Was passiert hier Deiner Meinung nach?! Wie kann ein String (!) <= etwas sein (ganz salopp geschrieben)? Das Verhalten kann u. U. unerwartet sein oder das Vertrauen in PHP-eigene "wir parsen das mal korrekt"-Funktionen wird überschätzt. Aber teste es: Wenn "$ergebniss" eine waschechte 0 wäre (da bspw. vorher initialisiert - leider nicht sichtbar), lass Dir mal das hier ausgeben:

Code:
var_dump( 0 <= "-1");

Denn nichts anderes vergleichst Du und schon würde Deine if-Bedingung in den else-Zweig laufen und ein UPDATE durchführen. Aber eigentlich müsste doch die Lagerkapazität gemeldet werden?! (aber das Thema hattet ihr oben wohl bereits). However, PHP hat nichts gegen echte Integer - dazu gehören auch negative.


[ 7. ] fetch_row() vs. fetch_object() vs. fetch_assoc()
Da könnte ich Dir jetzt zig Zeilen Abhandlung anbieten, warum hier bei mir fetch_assoc() zum Einsatz kommt - aber nie (!) fetch_object() (OOP-Style). Das Ende wäre die Lesbarkeit, Verständnis ohne Klassen-Sichtung usw. Wer es liest, weiß, dass es Datenbank ist, denn "->" könnte immer eine Instanz einer Klasse meinen. Und wenn Du in zig Unterscripten unterwegs bist, wirst Du den Moment verfluchen, dass irgendwas nicht dokumentiert war oder "in the wild" programmiert wurde.

Wenn Du Fragen hast, nur her damit ... sollte ich oben einen Denkfehler haben, so dürfen mir Ulli und Duddle gern in den Hintern treten. ^^

Abschließend bitte ich Dich, dass nun nicht alles persönlich zu nehmen. Je schneller Du auf Kurs bist, umso weniger Umgewöhnen ist erforderlich, wenn Du damit die Butter auf Deinem Brötchen verdienen willst.

Ich wünsche einen sackstarten Start in die Woche.

Wer Rechtschreibfehler findet, kann diese behalten oder meistbietend bei bekannten Auktionshäusern verkaufen.
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.614
Beiträge
1.538.351
Mitglieder
67.525
Neuestes Mitglied
mgtaucher
Oben