Ingo: Parse error: syntax error, unexpected T_VARIABLE

Hi, ich habe ein kleines problem wo ich nicht weiter komme:

Ich erhalte folgende Fehlermeldung:

Parse error: syntax error, unexpected T_VARIABLE in /xxx/xxx/xxxx/xxxx/insert.php on line 3

Hier ist der komplette Code der Datei:

<?php include("config.php");
$eintrag = 'INSERT INTO websites(webseite, url, beschreibung)
VALUES('$_GET["webseite"]', '$_GET["url"]', '$_GET["beschreibung"]')'
Eintragen = mysql_query($eintrag);
?>

  1. Hallo!

    Parse error: syntax error, unexpected T_VARIABLE in /xxx/xxx/xxxx/xxxx/insert.php on line 3

    Das bedeutet, dass eine Variable vorkommt wo sie nicht vorkommen soll, ist aber nicht der einzige Fehler.

    $eintrag = 'INSERT INTO websites(webseite, url, beschreibung)
    VALUES('$_GET["webseite"]', '$_GET["url"]', '$_GET["beschreibung"]')'

    Die Verknüpfung von Strings erfolgt in PHP durch einen Punkt ".", sowas finde ich bei dir hier nirgends, auch den Strichpunkt am Ende scheinst du nicht zu brauchen.

    Eintragen = mysql_query($eintrag);

    In PHP beginnen Varibalen üblicherweise mit dem Dollarzeichen ($Eintragen = ...).

    Ich glaube du musst dich erst einmal mit den Grundsätzen von PHP vertraut machen, benutze dafür die Suchmaschine deiner Wahl.

    mfg

  2. Hallo,

    Parse error: syntax error, unexpected T_VARIABLE in /xxx/xxx/xxxx/xxxx/insert.php on line 3

    $eintrag = 'INSERT INTO websites(webseite, url, beschreibung)

    ^
                 | hier benutzt Du einfache Anführungszeichen, um
                   Deine Zeichenkette einzuleiten

      		VALUES('$\_GET["webseite"]', '$\_GET["url"]', '$\_GET["beschreibung"]')'  
    

    ^
                                           | und hier ebenfalls einfache Anführungszeichen
                                           | für die Zeichenkettenwerte in der
                                           | SQL-Anweisung

    Denke daran: Innerhalb einfacher Anführungszeichen erfolgt keine Variablenauswertung seitens PHP.

    Ich vermisse zudem die kontextgerechte Aufbereitung der Eingabewerte (Werte des $_GET-Arrays) für den SQL-Kontext. Somit bist Du anfällig für SQL-Injektion. Diese Werte gehören in Deinem Fall mit mysql_real_escape_string. behandelt. Falls die Magic Quotes eingeschaltet sein sollten und Du diese nicht deaktivieren kannst, solltest Du ihre Auswirkung zu Skriptbeginn rückgängig machen, wie in Beispiel #2 gezeigt.

    Freundliche Grüße

    Vinzenz

  3. Hallo,

    <?php include("config.php");
    $eintrag = 'INSERT INTO websites(webseite, url, beschreibung)
    VALUES('$_GET["webseite"]', '$_GET["url"]', '$_GET["beschreibung"]')'
    Eintragen = mysql_query($eintrag);
    ?>

    Zuerst einmal: Damit das überhaupt funktioniert, muss Dir klar sein, wann welches Zeichen welche Art von String begrenzt.

    Was Du haben willst, ist ein SQL-Statement, das im Ende z.B. so aussieht:

    INSERT INTO websites (website, url, beschreibung) VALUES ('test-seite', 'http://example.com/', 'Test-Eintrag')

    Das Problem: Du schreibst kein SQL selbst. Sondern Du schreibst PHP, d.h. Du musst das ganze in einen PHP-String verpacken. Dann hast Du jedoch das Problem, dass wenn Du in PHP auch ' als Stringbegrenzer wählst, dass das ' im SQL-Statement den PHP-String beendet.

    Du hast jetzt zwei Möglichkeiten:

    1. Du nimmst den anderen Stringbegrenzer in PHP, nämlich ":

    $eintrag = "INSERT INTO websites (website, url, beschreibung) VALUES ('test-seite', 'http://example.com/', 'Test-Eintrag')";

    2. Du maskierst die SQL-', damit die den PHP-String nicht beenden:

    $eintrag = 'INSERT INTO websites (website, url, beschreibung) VALUES (\'test-seite\', \'http://example.com/\', \'Test-Eintrag\')';

    Dann kannst Du zumindest mal ein festes SQL-Statement zusammenbauen. Das Problem: Du willst das in PHP dynamisch erstellen auf Grund der Parameter, die Du übergeben bekommen hast. Um das zu bewerkstelligen, musst Du einen String aus verschiedenen Teilen zusammensetzen. In PHP funktioniert das mit dem Punkt, z.B. so:

    $string = 'Hallo ' . 'Welt!';

    Die Variable $string enthält dann den Text "Hallo Welt!". Das ganze geht auch mit Variablen:

    $welt = "Welt";  
    $string = 'Hallo ' . $welt . '!';
    

    Auf Dein Beispiel übertragen wäre das dann (ACHTUNG: NICHT VERWENDEN, ENTHÄLT NOCH SICHERHEITSLÜCKEN):

    $eintrag = "INSERT INTO websites (website, url, beschreibung) VALUES ('" . $_GET['website'] . "', '" . $_GET['url'] . "', '" . $_GET['beschreibung'] . "')";

    Das würde zwra schon funktionieren, ist aber problematisch. Warum? Weil Du Dir damit eine riesige Sicherheitslücke einbaust. Der Grund ist nämlich, dass $_GET['beschreibung'] selbst ein ' enthalten könnte. Stell Dir vor, jemand würde für $_GET['beschreibung'] z.B. "It's fun" eingeben, dann würde der in PHP zusammengesetzte SQL-Befehl so aussehen:

    INSERT INTO websites (website, url, beschreibung) VALUES ('fun', 'http://fun.example.com/', 'It's fun')

    Wie Du siehst, ist das kein gültiges SQL mehr. In dem Fall wäre das noch harmlos, aber jemand könnte durchaus andere Dinge hereinschmuggeln durch die ', was dann dazu führt, dass jemand Dein SQL-Statement beliebig (!) modifizeren kann.

    Wie kann man das verhinden? Nunja, die einfachste Möglichkeit ist, den Inhalt der von außen kommenden Variable so zu maskieren, dass er in SQL unschädlich ist. Dafür gibt's in PHP für MySQL bereits eine vorgefertige Funktion, die heißt mysql_real_escape_string. Baut man die ein, sieht das ganze so aus:

    $eintrag = "INSERT INTO websites (website, url, beschreibung) VALUES ('" . mysql_real_escape_string ($_GET['website']) . "', '" . mysql_real_escape_string ($_GET['url']) . "', '" . mysql_real_escape_string ($_GET['beschreibung']) . "')";

    Damit stellst Du sicher, dass niemand Dein SQL-Statement manipulieren kann und somit hast Du in dieser Hinsicht keine Sicherheitslücke.

    Deine Frage zeigt jedoch, dass Du selbst von einigen PHP-Basics nicht genügend Ahnung hast, dass ich Dir *dringend* raten würde, das Quakenet PHP-Tutorial durchzuarbeiten - dort wird auch der MySQL-Zugriff erläutert.

    Viele Grüße,
    Christian

    --
    Mein "Weblog" [RSS]
    Using XSLT to create JSON output (Saxon-B 9.0 for Java)
    »I don't believe you can call yourself a web developer until you've built an app that uses hyperlinks for deletion and have all your data deleted by a search bot.«
                -- Kommentar bei TDWTF
  4. Hallo,

    Parse error: syntax error, unexpected T_VARIABLE in /xxx/xxx/xxxx/xxxx/insert.php on line 3

    <?php include("config.php");
    $eintrag = 'INSERT INTO websites(webseite, url, beschreibung) VALUES('$_GET ...

    ^--- Hier beginnt dein String
                                                                            ^--- und hier endet er.

    Du notierst also einen String und direkt daran anschließend, ohne Operator, Klammer oder ähnliches, eine Variable. Das ist die Stelle, an der PHP "eine Variable nicht erwartet".

    Zu den restlichen Fehlern gab's ja schon Hinweise.

    So long,
     Martin

    --
    Gültig sind Frauen ab 16, wohlgeformt ab 160 Pfund.
      (Gunnar Bittersmann)