SELFPHP: Version 5.8.2 Befehlsreferenz - Tutorial – Kochbuch – Forum für PHP Einsteiger und professionelle Entwickler

SELFPHP


Professional CronJob-Service

Suche



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



:: Buchempfehlung ::

TYPO3 Kochbuch

TYPO3 Kochbuch zur Buchempfehlung
 

:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 

Zurück   PHP Forum > SELFPHP > PHP Grundlagen

PHP Grundlagen Hier kann über grundlegende Probleme oder Anfängerschwierigkeiten diskutiert werden

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 18.05.2004, 11:54:40
DanielEXQ2 DanielEXQ2 ist offline
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
Mit Zitat antworten
  #2  
Alt 18.05.2004, 13:22:14
Dago Dago ist offline
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 ;)
Mit Zitat antworten
  #3  
Alt 19.05.2004, 11:59:03
DanielEXQ2 DanielEXQ2 ist offline
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
Mit Zitat antworten
  #4  
Alt 19.05.2004, 12:28:47
Dago Dago ist offline
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 ;)
Mit Zitat antworten
  #5  
Alt 19.05.2004, 12:34:14
Benutzerbild von meikel (†)
meikel (†) meikel (†) ist offline
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.
Mit Zitat antworten
  #6  
Alt 19.05.2004, 12:49:44
DanielEXQ2 DanielEXQ2 ist offline
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()"00MYSQL_BOTH0);
        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
Mit Zitat antworten
  #7  
Alt 19.05.2004, 12:55:16
Dago Dago ist offline
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)
Mit Zitat antworten
  #8  
Alt 19.05.2004, 12:59:58
DanielEXQ2 DanielEXQ2 ist offline
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
Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

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.

BB-Code ist an.
Smileys sind aus.
[IMG] Code ist aus.
HTML-Code ist aus.

Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 06:55:15 Uhr.


Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.


© 2001-2024 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt