burakko: Per Get eine mysql_query

<?php
$db_host = "localhost";
$db_user = "root";
$db_pass = "pass";
$db_name = "name";

$conID = mysql_connect( $db_host, $db_user, $db_pass ) or die( "Die Datenbank konnte nicht erreicht werden!" );
if ($conID)
{
    mysql_select_db( $db_name, $conID );
}

$id = $_GET['id'];

$abfrageergebnis = mysql_query('SELECT titel FROM kalender WHERE ID = $id', $conID );

while ($datensatz = mysql_fetch_array( $abfrageergebnis )){

echo $datensatz['titel'];
}

mysql_close($conID);

?>
__________________

Ich möchte die $id Variable die mit $_GET['id'] gefüllt wird in der mysql_query verwenden. Aber so funktioniert es nicht. Warum?
Kann mir jemand bitte helfen. Ich bin am durchdrehen.

PS: Mit einer normalen Ziffer statt $id in der Query funkionierts.

  1. Hi!

    Du hast kein Debugging betrieben und den erzeugten Query nicht ausgeben lassen.

    'SELECT titel FROM kalender WHERE ID = $id'

    Wenn Du diesen String in z.b. phpMyAdmin absetzt wird er wohl ueber $id stolpern, oder? Da sollt also eine Zahl stehen.

    Binde also die Variable vernuenftig ein, so dass ihr Wert und nicht ihr  Name benutzt wird. Erkundige dich hierfuer auch mal gleich darueber wo in php der Unterschied zwischen " und ' ist. (letzteres nimmt den String so wie er angegeben ist)

    --
    "Die Diebesgilde beklagte sich darueber, dass Mumm in aller Oeffentlichkeit behauptet hatte, hinter den meisten Diebstaehlen steckten Diebe."
          - T. Pratchett
    1. Danke für den Tipp mit den Anführungszeichen. Hat gefunzt.
      Vielen Dank.

      1. Hi!

        Danke für den Tipp mit den Anführungszeichen. Hat gefunzt.

        Damit Du kein blaues Funz-Wunder erlebst, solltest Du unbedingt auch die anderen Tipps im Thread beachten (fehlende Fehlerbehandlung, keine Validierung..)

        off:PP

        --
        "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)
  2. Hallo,

    $conID = mysql_connect( $db_host, $db_user, $db_pass ) or die( "Die Datenbank konnte nicht erreicht werden!" );

    die() ist keine sinnvolle Fehlerbehandlung.

    if ($conID)
    {
        mysql_select_db( $db_name, $conID );
    }

    Ist danach noch eine if-Anweisung sinnvoll?

    $id = $_GET['id'];

    Dieses oft gesehene Umkopieren ist überflüssig, es schadet eher.

    $abfrageergebnis = mysql_query('SELECT titel FROM kalender WHERE ID = $id', $conID );

    a) solltest Du den Kontextwechsel beachten. Derzeit bist Du anfällig für SQL-Injection. Hier wäre intval() sinnvoll.

    Beispiel: Benutzer gibt "1 OR 1 = 1" ein (ohne Anführungszeichen.
                 Ihm werden alle Datensätze angezeigt.

    b) prüfst Du an dieser Stelle nicht, ob mysql_query erfolgreich ist.
       Du gehst einfach vom Gut-Fall aus. Das ist keine gute Idee

    c) könntest Du im Fehlerfall mysql_error() befragen, was MySQL zu beanstanden
       hatte.

    d) wäre es eine gute Idee, das SQL-Statement zuerst in einer Variablen
       zusammenzustellen, um das Statement zu Debug-Zwecken ausgeben zu können.

    Und zum guten Schluss:
    Heutzutage noch Skripte mit den veralteten und wenig leistungsfähigen mysql_*-Funktionen zu schreiben, ist nicht mehr sinnvoll. Verwende die empfohlene und leistungsfähigere Erweiterung mysqli.

    Freundliche Grüße

    Vinzenz

  3. Hallo

    $id = $_GET['id'];

    $abfrageergebnis = mysql_query('SELECT titel FROM kalender WHERE ID = $id', $conID );

    Ich möchte die $id Variable die mit $_GET['id'] gefüllt wird in der mysql_query verwenden. Aber so funktioniert es nicht. Warum?

    Weil Variablen (hier $id) in Strings, die mit "'" (Hochkommata) eingeschlossen werden, nicht interpretiert werden. Dazu im Gegensatz werden Variablen in mit """ (Anführungszeichen) umschlossenen Strings interpretiert.

    Der Query sieht schlussendlich also folgendermaßen aus: 'SELECT titel FROM kalender WHERE ID = $id'. Er sollte aber anstatt $id eine Zahl enthalten, oder?

    Entweder du verkettest die Bestandteile des Querystrings richtig, oder du benutzt Anführungszeichen anstatt Hochkommata. Im Übrigen gibt es da noch eine eklatante Sicherheitslücke. Du benutzt den per GET übergebenen Wert ungeprüft und kopierst ihn unnötig um. Im Falle einer übergebenen Integerzahl (Übergabe erfolgt als String) solltest du den Wert mit intval($GET['id'] in einen Integer umwandeln. Wurde etwas anderes als ein Integer (eine Ganzzahl) übergeben, wird der Wert zu 0 umgewandelt, was einfach nur in einem leeren Ergebnis der DB-Abfrage resultiert.

    $abfrageergebnis = mysql_query("SELECT titel FROM kalender WHERE ID = ".intval($_GET['id'], $conID );

    Im Falle von in Queries zu verwendenden Zeichenketten benutzt man mysql_real_escape_string statt intval.

    Beispiel:
    $abfrageergebnis = mysql_query("SELECT titel FROM kalender WHERE autor = ".mysql_real_escape_string($_GET['author'], $conID );

    PS: Mit einer normalen Ziffer statt $id in der Query funkionierts.

    Dann ist ja auch eine Zahl (als String) im Querystring.

    Tschö, Auge

    --
    Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
    Terry Pratchett, "Wachen! Wachen!"
    Veranstaltungsdatenbank Vdb 0.3
    1. Wurde etwas anderes als ein Integer (eine Ganzzahl) übergeben, wird der Wert zu 0 umgewandelt, was einfach nur in einem leeren Ergebnis der DB-Abfrage resultiert.

      Das ist nicht richtig.

      Auch 2.3 wird zu 2, array('foo', 'bar') liefert 1, Zahlen größer 32 bit werden auf (2^32)2-1 = 2147483647 gekürzt usw.

  4. Hi!

    Versuche mal das:

      
     echo 'SELECT titel FROM kalender WHERE ID = $id';  
    
    

    Fällt Dir etwas auf?

    PS: Mit einer normalen Ziffer statt $id in der Query funkionierts.

    Bei der Verwendung von Single Quotes werden Variabeln nicht durch deren Inhalt ersetzt.

    Du kannst also entweder Double Quotes benutzten oder aber die Zeichenkette für den SQL-Server zusammensetzen -  z.B:

      
     echo 'SELECT titel FROM kalender WHERE ID = '.$_GET['id'];  
    
    

    Hinweis: Du solltest Benutzereingaben _immer_ validieren, bevor Du sie weiterverwendest.

    off:PP

    PS: Dein Problem tritt beim Datenbankserver auf, deshalb:
    Zitat 1353 - dies hilft ungemein bei der Fehlersuche und macht so manche Nachfrage im Forum überflüssig..

    --
    "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)
    1. Hallo

      PS: Dein Problem tritt beim Datenbankserver auf, deshalb:
      Zitat 1353 - dies hilft ungemein bei der Fehlersuche und macht so manche Nachfrage im Forum überflüssig..

      Naja, so gut der Rat an sich ist, *hier* ist er nicht angebracht, da der PHP-Code den Fehler generiert. Und ja, seine Wirkung entfaltet er erst am SQL-Server.

      Tschö, Auge

      --
      Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
      Terry Pratchett, "Wachen! Wachen!"
      Veranstaltungsdatenbank Vdb 0.3
      1. Hi!

        PS: Dein Problem tritt beim Datenbankserver auf, deshalb:
        Zitat 1353 - dies hilft ungemein bei der Fehlersuche und macht so manche Nachfrage im Forum überflüssig..

        Naja, so gut der Rat an sich ist, *hier* ist er nicht angebracht, da der PHP-Code den Fehler generiert.

        Deshalb auch den Tipp, den von PHP generierten Text anzusehen - denn dieser SQL-Query-String ist relevant, nicht ob PHP oder irgend etwas anderes diesen generiert.

        off:PP

        --
        "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)