PSD-Tutorials.de
Forum für Design, Fotografie & Bildbearbeitung
Tutkit
Agentur
Hilfe
Kontakt
Start
Forum
Aktuelles
Besonderer Inhalt
Foren durchsuchen
Tutorials
News
Anmelden
Kostenlos registrieren
Aktuelles
Suche
Suche
Nur Titel durchsuchen
Von:
Menü
Anmelden
Kostenlos registrieren
App installieren
Installieren
JavaScript ist deaktiviert. Für eine bessere Darstellung aktiviere bitte JavaScript in deinem Browser, bevor du fortfährst.
Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden.
Du solltest ein Upgrade durchführen oder einen
alternativen Browser
verwenden.
Antworten auf deine Fragen:
Neues Thema erstellen
Start
Forum
Sonstiges
Webdesign, Webentwicklung & Programmierung
PHP, Javascript, jQuery, Ajax, nodeJS, MySQL...
SQL Eintrag wird erst nach weiterm Eintrag angezeigt
Beitrag
<blockquote data-quote="Curanai" data-source="post: 2191120" data-attributes="member: 534923"><p><strong>AW: SQL Eintrag wird erst nach weiterm Eintrag angezeigt</strong></p><p></p><p>Guten Morgen,</p><p></p><p>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:</p><p></p><p></p><p>[ 1. ] $sql = mysql_query("SELECT `anzahl`,`artikelid`,`hersteller` FROM `artikel` WHERE id='".$id."'");</p><p></p><p>[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.</p><p></p><p><strong> 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.</strong></p><p><strong></strong></p><p><strong>[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).</strong></p><p><strong></strong></p><p><strong>[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.</strong></p><p><strong></strong></p><p><strong></strong></p><p><strong>[ 2. ] $row = mysql_fetch_assoc($sql);</strong></p><p><strong></strong></p><p><strong>[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. ä.).</strong></p><p><strong></strong></p><p><strong>Es darf also gern so aussehen:</strong></p><p><strong>[code]</strong></p><p><strong>$sql = mysql_query("SELECT ... FROM `artikel` WHERE `id`='".$id."' LIMIT 1");</strong></p><p><strong>if($sql){</strong></p><p><strong> if(mysql_num_rows($sql) == 1){ // oder > 0 etc.</strong></p><p><strong> $row = mysql_fetch_assoc($sql);</strong></p><p><strong> // mach damit was ...</strong></p><p><strong> }</strong></p><p><strong>}</strong></p><p><strong>[/code]</strong></p><p><strong></strong></p><p><strong></strong></p><p><strong>[ 3. ] $anzahl=$row['anzahl'];</strong></p><p><strong></strong></p><p><strong>[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 ...</strong></p><p><strong></strong></p><p><strong>[code]$anzahl = (int) $row['anzahl'];[/code]</strong></p><p><strong></strong></p><p><strong>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.</strong></p><p><strong></strong></p><p><strong><strong> 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.</strong></strong></p><p><strong><strong></strong></strong></p><p><strong><strong></strong></strong></p><p><strong><strong>[ 4. ] Unnötige Klammern</strong></strong></p><p><strong><strong></strong></strong></p><p><strong><strong>[a] if(($art) == "-"){ ... die Klammern um "$art" sind deutlich zu viel ...</strong></strong></p><p><strong><strong></strong></strong></p><p><strong><strong></strong></strong></p><p><strong><strong>[ 5. ] GOTO</strong></strong></p><p><strong><strong>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! <img src="/styles/default/xenforo/smilies/biggrin.gif" class="smilie" loading="lazy" alt=":D" title="Big Grin :D" data-shortname=":D" /> Ob ich den aber je selbst mal in PHP verweden würde ... ?!</strong></strong></p><p><strong><strong></strong></strong></p><p><strong><strong></strong></strong></p><p><strong><strong>[ 6. ] if($ergebniss <= "-1")</strong></strong></p><p><strong><strong>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:</strong></strong></p><p><strong><strong></strong></strong></p><p><strong><strong>[code]var_dump( 0 <= "-1");[/code]</strong></strong></p><p><strong><strong></strong></strong></p><p><strong><strong>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. </strong></strong></p><p><strong><strong></strong></strong></p><p><strong><strong></strong></strong></p><p><strong><strong>[ 7. ] fetch_row() vs. fetch_object() vs. fetch_assoc()</strong></strong></p><p><strong><strong>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.</strong></strong></p><p><strong><strong></strong></strong></p><p><strong><strong>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. ^^</strong></strong></p><p><strong><strong></strong></strong></p><p><strong><strong>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.</strong></strong></p><p><strong><strong></strong></strong></p><p><strong><strong>Ich wünsche einen sackstarten Start in die Woche.</strong></strong></p><p><strong><strong></strong></strong></p><p><strong><strong><span style="font-size: 9px">Wer Rechtschreibfehler findet, kann diese behalten oder meistbietend bei bekannten Auktionshäusern verkaufen.</span></strong></strong></p></blockquote><p></p>
[QUOTE="Curanai, post: 2191120, member: 534923"] [b]AW: SQL Eintrag wird erst nach weiterm Eintrag angezeigt[/b] 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. [b] 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 ... } } [/code] [ 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'];[/code] 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. [b] 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");[/code] 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. [SIZE=1]Wer Rechtschreibfehler findet, kann diese behalten oder meistbietend bei bekannten Auktionshäusern verkaufen.[/SIZE][/b][/b] [/QUOTE]
Bilder bitte
hier hochladen
und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Zitate einfügen…
Authentifizierung
Wenn ▲ = 5, ▼ = 2 und ■ = 7, was ist ▲ × ▼ + ■?
Antworten
Start
Forum
Sonstiges
Webdesign, Webentwicklung & Programmierung
PHP, Javascript, jQuery, Ajax, nodeJS, MySQL...
SQL Eintrag wird erst nach weiterm Eintrag angezeigt
Oben