CronJob-Service
bei SELFPHP mit ...
|
+ minütlichen Aufrufen
+ eigenem Crontab Eintrag
+ unbegrenzten CronJobs
+ Statistiken
+ Beispielaufrufen
+ Control-Bereich
Führen Sie mit den CronJobs von
SELFPHP zeitgesteuert Programme
auf Ihrem Server
aus. Weitere Infos
|
:: Anbieterverzeichnis ::
Globale Branchen
Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP
:: Newsletter ::
Abonnieren Sie hier den kostenlosen
SELFPHP Newsletter!
|
PHP Grundlagen Hier kann über grundlegende Probleme oder Anfängerschwierigkeiten diskutiert werden |
18.05.2004, 11:54:40
|
Anfänger
|
|
Registriert seit: May 2004
Beiträge: 29
|
|
Fehler bei Query
Hi,
wenn ich eine Function in einer anderen Datei include und in dieser Function eine Query ausführe kommt immer folgende Fehlermeldung:
Fatal error: Call to a member function on a non-object
Wodurch wir dieser Fehler verursacht?
Bin für jede hilfe dankbar.
__________________
Greez
DanielEXQ
|
18.05.2004, 13:22:14
|
Member
|
|
Registriert seit: Mar 2002
Beiträge: 548
|
|
Liegt vermutlich am Geltungsbereich der Variablen.
Poste mal ein bisschen Code, damit man genaueres sagen kann.
[php]-Tags nicht vergessen ;)
|
19.05.2004, 11:59:03
|
Anfänger
|
|
Registriert seit: May 2004
Beiträge: 29
|
|
Ok, hier mal ein beispiel:
Hier beginnt der Ablauf in new.php:
PHP-Code:
require_once("fill_cmb.php");
$Select = "LfdNr, Format";
$Table = "vdb_format";
$Where = "";
$OrderBy = "";
$Format = call_user_func( 'fill_cmb', 'Format', $Select, $Table, $Where, $OrderBy, '' );
Wie man sieht lese ich die fill_cmb.php oben in die new.php ein.
Hier nun der Auszug der fill_cmb.php:
PHP-Code:
function fill_cmb ( $CmbName, $Select, $Table, $Where, $OrderBy, $Selected )
{
$Option = FALSE;
if ($Selected != "")
{
$Option = TRUE;
}
require_once("dbconnect.php");
$result = $db->query("SELECT $Select FROM $Table WHERE LfdNr > 1 $Where $OrderBy");
while ($row = $db->fetch_array($result))
{
$X = "";
if ($Option == TRUE)
{
if($row[0] == $Selected)
{
$X = "SELECTED";
$Option = FALSE;
}
}
$cmb = $cmb."
<option value=$row[0] $X>$row[1]</option>
";
}
$cmb = "<select name=$CmbName><option value=1 SELECTED>-Bitte wählen-</option>$cmb</select>";
return $cmb;
}
In der Zeile
$result = $db->query("SELECT $Select FROM $Table WHERE LfdNr > 1 $Where $OrderBy");
gibt er dann den Fatal error aus.
Einziges Merkmal noch:
Die new.php wird von einer anderen datei (main.php) included. In der main.php wird als erstes die dbconnect.php mit require("dbconnect.php") ausgeführt um einen DB-Connect durchzuführen. Das funzt auch soweit. Andere Querys gehen ja auch.
Hoffe du steigst hier durch ;)
__________________
Greez
DanielEXQ
|
19.05.2004, 12:28:47
|
Member
|
|
Registriert seit: Mar 2002
Beiträge: 548
|
|
Wie vermutet: Geltungsbereich der Variablen
Also, wenn du die Datei dbconnect.php mit require() statt mit require_once() einbinden würdest, würde die Funktion fill_cmb() direkt auf die Variable $db zugreifen können, da sie innerhalb dieser Funktion deklariert wurde.
Da du aber vorher schonmal mit require() gearbeitet hast, wurde die Variable $db für einen anderen Geltungsbereich deklariert (entweder in der globalen Zone oder in einer andere Funktion).
Beachte: require_once() unternimmst nichts, wenn die gewünschte Datei bereits eingebunden wurde.
So, das war die Diagnose. Solltest du noch Hilfe zur Fehlerbehebung brauchen, sag bescheid ;)
|
19.05.2004, 12:34:14
|
|
SELFPHP Guru
|
|
Registriert seit: Dec 2003
Ort: Erfurt
Alter: 75
Beiträge: 4.001
|
|
"Call to a member function on a non-object"
Zitat:
Original geschrieben von DanielEXQ2
[PHP]
require_once("fill_cmb.php");
PHP-Code:
function fill_cmb ( $CmbName, $Select, $Table, $Where, $OrderBy, $Selected )
{
require_once("dbconnect.php");
$result = $db->query("SELECT $Select FROM $Table WHERE LfdNr > 1
In der Zeile
$result = $db->query("SELECT $Select FROM $Table WHERE LfdNr > 1 $Where $OrderBy");
gibt er dann den Fatal error aus.
|
Hier fehlt der Inhalt von dbconnect.php (ohne Paßwörter).
Allerdings mutmaße ich mal kühn, daß dbconnect.php keine Klasse beinhaltet, welche im Connect-Fall die Instanz $db erzeugt und die Methode query und fetch_array beinhaltet.
|
19.05.2004, 12:49:44
|
Anfänger
|
|
Registriert seit: May 2004
Beiträge: 29
|
|
Re: Wie vermutet: Geltungsbereich der Variablen
Zitat:
Original geschrieben von Dago
Also, wenn du die Datei dbconnect.php mit require() statt mit require_once() einbinden würdest, würde die Funktion fill_cmb() direkt auf die Variable $db zugreifen können, da sie innerhalb dieser Funktion deklariert wurde.
Da du aber vorher schonmal mit require() gearbeitet hast, wurde die Variable $db für einen anderen Geltungsbereich deklariert (entweder in der globalen Zone oder in einer andere Funktion).
Beachte: require_once() unternimmst nichts, wenn die gewünschte Datei bereits eingebunden wurde.
So, das war die Diagnose. Solltest du noch Hilfe zur Fehlerbehebung brauchen, sag bescheid ;)
|
Leider nützt das auch nichts. Sobald ich eine Query außerhalb der Function fill_cmb() ausführe klappt es einwandfrei. nur innerhalb der Function nicht. Theoretisch brauche ich doch kein Require machen da ich in main.php doch schon ein require gemacht habe oder? Naja, also wenn ich require statt require_once mache kommt folgende andere Fehlermeldung:
Cannot redeclare class db...
Ich poste euch hier nochmal die Class DB in dbconnect.php:
PHP-Code:
class db {
var $link_id = 0;
var $query_id = 0;
var $record = array();
var $errdesc = "";
var $errno = 0;
var $show_error = 0;
var $server = "";
var $user = "";
var $password = "";
var $database = "";
var $appname = "Video-Datenbank";
function db($server,$user,$password,$database) {
$this->server=$server;
$this->user=$user;
$this->password=$password;
$this->database=$database;
$this->connect();
}
function connect() {
$this->link_id=mysql_connect($this->server,$this->user,$this->password);
if (!$this->link_id) $this->print_error("Link-ID == false, connect failed");
if ($this->database!="") $this->select_db($this->database);
}
function geterrdesc() {
$this->error=mysql_error();
return $this->error;
}
function geterrno() {
$this->errno=mysql_errno();
return $this->errno;
}
function select_db($database="") {
if ($database!="") $this->database=$database;
if(!@mysql_select_db($this->database, $this->link_id)) $this->print_error("cannot use database ".$this->database);
}
function query($query_string) {
global $query_count;
$this->query_id = mysql_query($query_string,$this->link_id);
$query_count++;
if (!$this->query_id) $this->print_error("Invalid SQL: ".$query_string);
return $this->query_id;
}
function fetch_array($query_id=-1) {
if ($query_id!=-1) $this->query_id=$query_id;
$this->record = mysql_fetch_array($this->query_id);
return $this->record;
}
function query_first($query_string) {
global $query_count;
$this->query($query_string);
$query_count++;
$returnarray=$this->fetch_array($this->query_id);
return $returnarray;
}
function num_rows($query_id=-1) {
if ($query_id!=-1) $this->query_id=$query_id;
return mysql_num_rows($this->query_id);
}
function num_fields($query_id=-1) {
if ($query_id!=-1) $this->query_id=$query_id;
return mysql_num_fields($this->query_id);
}
function field_name($query_id=-1,$num) {
if ($query_id!=-1) $this->query_id=$query_id;
return mysql_field_name($this->query_id,$num);
}
function insert_id() {
return mysql_insert_id($this->link_id);
}
function getversion() {
if ($this->link_id) list($this->version) =
$this->query_first("SELECT VERSION()", 0, 0, MYSQL_BOTH, 0);
if (!$this->version) $this->version = "unknown";
return $this->version;
}
function print_error($errormsg) {
$this->errdesc=mysql_error();
$this->errno=mysql_errno();
$errormsg="Database error in $this->appname: $errormsgn<br>";
$errormsg.="mysql error: $this->errdescn<br>";
$errormsg.="mysql error number: $this->errnon<br>";
$errormsg .= "mysql version: ".$this->getversion()."n<br>";
$errormsg .= "php version: ".phpversion()."n<br>";
$errormsg.="Date: ".date("d.m.Y @ H:i")."n<br>";
$errormsg.="Script: ".getenv("REQUEST_URI")."n<br>";
$errormsg.="Referer: ".getenv("HTTP_REFERER")."n<br><br>";
if($this->show_error) $errormsg = "$errormsg";
else $errormsg = "n$errormsgn";
die("</table><br />".$errormsg);
}
}
$db = new db($server,$user,$password,$database);
__________________
Greez
DanielEXQ
|
19.05.2004, 12:55:16
|
Member
|
|
Registriert seit: Mar 2002
Beiträge: 548
|
|
Re: Re: Wie vermutet: Geltungsbereich der Variablen
Da hast du mich wohl nicht ganz verstanden.
Zitat:
Original geschrieben von DanielEXQ2
Leider nützt das auch nichts. Sobald ich eine Query außerhalb der Function fill_cmb() ausführe klappt es einwandfrei. nur innerhalb der Function nicht.
|
Das bedeutet nichts anderes als:
Die Variable $db hat ihren Geltungsbereich in der globalen Zone.
Um in Funktionen auf diese Variable zuzugreifen, kannst du $GLOBALS['db'] verwenden.
Geändert von Dago (19.05.2004 um 12:58:30 Uhr)
|
19.05.2004, 12:59:58
|
Anfänger
|
|
Registriert seit: May 2004
Beiträge: 29
|
|
Aaaaaahhhhh!
Danke, jetzt funzt es!!
Bin noch neuling in PHP.
Mein Gott, und ich zerbreche mir den kopf an was viel komplexerem! ;)
Danke dir groß Meister...
Greez
DanielEXQ
__________________
Greez
DanielEXQ
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 13:14:11 Uhr.
|