Marya: PHP Datenbank Abfrage

Hallo,

ich habe zwei Tabellen "profile" und "nutzer"
In der Tabelle "profile" wird nur die eindeutige profilID und der Zeitstempel der letzten Änderung erfasst. In der Tabelle "nutzer" sind viele Details.

Ich habe mit PHP über JOIN eine Abfrage erstellt, die mir eine Liste ausgibt, in der alle registrierten Nutzer aufgelistet sind. Zusätzlich werden drei Felder aus der Tabelle nutzerdetails ausgelesen. Für jeden Listeneintrag wird ein Link "viewdetails.php" erzeugt. Wenn man auf den Link klickt, soll man auf eine Detailseite kommen, auf der alle Felder der Tabelle nutzerdetails angezeigt werden.

Problem: Ich komme nicht an die profilID. Über die profilID referenziere ich zwar bei der JOIN Anfrage, aber die ID selbst wird nicht übermittelt. Die Anfrage wird immer mit "nicht erfolgreich beendet".
Hier der code:

$sql = "SELECT profilID, aktualisiertam, anrede, vorname, name FROM profile JOIN nutzer ON profile.profilID=nutzer.profilID";  
$profile_query = mysql_query($sql) or die("Anfrage nicht erfolgreich");

Wo ist mein Denkfehler?
Vielen Dank für Eure Tipps
gruß
Marya

  1. servus Marya,

    SELECT profilID, aktualisiertam, anrede, vorname, name FROM profile JOIN nutzer ON profile.profilID=nutzer.profilID

    profile und nutzer haben beide die Spalte profilID. Im ON-Teil gibst du an, welche Tabelle zur profilID gehört, im SELECT-Teil allerdings nicht. Dort musst du auch die gewünschte Tabelle angeben, wenn die Spalte in beiden vorkommt.

    der wurzelbert

    --
    "The depressing thing about tennis is that no matter how good I get, I´ll never be as good as a wall."
  2. $profile_query = mysql_query($sql) or die("Anfrage nicht erfolgreich");[/code]

    Wo ist mein Denkfehler?

    Du lässt Dir weder den Error-String noch Dein SQL ausgeben.

    $fatal=false;  
    define (DEBUG, true); # Abschalten im Regelbetrieb  
      
    $sql = "SELECT  
        profile.profilID,  
        profile.aktualisiertam,  
        profile.anrede,  
        profile.vorname,  
        profile.name  
    FROM  
        profile  
    JOIN nutzer ON profile.profilID=nutzer.profilID  
    ";  
      
    $fatal=true; ## true für fatale Fehler  
    $profile_query = mysql_query($sql, $DB);  
      
    if (! $profile_query) {  
         if (DEBUG) {  
              print '<hr />  
    <pre class="php_errors"><strong>MySQL-Fehler: </strong>' . mysql_errno($DB) . '  
    <hr /><strong>Fehlermeldung:</strong>  
    ' . htmlspecialchars(mysql_error($DB)) . '  
    <hr /><strong>vollständiges SQL:</strong>  
    ' .htmlspecialchars($sql). '  
    <hr />  
    ';  
         }  
         if ($fatal) {  
             exit;  
         }  
    }
    

    Das ist ein Beispiel und dient dazu, den Weg zu zeigen. Womöglich willst Die Fehler aber in eine Funktion übergeben und Dir im Regelbetrieb in ein Logfile schreiben oder per Mail senden lassen. Natürlich bietet es sich an, die Fehlerbehandlung in eine Funktion auszugliedern.

    1. Du lässt Dir weder den Error-String noch Dein SQL ausgeben.

      Ok, danke für den Hinweis!

      $fatal=false;

      define (DEBUG, true); # Abschalten im Regelbetrieb

        
      
      > wofür brauche ich die beiden Zeilen?? wenn $fatal sowieso auf true gesetzt wird und DEBUG nie geändert wird??  
      > $sql = "SELECT  
      >     profile.profilID,  
      >     profile.aktualisiertam,  
      >     profile.anrede,  
      >     profile.vorname,  
      >     profile.name  
      > FROM  
      >     profile  
      > JOIN nutzer ON profile.profilID=nutzer.profilID  
      > ";  
      >   
      > $fatal=true; ## true für fatale Fehler  
      > $profile\_query = mysql\_query($sql, $DB);  
      >   
      > if (! $profile\_query) {  
      >      if (DEBUG) { #ist das nicht überflüssig (siehe oben)?  
      >           print '<hr />  
      > <pre class="php\_errors"><strong>MySQL-Fehler: </strong>' . mysql\_errno($DB) . '  
      > <hr /><strong>Fehlermeldung:</strong>  
      > ' . htmlspecialchars(mysql\_error($DB)) . '  
      > <hr /><strong>vollständiges SQL:</strong>  
      > ' .htmlspecialchars($sql). '  
      > <hr />  
      > ';  
      >      }  
      >      if ($fatal) {  
      >          exit;  
      >      }  
      > }[/code]  
      
      ~~~php
      [code lang=php]$fatal=false;  
      define (DEBUG, true); # Abschalten im Regelbetrieb
      

      wofür brauche ich die beiden Zeilen?? wenn $fatal sowieso auf true gesetzt wird und DEBUG nie geändert wird??

      if (! $profile_query) {  
      
      >      if (DEBUG) {
      
      

      ist dieses if nicht überflüssig, DEBUG immer auf true steht (siehe oben)?

      Gruß Marya

      1. wofür brauche ich die beiden Zeilen?? wenn $fatal sowieso auf true gesetzt wird und DEBUG nie geändert wird??

        ** Zunächst einmal: **

        * Wenn Du in einer größeren Firma entwickelst, dann gibt es dort Vorschriften wie das Errorhandling zu bewerkstelligen ist. Genau so ist es gut, wenn Du solche Vorgehensweisen auch für Deine Projekte "standardisierst". Das spart Mühe und Arbeit.

        * Die Behandlung von Fehlern könnte man in einem eigenen Buch(!) halbwegs vollständig darstellen, ein Forumsbeitrag ist dafür nicht das geeignete Medium, denn hier muss man bei komplexen Themen notgedrungen verkürzen.

        Ich hatte nicht ganz grundlos darauf hingewiesen, dass die Fehlerbehandlung selbst in eine eigene Funktion ausgelagert werden soll. Du kannst den Fehler dort ausgeben und/oder loggen und/oder mailen und/oder sogar automatisch einem Ticket-System übergeben, welches dann weiter regiert. Und/Oder was Dir sonst noch einfällt.

        ** Die Konstante DEBUG **

        ... setzt Du auf false, sobald Du das Skript vom Entwicklungssystem auf den Arbeitsserver (Worker) überträgst. Diese ändert sich im Programmablauf nicht. Abseits des verkürzten Beispiels wird DEBUG am besten in einer Initialisierungsdatei für das gesamte Projekt bestimmt oder auf Grund anderer Eigenschaften des Servers (Worker) einmalig festgelegt.

        z.B, wenn Dein Worker auf der Domain "tolleWebseite.de" hockt, Dein Entwicklungssystem aber nicht:

        if ( false === (strpos('tolleWebseite.de', $_SERVER['HTTP_HOST']) ) {  
            define (DEBUG, true);  
        } else {  
            define (DEBUG, false);  
        }
        

        Du kannst auch andere Eigenschaften nutzen, ein Blick in die Ausgaben von phpinfo() ist sicher hilfreich. Das spart die Änderung der Datei und schafft damit einen nützlichen und deshalb sicher angenehmen Automatismus.

        ** Die Variable $fatal **

        ... ist ein Flag, der ggf. an verschiedenen Stellen in dem selben Programm einen verschiedenen Wert haben kann, sich also im Programmablauf womöglich ändert. Wenn klar ist, dass auch bei dem Auftreten eines Fehlers an einer bestimmten Stelle das Programm (voraussichtlich) fortgesetzt werden kann, dann sollte $fatal dort auf false stehen, ist aber die weitere Programmausführung dann (voraussichtlich) nicht möglich oder nicht sinnvoll, dann eben auf true mit der Wirkung, dass die Fehlerbehandlung auch zum Abbruch führt. Das wird auch bei richtigen Programmen so gemacht, da gibt es oft sogar verschiedenste "Error-Level", z.B. "Angriff", "Fatal", "Warnung", "Notiz" - hier genügen, denke ich, derer zwei.

        Das mag (hier) genügen.

        1. Ok, danke für die Erläuterung.
          Ich stehe noch ganz am Anfang dieses Projektes und baue das momentan als nicht Informatiker erst einmal als Prototyp auf. Einem adäquaten  Errorhandling werde ich mich in einem reiferen Prototypen und der finalen Umsetzung dann auch noch widmen müssen.

          Viele Grüße
          Marya