php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 13-09-2007, 09:32
hamstah
 Newbie
Links : Onlinestatus : hamstah ist offline
Registriert seit: Sep 2003
Beiträge: 57
hamstah ist zur Zeit noch ein unbeschriebenes Blatt
Standard Anfänge mit OOP

Hallo,

so also ich hab mich jetzt mal ein bischen in OOP eingearbeitet und meine erste kleine Klasse geschrieben. Allerdings habe ich die Datenbankverbindung mit in der Klasse drin, was ja auf Dauer nicht wirklich gut ist, da ich noch mehr Klassen benötige und nicht in jede Klasse die DB Connection drin haben möchte. Weiß allerdings im Moment nicht wirklich wie ich das realisiere. Hier mal meine Klasse:

PHP-Code:
class navigation {
    protected 
$conn;
    protected 
$user 'root';
    protected 
$pass '';
    protected 
$dbname 'top';
    protected 
$host 'localhost';
    
    public function 
__construct() {
        
$this->conn mysql_connect($this->host$this->user$this->pass);
        
mysql_select_db($this->dbname,$this->conn);
    }
    
   public function 
getUni() {
        
$sql "SELECT * FROM kategorie WHERE status = 1 ORDER BY id";
        
$rs mysql_query($sql$this->conn);    
        
$result = array();
        while(
$row mysql_fetch_assoc($rs)) {
            
$result[] = $row;
        }        
        return 
$result;
    }
    
    public function 
getArzt() {
        
$sql "SELECT * FROM kategorie WHERE status = 2 ORDER BY id";
        
$rs mysql_query($sql$this->conn);    
        
$result = array();
        while(
$row mysql_fetch_assoc($rs)) {
            
$result[] = $row;
        }        
        return 
$result;
    }
    
    public function 
getPatient() {
        
$sql "SELECT * FROM kategorie WHERE status = 3 ORDER BY id";
        
$rs mysql_query($sql$this->conn);    
        
$result = array();
        while(
$row mysql_fetch_assoc($rs)) {
            
$result[] = $row;
        }        
        return 
$result;
    }
        

protected $conn;
protected $user = 'root';
protected $pass = '';
protected $dbname = 'top';
protected $host = 'localhost';

public function __construct() {
$this->conn = mysql_connect($this->host, $this->user, $this->pass);
mysql_select_db($this->dbname,$this->conn);
}
Dieser teil müsste ja ausgelagert werden. Nur wie genau damit ich dann auch in der anderen Klasse die Select Anfragen starten kann. Wer hat einen Hinweis für mich??

gruß

Evilknevil
Mit Zitat antworten
  #2 (permalink)  
Alt 13-09-2007, 09:38
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Singleton
Mit Zitat antworten
  #3 (permalink)  
Alt 13-09-2007, 09:50
hamstah
 Newbie
Links : Onlinestatus : hamstah ist offline
Registriert seit: Sep 2003
Beiträge: 57
hamstah ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Danke für den Link aber ein kleiner Codehinweis wäre im Moment bestimmt etwas einfacher zu verstehen.

gruß

evilknevil
Mit Zitat antworten
  #4 (permalink)  
Alt 13-09-2007, 09:56
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Dann such nach "PHP Singleton DB Klasse" oder sowas...
Mit Zitat antworten
  #5 (permalink)  
Alt 13-09-2007, 11:14
hamstah
 Newbie
Links : Onlinestatus : hamstah ist offline
Registriert seit: Sep 2003
Beiträge: 57
hamstah ist zur Zeit noch ein unbeschriebenes Blatt
Standard

So bin schon mal einen Schritt weiter. Aber jetzt zum nächsten Problem:

Hier meine Db Klasse:

PHP-Code:
class dbConnector {
  private 
$connection NULL;
  private 
$result NULL;

  private static 
$uniqueInstance NULL;

  protected function 
__construct() {}

  private final function 
__clone() {}


  public static function 
singleton() {
  if (
self::$uniqueInstance === NULL) {
    
self::$uniqueInstance = new dbConnector;
  }
    return 
self::$uniqueInstance;
  }

  public function 
connect($host$database$user$pass) {
    
$this->connection mysql_connect($host,$user,$pass,TRUE);
    
mysql_select_db($database$this->connection);
  }

  public function 
disconnect() {
    if (
is_resource($this->connection)) {
      
mysql_close($this->connection);
    }
  } 
Hier meine Klasse:

PHP-Code:
class TEST  {

private 
$connection;

    function 
__construct(){
    require_once (
'class.db.php');

    
$this->connection dbConnector::singleton();
    
$this->connection->connect('localhost','top''root''');
    }
    
    
    public function 
getList() {
        
$sql "SELECT * FROM kategorie WHERE status = 1";
        
$recordSet mysql_query($sql,$this->connection);
        
$results = array();
        while(
$row mysql_fetch_assoc($recordSet)) {
            
$results[] = $row;
        }
        return 
$results;
    }    
    

So da kommt ne Fehlermeldung.

mysql_query(): supplied argument is not a valid MySQL-Link resource

Er bekommt also keine Verbindung zur DB. Liegt an dieser Zeile:

$recordSet = mysql_query($sql,$this->connection);

ich denke mal es liegt an $this->connection. Nur wie rufe ich das ganze richtiog auf damit er ne Verbindung zur DB bekommt?

Danke schonmal

Evilknevil
Mit Zitat antworten
  #6 (permalink)  
Alt 13-09-2007, 13:08
penizillin
 PHP Guru
Links : Onlinestatus : penizillin ist offline
Registriert seit: Feb 2004
Beiträge: 10.166
penizillin ist zur Zeit noch ein unbeschriebenes Blatt
Standard

http://www.php-resource.de/forum/sho...threadid=50454
Mit Zitat antworten
  #7 (permalink)  
Alt 13-09-2007, 13:39
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

PHP-Code:
class dbConnector {
  private 
$connection NULL;
  
// ...

Die Mysql-Verbindung ist ja auch lediglich in der Klasse gekapselt. Du musst der mysql_query-Funktion aber genau diese Resource übergeben. Also entweder bastelst du dir deine Klasse so, dass du an die DB-Verbindung ran kommst, oder du bastelst dir gleich eine ganze DB-Klasse, so wie er hier das vor hat/hatte!
Mit Zitat antworten
  #8 (permalink)  
Alt 13-09-2007, 19:26
hiro
 Newbie
Links : Onlinestatus : hiro ist offline
Registriert seit: Aug 2007
Beiträge: 27
hiro ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hallo,
sry wegen Offtopic^^

@PHP-Desaster
Ich habs noch immer vor, schau mir nur atm paar Sachen an die ihr im Thread geschrieben habt. Versuch das alles abzuchecken und meine Kentnisse zu erweitern.

Ich weiß atm nicht genau wie ich alles aufbauen soll.
Mit Zitat antworten
  #9 (permalink)  
Alt 14-09-2007, 23:42
3DMax
 PHP Senior
Links : Onlinestatus : 3DMax ist offline
Registriert seit: Jan 2004
Beiträge: 1.916
3DMax ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von hiro
Ich weiß atm nicht genau wie ich alles aufbauen soll.
grob gesagt erweiterst du deine klasse um die methode query($sql)
diese methode setzt den member $this->result in deiner db-klasse und gibt nichts zurück, bei einem fehler einfach eine exception werfen.

dann rufst du das ganze so auf (wobei der name connection irreführend ist):
$this->connection->query($sql);

"while($row = mysql_fetch_assoc($recordSet))" kapselst du dann auch als methode der db-klasse: $row=$this->connection->fetchRow()
die methode gibt dir dann ein array (oder auch result-object oder sonstwas) der aktuellen zeile oder false zurück.
Mit Zitat antworten
  #10 (permalink)  
Alt 15-09-2007, 00:03
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von 3DMax
"while($row = mysql_fetch_assoc($recordSet))" kapselst du dann auch als methode der db-klasse: $row=$this->connection->fetchRow()
die methode gibt dir dann ein array (oder auch result-object oder sonstwas) der aktuellen zeile oder false zurück.
ähm... also das Ergebnis ist für gewöhnlich ein eigenständiges Objekt, dementsprechend eher sowas
PHP-Code:
<?php
$result 
$db->query("SELECT * FROM tabelle");
while (
$row $result->fetch_assoc()) {
  
print_r($row);
}
so würde es z.B. auch mit mysqli umgesetzt werden
Mit Zitat antworten
  #11 (permalink)  
Alt 15-09-2007, 01:02
3DMax
 PHP Senior
Links : Onlinestatus : 3DMax ist offline
Registriert seit: Jan 2004
Beiträge: 1.916
3DMax ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von ghostgambler
ähm... also das Ergebnis ist für gewöhnlich ein eigenständiges Objekt, ...
für gewöhnlich?
ich habe doch geschrieben, dass es sonstwas sein kann.

nur du schreibst: "$row = $result->fetch_assoc())" und das riecht stark nach array.

falsch verstanden - du mich - ich dich?
Mit Zitat antworten
  #12 (permalink)  
Alt 15-09-2007, 01:21
3DMax
 PHP Senior
Links : Onlinestatus : 3DMax ist offline
Registriert seit: Jan 2004
Beiträge: 1.916
3DMax ist zur Zeit noch ein unbeschriebenes Blatt
Standard

ok, ghostgambler ich hab's jetzt
du möchtest also grundsätzlich das result als objekt mit eigenen methoden zurückgeben.
kann man machen, muss man aber nicht.

gibst du das result-objekt als referenz zurück, so dass über das db-objekt wieder darauf zugegriffen werden kann?
Mit Zitat antworten
  #13 (permalink)  
Alt 15-09-2007, 02:22
3DMax
 PHP Senior
Links : Onlinestatus : 3DMax ist offline
Registriert seit: Jan 2004
Beiträge: 1.916
3DMax ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von hamstah
Danke für den Link aber ein kleiner Codehinweis wäre im Moment bestimmt etwas einfacher zu verstehen.
nagut, dann knall' ich mal meinen gestrigen code hier rein - nicht getestet, aber das grundgerüst sollte stimmen.
ist ein erweitertes singleton-pattern, das mehrere diffrenzierte instanzen zulässt.

frage mich aber nach wie vor, ob das resultset ein eigenständiges objekt sein sollte, wie ghostgambler vorgeschlagen hat, bin noch am grübeln.

PHP-Code:
require_once('DB/YaB_I_DB.php');
require_once(
'DB/YaB_DB_Exception.php');

class 
YaB_DB_MySQL implements YaB_I_DB
 
{  
  private static 
$instances=array();
  
  private 
$connection=false;
  
  private 
$result=false;

  
  protected function 
__construct()
   {
   }

  private function 
__clone()
   {   
   }
   
  public static function 
getInstance($id='default')
   {
    if(!isset(
self::$instances[$id]))
     
self::$instances[$id]=new YaB_DB_MySQL();
     
    return 
self::$instances[$id];
   }
   
  public function 
connect($server$user$password$database=null)
   {
    
$this->connection=@mysql_connect($server$user$passwordtrue);
    
    if(!
is_resource($this->connection))
     {
      
$e='Failed to connect to database server'.$this->_getError();
      throw new 
YaB_DB_Exception($e);
     }          

    if(!
is_null($database))
     
$this->selectDB($database);  
   }   
   
  public function 
selectDB($db)
   {
    if(!
is_resource($this->connection))
     {
      
$e="Not connected to database server, can't select database '{$db}'";
      throw new 
YaB_DB_Exception($e);
     }
    
    if(!
mysql_select_db($db$this->connection))
     {
      
$e="Can't select database '{$db}'".$this->_getError();
      throw new 
YaB_DB_Exception($e);
     }
   }   

  public function 
query($sql)
   {
    if(!
is_resource($this->connection))
     {
      
$e="Not connected to database server, can't query:\n{$sql}";
      throw new 
YaB_DB_Exception($e);
     }
    
    if(
is_resource($this->result))
     
mysql_free_result($this->result);
     
    if(!
$this->result=mysql_query($sql$this->connection))
     throw new 
YaB_DB_Exception("Invalid query:\n{$sql}".$this->_getError());
   }

  public function 
escape($str)
   {
    if(!
is_resource($this->connection))
     {
      
$e="Not connected to database server, can't escape: {$str}";
      throw new 
YaB_DB_Exception($e);
     }
     
    return 
mysql_real_escape_string($str$this->connection);    
   }
   
  public function 
fetchRow()
   {
    if(!
is_resource($this->result))
     return 
false;
    
    return 
mysql_fetch_assoc($this->result);
   }

  public function 
getID()
   {
    if(!
is_resource($this->connection))
     {
      
$e='Not connected to database server, can\\'t retrieve AUTO_INCREMENT ID;
      throw new 
YaB_DB_Exception($e);
     }

    return 
mysql_insert_id($this->connection);   
   }
   
  public function 
getNum()
   {
    
//For SELECT, SHOW, DESCRIBE, EXPLAIN and other statements returning 
    //resultset, mysql_query() returns a resource on success, or FALSE on error.
    
if(is_resource($this->result))
     return 
mysql_num_rows($this->result);
     
    
//For other type of SQL statements, INSERT, UPDATE, REPLACE or DELETE, etc, 
    //mysql_query() returns TRUE on success or FALSE on error.
    
if($this->result===true&&is_resource($this->connection))
     return 
mysql_affected_rows($this->connection); 

    return 
false;
   }

  private function 
_getError()
   {
    
$is_connected=is_resource($this->connection);

    
$errno=($is_connected) ? mysql_errno($this->connection) : mysql_errno();
    
$errmsg=($is_connected) ? mysql_error($this->connection) : mysql_error();

    return 
"\nMySQL-ERRNO: [{$errno}]\nMySQL-ERRMSG: [{$errmsg}]\n";
   }
 
 
 } 
das interface und die exception kneife ich mir mal.
Mit Zitat antworten
  #14 (permalink)  
Alt 15-09-2007, 11:23
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von 3DMax
ok, ghostgambler ich hab's jetzt
du möchtest also grundsätzlich das result als objekt mit eigenen methoden zurückgeben.
kann man machen, muss man aber nicht.
Es macht aber deutlich mehr Sinn - die Datenbankverbindung modelliert mal als eigenständiges Objekt und das Ergebnis dann auch ... ich weiß nicht, verträgt sich mit meinen Vorstellungen eher

Zitat:
gibst du das result-objekt als referenz zurück, so dass über das db-objekt wieder darauf zugegriffen werden kann?
öhm... nein?
Wozu sollte ich über das db-Objekt auf das Result zugreifen wollen?
Mit Zitat antworten
  #15 (permalink)  
Alt 15-09-2007, 20:59
3DMax
 PHP Senior
Links : Onlinestatus : 3DMax ist offline
Registriert seit: Jan 2004
Beiträge: 1.916
3DMax ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von ghostgambler
öhm... nein?
Wozu sollte ich über das db-Objekt auf das Result zugreifen wollen?
hm, naja, falls du an einer anderen stelle nochmals das letzte abfrageergebnis benötigst
dann kannst du per db-singleton bequem darauf zugreifen und musst nicht das reslut-objekt durchreichen.
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

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 an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

ADSMAN V3 - Werbe-Manager ansehen ADSMAN V3 - Werbe-Manager

ADSMAN V3 - mehr als nur ein Bannermanager! Banner, Textanzeigen und PagePeel Manager! Mit ADSMAN PRO haben Sie die Marketinglösung für eine effektive und effiziente Werbeschaltung mit messbaren Ergebnissen. Unterstützt werden Bannerformate in beliebi

25.10.2018 virtualsystem | Kategorie: PHP/ Bannerverwaltung
PHP News und Artikel Script V2

News schreiben, verwalten, veröffentlichen. Dies ist jetzt mit dem neuen PHP News & Artikel System von virtualsystem.de noch einfacher. Die integrierte Multi-User-Funktion und der WYSIWYG-Editor (MS-Office ähnliche Bedienung) ermöglichen...

25.10.2018 virtualsystem | Kategorie: PHP/ News
Top-Side Guestbook

Gästebuch auf Textbasis (kein MySQL nötig) mit Smilies, Ip Sperre (Zeit selbst einstellbar), Spamschutz, Captcha (Code-Eingabe), BB-Code, Hitcounter, Löschfunktion, Editierfunktion, Kommentarfunktion, Kürzung langer Wörter, Seiten- bzw. Blätterfunktion, V

22.10.2018 webmaster10 | Kategorie: PHP/ Gaestebuch
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 13:27 Uhr.