php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2005-2

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 09.06.2005, 23:25  
Benutzer
 
Registriert seit: 27.10.2004
Beiträge: 50
micbur
Standard Rückgabewert auf einer Klasse anders als in der Klasse

Hallo,

zur Vereinfachung und zum Kennenlernen von PHP habe ich mir vorgenommen eine Klasse für den Zugriff auf eine MySQL-Datenbank zu schreiben. Eine Klasse finde ich praktische, das liegt wohl daran, dass ich seit Jahren mit OOP in C++ und Java programmiere.

Jedenfalls sieht die Klasse so aus:
PHP-Code:
<?php

     
include_once("settings.inc");

class 
Mysqlcon {


     var 
$sql_host;
     var 
$sql_user;
     var 
$sql_pass;
     var 
$sql_database;
     var 
$sql_table;

     var 
$connection_id;
     var 
$result;
     var 
$errno;
     var 
$error;
     var 
$connected;


     function 
Mysqlcon($database) {

          
$this->sql_host = (defined("DB_HOST")) ? DB_HOST "no_host_given";
          
$this->sql_user = (defined("DB_USER")) ? DB_USER "no_user_given";
          
$this->sql_pass = (defined("DB_PASS")) ? DB_PASS "no_password_given";
          
$this->sql_database $database;

          
$this->connection_id NULL;
          
$this->result NULL;
          
$this->errno 0;
          
$this->error "";
          
$this->connected FALSE;

     }


     function 
errno() {
          return 
$this->errno;
     }


     function 
error() {
          return 
$this->error;
     }


     function 
resultarray() {
          
$array mysql_fetch_array($this->resultMYSQL_ASSOC);
          
print_r($array);
          return 
$array;
     }


     function 
getresult() {
          return 
"not yet implemented";
     }


     
/* Sendet nur SELECT-Anweisungen an die Datenbank.
      * Wenn eine Abfrage erfolgreich war, wird TRUE zurückgegeben, im Fehlerfall FALSE.
      * Das Result wird in der internen Variable _result gespeichert und kann mit den Funktionen
      * getresult() oder resultarray() geholt werden.
      *
      * @param String $cols - die Spalten, die abgefragt werden sollen,
      *             z.B. "spalte1,spalte5" oder "spalte3";
      *             default = *, wenn Parameter leer war
      * @param String $table - Name der Tabelle, aus welcher die Daten genommen werden sollen;
      *             z.B. "meinetolletablle";
      *             kann nicht leer bleiben, absolut notwendig
      * @param String $limit - Offset und Intervall, die Menge der Daten, die benötigt werden;
      *             z.B. "5,30" für 'ab dem fünften Element 30 Elemente holen';
      *             default = 1, wenn Parameter leer war
      * @param String $condition - Bedingung der SELECT-Anweisung
      *             z.B. col=value
      *             kann leer bleiben, default gesetzt auf leeren String
      *
      * @return Boolean TRUE, falls die Anfrage korrekt abgelaufen ist
      *             FALSE, falls es einen Fehler bei der Abfrage gab
      */
     
function select($table$cols "*"$limit "0,1"$condition "") {

     
/* prüfe auf ungültige Angaben, die Probleme verursachen könnten */
          
if (trim($table) == "") {
               
$this->error "no table is given! can not connect to any table!";
               return 
FALSE;
          }
          if (
trim($cols) == "") {
          
/* setze Standardwert */
               
$cols "*";
          }

     
// SELECT cols FROM `table` WHERE condition=true LIMIT from,count (ASC|DESC)
          
$_sql_query "";
          
$_sql_query .= "SELECT ".$cols." FROM `".$table."`";

          if (
trim($condition) != "") {
               
$_sql_query .= " WHERE ".$condition;
          }
          if (
trim($limit) != "") {
               
$_sql_query .= " LIMIT ".$limit;
          }

//          $_sql_query = "SELECT ".$cols." FROM `".$table."` WHERE ".$condition." LIMIT ".$limit;

          
$this->connect();
          
$this->result mysql_query($_sql_query);
          
$this->disconnect();

          return ( 
mysql_errno() ) ? FALSE TRUE;
     }


     function 
connect() {

          if (!
$this->connection_id mysql_connect($this->sql_host$this->sql_user$this->sql_pass) ) {
               
$this->errno mysqlerrno();
               
$this->error mysqlerror();
               
$this->connected FALSE;
               return 
FALSE;
          }
          else {

               if (!
mysql_select_db($this->sql_database)) {
                    
$this->errno mysqlerrno($this->connection_id);
                    
$this->error mysqlerror($this->connection_id);
                    
mysql_close($this->connection_id);
                    
$this->connected FALSE;
                    return 
FALSE;
               }
               else {
                    
// fehlerfrei durchgekommen
                    
$this->connected TRUE;
                    return 
TRUE;
               }

          }

     }


     function 
disconnect() {

          if (!
mysql_close($this->connection_id)) {
               
$this->errno mysqlerrno($this->connection_id);
               
$this->error mysqlerror($this->connection_id);
               return 
FALSE;
          }
          else {
               
$this->connected FALSE;
               
$this->connection_id NULL;
//               @mysql_free_result($this->result);
               
return TRUE;
          }

     }


}
?>
Aufgerufen habe ich das Ganze per
$_con = new Mysqlcon("testdb");
und dann wollte ich eine Abfrage starten mit
$_con->select("test_table", "name, email");
und das Ganze sollte ausgegeben werden per:
$_con->resultarray();

Fehlerbehandlung bitte noch dazu denken.

Was nun passiert ist einfach, bei $_con->resultarray() kommt nix raus, dafür kann ich innerhalb von ...
PHP-Code:
<?php     function resultarray() {
          
$array mysql_fetch_array($this->resultMYSQL_ASSOC);
          
print_r($array);
          return 
$array;
     }
?>
... wunderbar auf den Inhalt vom Array zugreifen.
Ich verstehe es einfach nicht und ich habe auch schon diverse '&' versucht, weil ich könnte ja auch mit dem Pointern arbeiten, das wäre mir wurscht.

Hat jemand eine tolle Idee?

Ciao, micbur

PS: benutze PHP 4.3
micbur ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 09.06.2005, 23:53  
axo
Erfahrener Benutzer
 
Registriert seit: 24.12.2004
Beiträge: 1.818
axo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

bitte nicht nach jedem mysql_query() die datenbank-verbindung beenden. damit tust du mysql nur weh.

du überprüfst auch nicht korrekt auf fehler... den mysql_error() , der bei mysql_query() entstehen kann, speicherst du nicht mit.

dann sollte evtl. resultarray() folgendermaßen aussehen:

PHP-Code:
<?php

function resultArray() {
  
$res = array();
  while(
$d  mysql_fetch_assoc($this -> result)) {
    
$res[] = $d
  }
  return 
$res;
}

?>

grüße
axo
axo ist offline  
Alt 10.06.2005, 07:50  
Benutzer
 
Registriert seit: 27.10.2004
Beiträge: 50
micbur
Standard

Guten Morgen,

Zitat:
Zitat von axo
bitte nicht nach jedem mysql_query() die datenbank-verbindung beenden. damit tust du mysql nur weh.
Tja, da mein Provider keine persistenten Verbindungen zulässt und ich eine Vereinfachung an anderer Stelle haben wollte, wird das leider so bleiben müssen.

Ich frage mich gerade, was an deinem Code anders ist. Weil im Prinzip richtest du ja jetzt nur das Array ein. Gibt es also gar keinen Fehler in der Funktion?
Ja, das mit den mysql_errno() ... ist dann irgendwann unter gegangen. Erst fing ich an, den Code auszukommentieren, bis ich nur noch Kommentare in der Funktion und zwei Zeilen Code hatte. Daher ist das mit mysql_errno() ... gerade rausgeschnitten fürs Forum.

Ciao, mirbur
micbur ist offline  
Alt 10.06.2005, 08:13  
axo
Erfahrener Benutzer
 
Registriert seit: 24.12.2004
Beiträge: 1.818
axo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Tja, da mein Provider keine persistenten Verbindungen zulässt und ich eine Vereinfachung an anderer Stelle haben wollte, wird das leider so bleiben müssen.
RTFM verdammt.

das schließen der verbindung sollte am skriptende stattfinden, und nicht nach jedem einzelnen mysql-query.

lass das disconnect einfach komplett weg, dann kümmert sich php um das schließen der verbindung, und zwar genau dann, wenn es nötig ist.


Zitat:
Ich frage mich gerade, was an deinem Code anders ist. Weil im Prinzip richtest du ja jetzt nur das Array ein. Gibt es also gar keinen Fehler in der Funktion?
funktioniert's denn so? wenn ja, könnt ich dir schon sagen, woran's liegt, aber ich bin mir nicht sicher, ob's daran lag. wahrscheinlich liegt's eh nur an der benutzung der methode, nicht an der methode selbst.
axo ist offline  
Alt 10.06.2005, 09:09  
Erfahrener Benutzer
 
Registriert seit: 18.09.2003
Beiträge: 13.598
PHP-Kenntnisse:
Fortgeschritten
imported_Ben ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Les Dir wirklich mal den Unterschied zwischen mysql_connect() und mysql_pconnect() durch.
imported_Ben ist offline  
Alt 10.06.2005, 13:51  
Benutzer
 
Registriert seit: 27.10.2004
Beiträge: 50
micbur
Standard

Zitat:
Zitat von axo
dann sollte evtl. resultarray() folgendermaßen aussehen:

PHP-Code:
<?php

function resultArray() {
  
$res = array();
  while(
$d  mysql_fetch_assoc($this -> result)) {
    
$res[] = $d
  }
  return 
$res;
}

?>

grüße
axo
Hallo,

so wie oben beschrieben, habe ich es jetzt gemacht.
Leider funktioniert das auch nicht. Intern ist aber alles da. Ich verstehe es nicht. Was ist mit globals(), muss ich da vielleicht etwas setzen?
Das wäre aber nicht 'schwachsinnig', weil Klassen ja aus der OOP kommen.

Wie würdet ihr denn so eine MySQL-Klasse schreiben, bzw. welche nutzt ihr da oder welche Implementation ist, eurer Meinung nach, gut gelungen?

Ciao, micbur
micbur ist offline  
Alt 10.06.2005, 15:06  
axo
Erfahrener Benutzer
 
Registriert seit: 24.12.2004
Beiträge: 1.818
axo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

wie sieht denn der aufruf der methode aus? vielleicht ist daran was verkehrt.

wir würden das rad nicht neu erfinden sondern PEAR:: DB oder ADODB verwenden.
axo ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
zentrale Klasse für Datenbankanbindung Crypi PHP Tipps 2008 4 01.07.2008 11:13
Variable aus Klasse herausbekommen GSJLink PHP Tipps 2008 7 16.02.2008 22:25
String-Parser Klasse - was muss rein? Matze PHP Tipps 2007 2 08.04.2007 22:14
Eine Klasse mehrere Dateien sn00py PHP Tipps 2006 6 08.05.2006 11:40
mehr als eine Klasse einbinden Alpha Centauri PHP-Fortgeschrittene 4 13.04.2006 20:56
[Erledigt] Instanz einer Klasse in SessionVariable PHP-Fortgeschrittene 2 21.02.2006 00:18
aus einer funktion auf funktion anderer klasse zugreifen seejay PHP Tipps 2006 3 05.01.2006 10:37
Klasenname einer nicht instanziierten Klasse DerDesian PHP Tipps 2007 9 30.11.2005 13:13
Instanz einer Klasse in einer anderen Klasse verwenden Buhmann PHP-Fortgeschrittene 7 28.10.2005 23:12
[Erledigt] Führerschein für Klasse A+B.. Preis OK??? Off-Topic Diskussionen 20 13.07.2005 18:44
Problem mit Übergabe einer Klasse in PHP4 PHP-Fortgeschrittene 10 08.01.2005 21:00
Klasse holt sich die Klasse PHP-Fortgeschrittene 9 07.10.2004 11:53
[Erledigt] Brauche Hilfe bei meiner ersten Klasse PHP-Fortgeschrittene 9 24.09.2004 17:09
Klassenobjet in anderer Klasse benutzen inu PHP Tipps 2004 6 19.09.2004 10:58
Klasse ändern UniQ PHP Tipps 2004 5 24.08.2004 14:46

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php klasse soll im fehlerfall false zurückgeben, php klasse als rückgabewert für funktion, funktion mit klasse als rückgabewert, rückgabe wert klasse, mysql_fetch_array php funktion klasse übergeben rückgabewert

Alle Zeitangaben in WEZ +1. Es ist jetzt 20:18 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.