PHP Script ändern damit mysqli / PHP 7.2 funktioniert

cliodriver

Mitglied
Hallo

das ist seit langem wieder mal eine Frage / Bitte um Hilfe zu einem PHP-Script.

Ich habe vor einem Jahr eine Homepage für eine Bekannte (Ferienwohnungen) erstellt und ein fertiges Script für einen Belegungskalender eingebaut und dabei nicht bedacht / gewusst das der Server demnächst auf PHP 7.2 umstellt. Ich konnte schon testen und den Rest der Homepage anpassen, doch leider bin ich mit meinem Latein am ende und der Kalender funktioniert natürlich nicht.

Das Problem liegt natürlich an der Datenbankverbindung .... mysqli unter PHP 7.2, welche ich nicht gefixt bekomme

Meine Frage dazu:

Kann sich jemand den Code mal ansehen und sagen er sich anpassen lässt bzw. hätte gleich Tipps für mich? Ich würde gerne verstehen wo der Hund begraben liegt und es selber ändern, doch ohne Hilfe komm ich grad nicht weiter.

Weiters umfasst das ganze ca. 19 Seiten und wenn ich die alle hier poste, wird's wahrscheinlich unübersichtlich. Ich würde das Paket per email versenden wenn ich Hilfe bekomme.

Danke
 
Lösung
So habe mir das mal angeschaut.

Es ist nur die db.class.php anzupassen.

PHP:
<?php
// Class for database connection
class DatabaseConnection {

    public    $error = false;
    public    $version = false;
    private    $link = false;
    private $config = array ();

    /**
     * Wrapper for connect ()
     * @param    $db        Array with vars from config
     * @return            result from connect ()
     */
    public function databaseConnection ($mysql) {
        $this->config = $mysql;
        return $this->connect ();
    }

    /**
     * Tries to connect to db and checks installation.
     * @return            true if no error, else false
     */
    public function connect () {
        // Reset $error
        $this->error...
Zugangsdaten stimmen, denn sobald ich wieder auf php7.4 stelle, klappt wieder alles.

Und lohnt es sich wirklich, ein Script aus 2018 zu reparieren? Wer weiß, was da noch für Fehler schlummern.
Na ja, es ist halt ziemlich ideal für meine Eltern. Es ist funktional und nicht überladen. Einen Ersatz müsste ich erst einmal suchen.

Trage mal direkt nach … dies hier ein:
Vielen Dank für eure Hilfe!
Leider ändert das überhaupt nichts an der Fehlermeldung.
 
Dann erkenne ich den Fehler ohne Testen nicht. Allerdings habe ich jetzt nicht den Nerv mir erst eine Testdatenbank anzulegen (ich weiß auch nicht, welche Tabellen gebraucht werden), die Scripte kopieren und dann erst testen. Sorry, der Aufwand ist mir dann doch zu hoch.

Du könntest höchstens mal das Error-Reporting hochdrehen, in dem du diese Zeilen hinter <?php schreibst
PHP:
error_reporting(E_ALL);
ini_set('display_errors', true);
Vielleicht gibt das noch Anhaltspunkte.
 
Dann hilft nur noch

Richtig debuggen
  1. Man bemerkt, dass ein Skript nicht das tut, was es soll.
  2. Man schreibt an den Anfang des Scriptes die Zeile: error_reporting(-1);
  3. Man verwendet ini_set('display_errors', true); damit die Fehler auch angezeigt werden.
  4. Man versucht, die Stelle die daran Schuld sein kann, schonmal einzugrenzen. Falls dies nicht geht, wird zunächst das komplette Skript als fehlerhaft angesehen.
  5. An markanten Stellen im Skript lässt man sich wichtige Variableninhalte ausgeben und ggf. auch in bedingten Anweisungen eine kurze Ausgabe machen, um zu überprüfen, welche Bedingung ausgeführt wurde. Wichtig bei MySQL Fehlern (...not a valid MySQL result resource...): mysqli_error() verwenden oder Abfrage ausgeben und zb mit phpmyadmin testen.
  6. Schritt 5 wird so lange wiederholt, bis Unstimmigkeiten im Skript auffallen
  7. Damit hat man das Problem (Unstimmigkeit) gefunden und kann versuchen diese zu beheben. Hierzu dienen dann die PHP-Dokumentation und andere Quellen als Ratgeber.
  8. Lässt sich das konkrete Problem trotzdem nicht beheben, kann man in Foren um Rat fragen.
  9. Das Programm läuft und man kann die Debug-Ausgaben wieder entfernen.
 
Ich vermisse den 4. Parameter für die Datenbank in deinem Aufruf von mysqli_connect. Ist überhaupt eine Default-Datenbank gesetzt? Versuche, die Datenbank mit zu übergeben.

Edit: Ich habe mir noch Mal den Code aus #9 angesehen. Dort fällt auf, dass der Konstruktor den selben Namen hat wie die Klasse statt __contruct. Ändere ich das, funktioniert das Verbinden. Ändere ich es zurück wird false für $link zurück gegeben ohne dass Fehlermeldungen entstehen.
 
Zuletzt bearbeitet:
Der Konstruktor ist eine Funktion, die aufgerufen wird, wenn das Objekt mit new erzeugt wird. Früher gab man dieser Funktion den selben Namen wie der Klasse, jetzt nennt man sie __construct. Ändere den Code so:
Code:
// Class for database connection
class DatabaseConnection {

    public    $error = false;
    public    $version = false;
    private    $link = false;
    private $config = array ();

    /**
     * Wrapper for connect ()
     * @param    $db        Array with vars from config
     * @return            result from connect ()
     */
    // public function databaseConnection ($mysql) {
    public function __construct ($mysql) {
        $this->config = $mysql;
        return $this->connect ();
    }

    /**
     * Tries to connect to db and checks installation.
     * @return            true if no error, else false
     */
    public function connect () {
 
Vielen Dank. Das sieht schon mal viel besser aus. Ich denke, die DB-Verbindung scheint jetzt zu laufen (y)

Jetzt ruft noch eine andere Stelle um Hilfe:
Code:
Fatal error: Uncaught Error: Call to a member function idExists() on bool in /volume3/web/php8test/includes/cal.class.php:48 Stack trace: #0 /volume3/web/php8test/index.php(26): Calendar->setObject('1') #1 {main} thrown in /volume3/web/php8test/includes/cal.class.php on line 48

Diesen Fehler konnte ich in der cal.calss.php in ähnlicher Weise beheben:

PHP:
function calendar (&$db, &$prefs) {
   $this -> db =& $db;
   $this -> prefs =& $prefs;
   $this -> hideExpiredDates = $this -> prefs['hideExpiredDates'];
}

zu

PHP:
function __construct(&$db, &$prefs) {
   $this -> db =& $db;
   $this -> prefs =& $prefs;
   $this -> hideExpiredDates = $this -> prefs['hideExpiredDates'];
}

Ganz herzlichen Dank für eure Unterstützung :D
 
Zurück