Verständnisproblem mit Klassen

pnx

Mitglied
Hi beisammen,

hab mir gestern Abend mal ein wenig Objekte und Klassen angeschaut und mir eine Klasse zur Verbindung und Abfrage meiner DB zusammengeschustert. Klappt eigentlich auch, aber ich kann auf die Variablen die durch die Klasse ermittelt wurden nur innerhalb der while-Schleife zugreifen. Außerhalb sind sie leer. Auch wenn ich die Variablen an einen Array übergebe, ist dieser Array außerhalb der while-Schleife leer.
Ich verstehe nicht warum ...

PHP:
$dbcon = new db($db_host, $db_user, $db_pass, $db_name);
$dbcon->dosql("SELECT * FROM $tab");
while($vars = $dbcon->fetch_array()){$vars_all[] = $vars;}

Eine andere Sache:
Wenn ich innerhalb der while-Schleife erneut die Klasse db verwenden will und die Informationen in "$vars = $dbcon->fetch_array()" nicht verlieren will muss ich ein neues Objekt erstellen, oder ? Edit: Vergesst das ganz schnell wieder ;) :suspekt:

pnx
 
Zuletzt bearbeitet:
PHP:
$dbcon = new db($db_host, $db_user, $db_pass, $db_name); 
$dbcon->dosql("SELECT * FROM $tab"); 
while($vars = $dbcon->fetch_array())
$vars_all[] = $vars;
das ist eine ganze normale Sache!

Mein Tipp { } die Schleife weglassen dann sollte es gehen!
 
Versuch mal direkt vor Deiner while-Schleife:
PHP:
$vars_all = array();
Ich denke, Du willst nicht auf $vars zugreifen, da drin steht nämlich nur der letzte ausgelesene Datensatz, aber wenn doch, funktioniert das auf die gleiche Weise.
Wenn Du sonst in Deiner Schleife nichts machst (ich weiß ja nicht, wie weit Du verkürzten Code vorgestellt hast), sollte auch folgendes funktionieren:
PHP:
$dbcon = new db($db_host, $db_user, $db_pass, $db_name);
$dbcon->dosql("SELECT * FROM $tab");
$vars_all=array();
while($vars_all[] = $dbcon->fetch_array()){} 
//hier sind $vars_all vorhanden
 
In welchem Kontext rufst Du denn den oben angegebenen Code auf?
Wenn er in einer Funktion steckt, wird es Dir z.B. nichts nutzen, wenn Du $vars_all schon mal wo definiert hast. Dann müßtest Du mit global arbeiten.

Ich glaube, Du musst uns etwas mehr Code zeigen.
 
Eigentlich gibts net viel mehr relevanter Code.
Ich habe eine config.cfg mit den Variablen für die Sql-Verbindung sowie die Initialisierung der Variablen.

Dann kommt die Hauptdatei:
PHP:
<?php
require_once('config.php');
require_once('require/classes.php');
$dbcon = new db($db_host, $db_user, $db_pass, $db_name);
$dbcon->dosql("SELECT * FROM ".$tab.");
while($vars_all[] = $dbcon->fetch_array());
?>

Und die Class:
PHP:
<?php
class db{
 //ClassVars
 var $host;
 var $user;
 var $pass;
 var $daba;
 
 //Constructor
 function db($db_host="" , $db_user="" , $db_pass="", $db_name=""){
  $this->host = $db_host;
  $this->user = $db_user;
  $this->pass = $db_pass;
  $this->daba = $db_name;
  $this->dbconnect();
 }

 function dbconnect(){
  $this->con = @mysql_connect($this->host,$this->user,$this->pass);
  if($this->con)$this->select_db($this->daba);
 }

 function select_db(){
  if(!mysql_select_db($this->daba, $this->con)){die(mysql_error());}
 }

 function dosql($sql){
  if(!$this->res = mysql_query($sql, $this->con)){die(mysql_error());}
 }

 function fetch_array(){
  if(!$returnarray = mysql_fetch_array($this->res)){die(mysql_error());}
  return $returnarray;
 }
 function conclose(){
  $this->con = mysql_close();
 }
}
?>

Ich hab jetzt mal die Ausgabe weggelassen. Wie gesagt, innerhalb der while-Schleife funktionierts, außerhalb nicht. Er gibt mir nach der while-Schleife bei "echo $vars_all;" nichtmal "Array" aus.
 
Zuletzt bearbeitet:
Edit: Das mit error_reporting() war ein schmarrn.

Probiers mal so:
PHP:
function fetch_array(){ 
  return mysql_fetch_array($this->res) or die (mysql_error()); 
}
 
Zuletzt bearbeitet:
Ist auch bereits in der config.cfg so eingestellt. Er gibt kein Fehler aus. Der Code an sich ist meiner Meinung nach auch richtig, sonst würde er mir ja innerhalb der while-schleife keine richtige Ausgabe geben.
 
Wenn ich das richtig sehe, müßte sich Dein Skript beim Auslesen nach dem letzten Datensatz komplett selbst verabschieden?
Statt die(...), solltest Du vvielleicht return false mal probieren, in der fetch-Funktion Deiner Klasse.
Gruß hpvw
 
Zurück