Christopher: layout.php als Vorlage nur wie?

grüß euch, folgendes problem hab ich,

habe 2 php datein, eine heisst layout.php und die andere main.php
nun layout.php ist die grafische vorlage und main.php ist der inhalt.

so habe ich es gemacht.

<?
$host = "localhost";
$user = "XX";
$password = "XX";

$dbverbindung = mysql_connect ($host, $user, $password);

$dbanfrage = "SELECT * FROM main WHERE kat = $_REQUEST[kat]";

$result = mysql_db_query ($dbname, $dbanfrage, $dbverbindung);

$ausgabe = mysql_fetch_array ($result);

$handle = fopen ("layout.php", "r");
$contents = fread ($handle, filesize ("layout.php"));
fclose ($handle);

$contents=str_replace("%TEXT%",$ausgabe[text],$contents);
$contents=str_replace("%LOCATION%",$ausgabe[location],$contents);

mysql_close ($dbverbindung);
print $contents;

?>

Leider funkt es nicht, aber wenn ich den befehl hinausnehme:
dbanfrage = "SELECT * FROM main WHERE kat = $_REQUEST[kat]";
und dann einfach auf ID umschreibe
dbanfrage = "SELECT * FROM main WHERE id = dbanfrage = "SELECT * FROM main WHERE kat = $_REQUEST[kat]";[id]";
dann funkt es nur ich will es nicht

main.php?id=1
stehen haben sondern
main.php?kat=info

nur irgendwie gehts net wieso?

Was mache ich bei den Code falsch???
Glaube das es mit dem
dbanfrage = "SELECT * FROM main WHERE kat = $_REQUEST[kat]";
zusammenhängt!

Danke in Voraus Christopher

  1. Hallo Christopher,

    $dbanfrage = "SELECT * FROM main WHERE kat = $_REQUEST[kat]";

    Welchen Datentyp hat das Feld "kat"? Falls es alphanumerisch ist, also in der DB z.B. mit varchar oder dergleichen definiert ist, dann muss der Wert, den du bei der WHERE-Klausel angibst, in Anfuehrungszeichen stehen. Ausserdem hast du eine Array-Variable literal in einem String, was so weit ich weiss problematisch ist. Also besser gleich so:

    $dbanfrage = "SELECT * FROM main WHERE kat = '".$_REQUEST[kat]."'";
    (vorausgesetzt, "kat" ist alphanumerisch)

    viele Gruesse
      Stefan Muenz

    1. schau her in der mysql datei stehen folgende tabellen:

      Feld            Typ          Attribute Null Standard Extra Aktion
         id            int(5)       Nein    auto_increment
         kat           varchar(250) Nein
         info          varchar(250) Nein
         location      varchar(250) Nein
         beschreibung  varchar(250) Nein

      die mysql tabelle lautet "main"

      nun habe ich in layout.php das grafische hineingetan und in main.php sollte es ausgeben werden.

      in main.php steht folgendes:

      <?
      $host = "localhost";
      $user = "XX";
      $password = "XX";

      $dbverbindung = mysql_connect ($host, $user, $password);

      $dbanfrage = "SELECT * FROM main WHERE kat = '".$_REQUEST[kat]."'";

      $result = mysql_db_query ($dbname, $dbanfrage, $dbverbindung);

      $ausgabe = mysql_fetch_array ($result);

      $handle = fopen ("layout.php", "r");
      $contents = fread ($handle, filesize ("layout.php"));
      fclose ($handle);

      $contents=str_replace("%TEXT%",$ausgabe[text],$contents);
      $contents=str_replace("%LOCATION%",$ausgabe[location],$contents);

      mysql_close ($dbverbindung);
      print $contents;

      ?>

      Nun rufe ich dann unter: wwww.XXX.at/main.php?kat=news

      auf und dann kommt folgende fehlermeldung:

      Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/afis/new/main.php on line 14

      1. Hallo Christopher,

        $ausgabe = mysql_fetch_array ($result);
        $contents=str_replace("%TEXT%",$ausgabe[text],$contents);
        $contents=str_replace("%LOCATION%",$ausgabe[location],$contents);
        Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/afis/new/main.php on line 14

        Die assotiativen Array-Schluessel mit den Feldnamen muessen IMHO in Anfuehrungszeichen: also $ausgabe['text'] und $ausgabe['location']. Ausserdem brauchst du ja nur den Array-Schluessel. Von daher kannst du im Aufruf von mysql_fetch_array auch gleich MYSQL_ASSOC als zweiten Parameter mit angeben.

        viele Gruesse
          Stefan Muenz

        1. Hello,

          Die assotiativen Array-Schluessel mit den Feldnamen muessen IMHO in Anfuehrungszeichen: also $ausgabe['text'] und $ausgabe['location']. Ausserdem brauchst du ja nur den Array-Schluessel. Von daher kannst du im Aufruf von mysql_fetch_array auch gleich MYSQL_ASSOC als zweiten Parameter mit angeben.

          ... oder gleich mysql_fetch_assoc() benutzen. Das müsste etwas Kraft sparen helfen.

          Harzliche Grüße aus http://www.annerschbarrich.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau
    2. Hi Stefan!

      $dbanfrage = "SELECT * FROM main WHERE kat = $_REQUEST[kat]";

      |

      Ausserdem hast du eine Array-Variable literal in einem String, was so weit ich weiss problematisch ist. Also besser gleich so:

      |

      $dbanfrage = "SELECT * FROM main WHERE kat = '".$_REQUEST[kat]."'";

      Kleine Korrektur bezogen auf die PHP-Variable: So ist das nur richtig wenn die Konstante "kat" definiert ist.

      folgende Varianten wären korrekt:

      $dbanfrage = "SELECT * FROM main WHERE kat = '$_REQUEST[kat]'";
      $dbanfrage = "SELECT * FROM main WHERE kat = '".$_REQUEST['kat']."'";
      $dbanfrage = "SELECT * FROM main WHERE kat = '{$_REQUEST['kat']}'";

      Siehe hierzu: http://de3.php.net/manual/de/language.types.string.php#language.types.string.parsing

      btw.: man sollte übrigens keine Variablen die man nicht selber kontrolliert(also sowas wie $_REQUEST, bei register-globals so ziemlich jede Variable) ungeprüft an eine Datenbank-Abfrage, an die Kommandozeile, an include() oder ähnliches übergeben.

      Man sollte in diesem Fall also mindestens mysql_escape_string($_REQUEST['kat']) anwenden.

      Siehe hierzu: http://de3.php.net/manual/de/security.database.php#security.database.sql-injection

      Viele Grüße
      Andreas
      --
      SELFHTML Tipps & Tricks: http://aktuell.de.selfhtml.org/tippstricks/