Die richtige Tabelle aus der Datenbank wählen

  • Guten Tag (ich bin es schon wieder)

    Ich habe mir als Anfänger ein Musterprojekt aufgebaut, bestehend aus Login und Adressverwaltung (mit der Tabelle accounts in der DB).
    Alles funktioniert wunderbar - bis ich angefangen habe in der DB eine zweite Tabelle admin einzurichten, worauf ich im Moment aber nicht zugreifen kann.

    Deshalb mal die Fragen zu folgendem Code (mit der Tabelle accounts funktioniert es, wenn ich die Tabelle auf den Namen admin ändere, funktioniert es nicht):

    Am Anfang steht die isset-Abfrage, welche entscheidet ob der Code in {...} ausgeführt wird, aber wie weiss php, welche id gemeint ist, da es nun ja in der DB zwei Tabellen gibt?
    Kann/muss das näher angegeben werden? Wenn ja, wie?


    Code
    1. if (isset($_GET['id'])) {
    2. // Get the account from the database
    3. $stmt = $pdo->prepare('SELECT * FROM accounts WHERE id = ?');
    4. $stmt->execute([ $_GET['id'] ]);
    5. $account = $stmt->fetch(PDO::FETCH_ASSOC);
    6.     // weiterer Code
    7.     }
  • Ja, ich sage schon welche Tabelle gemeint ist, aber warum nimmt er mir die Tabelle nicht und meldet die id sei nicht spezifiziert?


    Ist meine folgende Ueberlegung richtig?:
    Wie ich bereits geschrieben habe - zuerst kommt die if-isset-Abfrage. Diese wird doch zuerst ausgewertet, d.h. ob der Code in Klammer ausgeführt wird oder nicht. Heisst doch, wenn die isset-Abfrage nicht zutrifft, wird der Code in der Klammer (wo auch der Name der Tabelle steht) ignoriert.

  • Du solltest dich dringend mit etwas Grundlegendem beschäftigen, nämlich:


    Richtig debuggen

    1. Man bemerkt, dass ein Skript nicht das tut, was es soll.
    2. Man schreibt an den Anfang des Scriptes die Zeile: error_reporting(-1);
    3. Man verwendet ini_set('display_errors', true); damit die Fehler auch angezeigt werden.
    4. Man versucht, die Stelle die daran Schuld sein kann, schonmal einzugrenzen. Falls dies nicht geht, wird zunächst das komplette Skript als fehlerhaft angesehen.
    5. An markanten Stellen im Skript lässt man sich wichtige Variableninhalte ausgeben und ggf. auch in bedingten Anweisungen eine kurze Ausgabe machen, um zu überprüfen, welche Bedingung ausgeführt wurde. Wichtig bei MySQL Fehlern (...not a valid MySQL result resource...): mysqli_error() verwenden oder Abfrage ausgeben und zb mit phpmyadmin testen.
    6. Schritt 5 wird so lange wiederholt, bis Unstimmigkeiten im Skript auffallen
    7. Damit hat man das Problem (Unstimmigkeit) gefunden und kann versuchen diese zu beheben. Hierzu dienen dann die PHP-Dokumentation und andere Quellen als Ratgeber.
    8. Lässt sich das konkrete Problem trotzdem nicht beheben, kann man in Foren um Rat fragen.
    9. Das Programm läuft und man kann die Debug-Ausgaben wieder entfernen.

    Da hilft dir bei der Fehlersuche und so manche Frage kann man sich selber beantworten. ;)

  • Du solltest dich dringend mit etwas Grundlegendem beschäftigen, nämlich:

    Richtig debuggen

    Vielen Dank für alles (SELECT * .... verwende ich nicht mehr und die Debugging-Tipps habe ich mir kopiert und angewandt).


    Ich erhalte die Fehlermeldung:

    Warning: mysqli_error() expects exactly 1 parameter, 0 given in /home/httpd/vhosts/ms.ch/m-schmid.ch/dv/admin/settings_admin_new.php on line 8
    No ID specified!

    Mein Code mit der DB-Tabelle admin ist identisch analog dem anderen Code mit der DB-Tabelle accounts (welcher funktioniert).Heisst, ich habe im Code nur den Tabellennamen und die Namen der Tabellenfelder angepasst.


    Erlaube mir nochmals, die Verständnisfrage zu stellen:

    Ist meine folgende Ueberlegung richtig?:

    Wie ich bereits geschrieben habe - zuerst kommt die if-isset-Abfrage. Diese wird doch zuerst ausgewertet, d.h. ob der Code in Klammer ausgeführt wird oder nicht. Heisst doch, wenn die isset-Abfrage nicht zutrifft, wird der Code in der Klammer (wo auch der Name der Tabelle steht) ignoriert?

    Mir scheint, ich habe das Problem seit es 2 Tabellen in der DB gibt - oder anders gefragt:
    Bei: if (isset($_GET['id'])) {...... Welche id wird abgefragt und warum? (von Tabelle accounts oder admin?).

  • Warning: mysqli_error() expects exactly 1 parameter, 0 given

    Da du scheinbar PDO einsetzt, musst du natürlich die Error-Abfrage auch mit PDO durchführen:, siehe dazu https://www.php.net/manual/de/class.pdo.php

    if (isset($_GET['id'])) {...... Welche id wird abgefragt und warum? (von Tabelle accounts oder admin?).

    Weder noch! Es wird damit überprüft, ob an der URL eine Variable mit dem Namen id angehängt ist. Das hat mir der Datenbank überhaupt nichts zu tun.

  • Ich habe alles empfohlene gemacht und weiteres ausprobiert - es bleibt leider bei der Fehlermeldung:
    Warning: mysqli_error() expects exactly 1 parameter, 0 given in /home/httpd/vhosts/ms.ch/m-schmid.ch/dv/admin/settings_admin_new.php on line 8 No ID specified!

    Ich erlaube mir mal den ganzen Code von settings_admin_new.php reinzustellen:


  • 1. Wie der Name schon sagt ist mysqli_error für die Verwendung mit mysqli vorgesehen, Du arbeitest jedoch mit PDO.

    2. Dies funktioniert etwas anders als bei den Zeilen 6 und 7 darüber: Es wird nicht eine Fehleranzeige aktiviert sondern, genau wie in der Doku angegeben, der letzte aufgetretene Fehler angezeigt. D. h. wenn noch keine DB-Operation statt gefunden hat wird auch kein Fehler angezeigt.

    Du solltest die Zeile 8 löschen.


    Dieses, was Du in deinem Code hast:

    $pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    bewirkt jedoch wieder, dass die Fehlerbehandlung eingeschaltet wird und im weiteren Verlauf im Fehlerfall eine Exception erzeugt wird, siehe hier:

    https://www.php.net/manual/de/pdo.error-handling.php

    Das ist genau was Du brauchst.

    Wenn danach keine Fehlermeldungen angezeigt werden, liegt es wahrscheinlich daran, dass Du gar nicht in den Zweig mit den DB-Operationen hinein kommst.

  • Wie schon erwähnt, du musst das Error-Handling mit PDO durchführen. Und diese Zeile

    Code
    1. mysqli_error();

    ist selbst bei der Nutzung von MySQLi völlig sinnlos. Du solltest häufiger in der Doku lesen, dort findet man auch viele Beispiele.