Zitat von Lowrider
Beitrag anzeigen
MySQL-Error in Klasse
Einklappen
X
-
Global ist böse. Im Idealfall erstellst du gar keine globalen Variablen. Wenn du Variablen in einer Funktion benötigst, dann übergib sie als Parameter.
-
Danke dir vielmals. Das war die Lösung. Dachte, die Variable ist bereits global definiert, wenn ich die außerhalb der Funktion deklariere.
Einen Kommentar schreiben:
-
Innerhalb deiner Funktion cms_is_installed gibt es keine Variable namens $db.
Lies im Handbuch nach, über den Gültigkeitsbereich (Scope) von Variablen: PHP: Variable scope - Manual
Einen Kommentar schreiben:
-
functions.php ...
Dazwischen fehlt kein Code.PHP-Code:// Initiate the class
$db = new Database();
// Check if installed
function cms_is_installed()
{
$installed = True;
if (!file_exists('./admin/settings.php')) {
//setting anlegen
$installed = False;
} else {
if ( $db->tableExists('global')) {
Und in der Index.php erfolgt der Aufruf ...
PHP-Code:include ('./admin/settings.php');
include ('./admin/includes/functions.php');
if (cms_is_installed()) {
Einen Kommentar schreiben:
-
Ja, an der anderen Stelle aber nicht. Was dazwischen passiert, verheimlichst du. Dort ist aber der Fehler.Zitat von Lowrider Beitrag anzeigenAber er connected doch richtig. Bekomme doch diesbezüglich keine Fehlermeldung.
Somit muss doch aber in $db ein object sein
PHP-Code:$db = new Database();
Einen Kommentar schreiben:
-
Aber er connected doch richtig. Bekomme doch diesbezüglich keine Fehlermeldung.
Somit muss doch aber in $db ein object sein
PHP-Code:$db = new Database();
Einen Kommentar schreiben:
-
Dann enthält $db an der Stelle kein Objekt. Der Fehler ist jedenfalls nicht im geposteten Code sondern an einer anderen Stelle.
Einen Kommentar schreiben:
-
Zitat von h3ll Beitrag anzeigenDieser Code verursacht garantiert nicht den genannten Fehler.
Du solltest übrigens die Verbindungsdaten (Host, Username, etc.) nicht in Konstanten speichern, sondern im Konstruktor an die Klasse übergeben. Das ist eine ganz schlechte Idee eine Klasse an fixe Konstanten zu binden.
mb_internal_encoding() und mb_regex_encoding() haben in der Datenbankklasse nichts verloren.Bekomme immer wieder diese Fehlermeldung der Zeilennummer, wo ich die Funktion aufrufeCode:Call to a member function tableExists() on a non-object in [B]/homepages/[/B]...
Einen Kommentar schreiben:
-
Dieser Code verursacht garantiert nicht den genannten Fehler.
Du solltest übrigens die Verbindungsdaten (Host, Username, etc.) nicht in Konstanten speichern, sondern im Konstruktor an die Klasse übergeben. Das ist eine ganz schlechte Idee eine Klasse an fixe Konstanten zu binden.
mb_internal_encoding() und mb_regex_encoding() haben in der Datenbankklasse nichts verloren.Zuletzt geändert von h3ll; 12.11.2015, 19:22.
Einen Kommentar schreiben:
-
Die Klasse ...
Der Aufruf ...PHP-Code:class DB
{
private $link = null;
public function __construct() {
mb_internal_encoding( 'UTF-8' );
mb_regex_encoding( 'UTF-8' );
mysqli_report( MYSQLI_REPORT_STRICT );
try {
$this->link = new mysqli( DB_HOST, DB_USER, DB_PASS, DB_NAME );
$this->link->set_charset( "utf8" );
} catch ( Exception $e ) {
die( 'Unable to connect to database' );
}
}
public function __destruct() {
if( $this->link) {
$this->disconnect();
}
}
public function tableExists( $name ) {
$check = $this->link->query( "SELECT 1 FROM $name" );
if($check !== false) {
if( $check->num_rows > 0 ) {
return true;
} else {
return false;
}
} else {
return false;
}
}
}
PHP-Code://Initiate the class
$db = new DB();
if ( $db->tableExists('global')) { ...
Einen Kommentar schreiben:
-
Dann solltest du deine Versuche mit mysqli zeigen. Ich seh nicht, warum man für praktisch toten Code eine Unterstützung geben soll. Das ist nur Zeitverschwendung.Zitat von Lowrider Beitrag anzeigenIch sagte, doch, habe es erst mit MySQLi versucht, aber da kommt der gleiche Fehler.
Und deine Fehlermeldung bedeutet, dass du versuchst die Methode auf irgendwas aufzurufen, dass keine Instanz deiner Klasse ist. Das hat mit der Klasse an sich nichts zu tun.
Der Fehler lässt sich anhand deines Beispiels nicht nachstellen. Das ist eindeutig Fantasiecode.Zuletzt geändert von h3ll; 12.11.2015, 18:58.
Einen Kommentar schreiben:
-
Ich sagte, doch, habe es erst mit MySQLi versucht, aber da kommt der gleiche Fehler.Zitat von h3ll Beitrag anzeigenmysql wird bald beerdigt. Warum willst du auf ein totes Pferd aufsteigen?
Einen Kommentar schreiben:
-
mysql wird bald beerdigt. Warum willst du auf ein totes Pferd aufsteigen?
Einen Kommentar schreiben:
-
MySQL-Error in Klasse
Hallo,
ich will für ein Projekt meine DB-Klasse erstellen ...
Soweit so gut, aber wenn ich prüfen will, ob eine Tabelle existiert ...PHP-Code:<?php
class Database {
private $result = array();
/**
* initialise db connection
* @param string $dbHost db host
* @param string $dbUser db user
* @param string $dbPassword db password
* @param string $dbName db name
*/
public function connect($dbHost, $dbUser, $dbPassword, $dbName) {
if(!$this->con) {
$myconn = @mysql_connect($dbHost, $dbUser, $dbPassword);
if($myconn) {
$seldb = @mysql_select_db($dbName, $myconn);
if($seldb) {
$this->con = true;
return true;
} else {
return false;
}
} else {
return false;
}
} else {
return true;
}
}
public function disconnect() {
if($this->con) {
if(@mysql_close()) {
$this->con = false;
return true;
} else {
return false;
}
}
}
public function tableExists($table) {
$tablesInDb = @mysql_query('SHOW TABLES FROM '.$dbName.' LIKE "'.$table.'"');
if($tablesInDb) {
if(mysql_num_rows($tablesInDb)==1) {
return true;
} else {
return false;
}
}
}
}
... bekommt ich immer eine Fehlermeldung genau in dem Funktionsaufruf ...PHP-Code:...
// Initiate the class
$db = new Database();
$db->connect();
if ( $db->tableExists('global')) { ...
Eigentlich wollte ich ja MySQLi verwenden, aber da kam auch diese Fehlermeldung und nun dachte ich, steigst du eben wieder auf MySQL zurück.Code:Call to a member function tableExists() on a non-object
Habe mich auch schon fast tot gegoogelt, aber ich finde einfach den Fehler nicht.
Habt ihr da noch eine Idee, wo der Fehler sein könnte?Stichworte: -
Einen Kommentar schreiben: