Andy123: Datenbankverbindung funktioniert nicht

Hallo,

Die Skripte:

news.php
**************************************************************
<?php

$tpl = file_get_contents('tpl/news/list.tpl');
$sql = 'SELECT
  news_id, news_date, news_headline, news_text
 FROM
  news';

$result = mysql_query($sql) OR die (mysql_error());

while($news = mysql_fetch assoc($result)) {
 $tpl = str_replace('{news:headline}', $news['news_headline'], $tpl);
 // ...
}
echo $tpl;

?>
*************************************************************

index.php
*************************************************************
<?php

@mysql_connect('localhost', 'root', '') OR die(mysql_error());
mysql_select_db('usr_web257_3') OR die(mysql_error());

function include_in_var($file) {
 ob_start();
 include ($file);
 return ob_get_clean();
}

$main['content'] = include_in_var('core/content.php');

$template = file_get_contents('templates/bla/index.html');
$template = str_replace('{title}','blaaaaaa',$template);
$template = str_replace('{content}',$main['content'],$template);

echo $template;
?>
************************************************************

die content.php
************************************************************
<?php
$mods['news'] = 'mods/news.php';

if(isset($_GET['mod']) AND isset($mods[$_GET['mod']])) {
 include($mods[$_GET['mod']]);
} else {
 include('mods/news.php');
}
?>
************************************************************

So nun zum Problem:
Ich habe zwar in der index.php eine Datenbank-Verbindung aufgebaut, die auch funktioniert, aber davon bekommt die news.php nichts mit, obwohl ich sie in die index include.

Wo ist mein Denkfehler?

Gruß,
Andy

  1. Moin!

    Ich habe zwar in der index.php eine Datenbank-Verbindung aufgebaut, die auch funktioniert, aber davon bekommt die news.php nichts mit, obwohl ich sie in die index include.

    Wo ist mein Denkfehler?

    Fehlermeldung?

    - Sven Rautenberg

    --
    "Love your nation - respect the others."
    1. Fehlermeldung?

      mysql_query(): Access denied for user 'ODBC'@'localhost'

      mysql_query(): A link to the server could not be established

      mysql_fetch_assoc(): supplied argument is not valid MySQL result resource

      bezieht sich alles auf meine news.php

      Aus den Fehlermeldungen is ja zu erkennen, dass die news.php keine Datenbankanbindung hat.
      Wenn ich mysql_connect() in der news.php verwendee gehts, aber ich will ja nich in jeder mod diesen Text haben sondern nur einmal in der index.php

      gruß,
      andy

  2. echo $begrüßung;

    @mysql_connect('localhost', 'root', '') OR die(mysql_error());

    Sehr interessante Konstruktion. PHP-Fehlermeldungen werden zwar unterdrückt, aber dem Anwender wird die MySQL-Fehlermeldung angezeigt. Diese beinhaltet bei fehlgeschlagenen Verbindungen typischerweise auch den Datenbank-Benutzernamen und gelegentlich auch von außen ansprechbare Host-Namen.

    "... or die(...)" ist im Allgemeinen keine Fehlerbehandlung, die man einem Anwender zumuten möchte. Schon gar nicht soll er solch detaillierte Hinweise zum weiteren möglichen Ausnutzen von Sicherheitslücken bekommen.

    Ich habe zwar in der index.php eine Datenbank-Verbindung aufgebaut, die auch funktioniert, aber davon bekommt die news.php nichts mit, obwohl ich sie in die index include.

    Wo ist mein Denkfehler?

    Der ist aus dem Gegebenen nicht nachvollziehbar. Ich finde keine Include-Anweisung in der news.php. Stattdessen ist jede Menge Zeug zu sehen, das mit dem Problem nichts zu tun hat. Bitte kürze doch demnächst den zum Nachvollziehen des Problems nötigen Code auf ein Minimum ein. Manchmal hilft es auch, das Problem komplett von vorn nachzustellen. Also mit (einer) leeren Datei(en) und so wenig Code wie möglich. Manchmal sieht man dann den Baum, der im Weg steht, als wenn man immer wieder seinen bisherigen Wald betrachtet.

    echo "$verabschiedung $name";

    1. Hi,

      deine erste bemerkung hilft mir leider nicht weiter

      und ausserdem hab ich nicht gesagt, dass in der news ein include steht, sondern ich habe die news in die index included.

      gruß

      1. echo $begrüßung;

        deine erste bemerkung hilft mir leider nicht weiter

        Eine Fehlerbehandlung sollte sich nicht auf ein Sterbenlassen des Scripts beschränken. Server (inklusive MySQL-Server) haben die Angewohnheit, gelegentlich (beispielsweise wegen einer Datensicherung) nicht zur Verfügung zu stehen. Man sollte seine Besucher nicht mit einer halben Seite plus Fehlermeldung, die noch dazu interne Daten preisgibt, abspeisen. Versuche, im Fehlerfall eine Ersatzhandlung vorzunehmen, die sich in den Rahmen deiner Anwendung einfügt. Eine Ersatzhandlung kann eine "Tut uns leid. Geht grad nicht. Bitte später nochmal probieren."-Meldung sein, aber der Anwender sollte nicht mit einem Problem (oder einer Meldung) konfrontiert werden, an dem er keine Schuld hat oder nichts zu seiner Behebung beitragen kann.

        und ausserdem hab ich nicht gesagt, dass in der news ein include steht, sondern ich habe die news in die index included.

        OK. Der Wald und die Bäume ... Trotzdem gelingt es mir auch bei genauerem Hinsehen nicht, den Fehler nachzustellen. Allerdings hat Copy'n'Paste allein nicht gereicht. Neben kleineren Anpassungen (Ich lasse meine Anwendungen nicht mit der root-Kennung auf meine Datenbank los. Außerdem fehlen mir die Template-Dateien.) habe ich noch den Tippfehler bei mysql_fetch assoc($result) (vergessener Unterstrich) beseitigen müssen.

        echo "$verabschiedung $name";

        1. OK. Der Wald und die Bäume ... Trotzdem gelingt es mir auch bei genauerem Hinsehen nicht, den Fehler nachzustellen. Allerdings hat Copy'n'Paste allein nicht gereicht. Neben kleineren Anpassungen (Ich lasse meine Anwendungen nicht mit der root-Kennung auf meine Datenbank los. Außerdem fehlen mir die Template-Dateien.) habe ich noch den Tippfehler bei mysql_fetch assoc($result) (vergessener Unterstrich) beseitigen müssen.

          Ich habe XAMPP im Einsatz und entwickle meine Seite offline.
          Wenn sie online geht, werd ich natürlich die root-Kennung ohne Passwort NICHT benutzen. Aber vielen Dank für den Hinweis.
          Schreibfehler... kopiert hab ichs nicht, da die Daten auf dem Laptop sind und ich im moment keine Möglichkeit habe diese rauszukopiern.

          1. echo $begrüßung;

            Wir kommen, so wie es aussieht, an dieser Stelle nicht weiter. Das Problem liegt, so vermute ich, an einer Ursache, die sich speziell auf deine Umgebung bezieht. Versuch doch mal, wie schon vorgeschlagen, das Problem mit dem geringstmöglichen Code nachzustellen. Wenn der Fehler ausbleibt, ergänze nach und nach die restlichen Codeteile bis er auftaucht. Dann solltest du dem Verursacher schon ziemlich nahe sein.

            Du kannst auch Kontrollausgaben einfügen, damit du weißt, welche Programmteile in welcher Reihenfolge aufgerufen werden. Beispielsweise:

            echo 'mysql_connect';
              mysql_connect(...)

            Vielleicht stellt es sich so heraus, dass du am Connect gar nicht vorbeikommst. (Beachte dass dir deine Ausgabepufferung hierbei die "Mess"ergebnisse verfälschen kann.)

            Ein anderer Gedanke: Im Allgemeinen kann man solch eine Aufgabenstellung durch das Singleton-Pattern lösen. Du verwendest die Eigenschaft PHPs, dass die Verbindungskennung des zuletzt ausgeführten Connects (in deinem Fall ist es auch der einzige) implizit verwendet wird, wenn man diese den anderen mysql_*-Funktionen nicht mit übergibt. Das Singleton-Pattern ist meist auf Objekte angewendet implementiert, doch da es nur ein Muster ist, kann man es auf alle möglichen Dinge anwenden, auch auf eine PHP-Ressourcenkennung. Von dem Singleton lässt du dir explizit die Verbindungskennung geben und gibst sie an die anderen mysql_*()-Funktionen weiter. Somit haben sie keinen Grund mehr, sich über eine nicht vorhandene Verbindung zu beklagen.

            Das Singleton-Pattern lässt sich in dem Fall mit einer Funktion implementieren, man braucht also noch nicht mal Objekte dazu.

            function getConnection() {
              static $connection = null;

            if ($connection === null) {
                if ($connection = mysql_connect(...)) {
                  mysql_select_db('...', $connection);
                  // zu verwendende Zeichenkodierung einstellen
                  mysql_set_charset('...', $connection); // ab PHP 5.2.3
                  mysql_query('SET NAMES ...', $connection); // vor PHP 5.2.3
                } else {
                  // Reaktion im Fehlerfall
                  // z.B.: throw new Exception(mysql_error());
                }
              }
              return $connection;
            }

            Hier gibt es ein Problem mit dem Fehlerfall. Ein die() ist schnell eingefügt, aber nicht benutzerfreundlich. Im Fehlerfall ein false oder null zurückzugeben erhöht die Komplexität auf der "Anwender"seite, muss doch dort jedes Mal dieser Fall geprüft werden. Eine Exception böte sich an. Das trennt den normalen Ablauf vom Fehlerfall.

            try {
                $sql = '...';
                if (!$result = mysql_query($sql, getConnection()))
                  throw new Exception(mysql_error());

            while ($row = mysql_fetch_...($result)) {
                  do_something_with($row);
                }
              } catch (Exception $ex)
                // Reaktion im Fehlerfall
                echo "Tut uns leid, geht grad nicht. Bitte später nochmal probieren.";
                error_log(...);
              }

            Den try-catch-Block muss man nicht unbedingt um jedes DB-Handling drumrumbauen. Man kann ihn je nach Programmstruktur und -verschachtelung auch "weiter außen" ansiedeln.

            echo "$verabschiedung $name";