php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2008

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 22.07.2008, 15:24  
Neuer Benutzer
 
Registriert seit: 05.05.2008
Beiträge: 19
PHP4ever befindet sich auf einem aufstrebenden Ast
Standard [Erledigt] Klasse / Funktionen verwenden

Ich hatte mir gegen redundanten Quelltext eine Klasse mit MySQL-Funktionen geschrieben.

Ursprünglich wurde die Klasse "includiert" aber nachdem daraufhin die Funktion nicht gefunden wurde ("Call to a member function connect() on a non object in ...") habe ich die Klasse zum probieren kurzerhand mit in meine eigentliche Datei gepackt.

Code:
<?php
include('./konfiguration/config.php');

class sql
 {
 function connect($host,$db,$benutzer,$passwort)
  {
  global $verbindung;
  $verbindung = mysql_connect($host,$benutzer,$passwort);
  $select = mysql_select_db($db,$verbindung);
  if($select) {return true;} else {return false;}
  }
 }


if(!$sql->connect(MYSQL_HOST,MYSQL_DB,MYSQL_BENUTZER,MYSQL_PASSWORT))
 {
 die('Fehler bei dem Versuch, Verbindung zur Datenbank herzustellen!');
 }
 else
 {
 echo 'Verbindung hergestellt';
 }
?>
MYSQL_HOST usw. werden in './konfiguration/config.php' definiert und lassen sich per echo auch ausgeben.

Jetzt bekomm ich ständig die Fehlermeldungen:
1) "Undefined variable: sql in ... on line 16"
2) "Call to a member function connect() on a non-object in ... on line 16"

Die selbe Klasse/Funktion habe ich bereits öfters mit dem gleichen Aufruf verwendet!?? Kann mir jemand helfen?
__________________
"Je größer die Insel des Wissens, desto länger die Küste der Verzweiflung!"

Geändert von PHP4ever (22.07.2008 um 15:28 Uhr).
PHP4ever ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 22.07.2008, 15:39  
Benutzer
 
Registriert seit: 19.05.2008
Beiträge: 86
SJahr befindet sich auf einem aufstrebenden Ast
SJahr eine Nachricht über ICQ schicken SJahr eine Nachricht über MSN schicken
Standard

Bevor du eine Klasse benutzen kanns musst du erst ein Objekt dieser Klasse erzeugen.
PHP-Code:
<?php
include('./konfiguration/config.php');

class 
sql
 
{
 function 
connect($host,$db,$benutzer,$passwort)
  {
  global 
$verbindung;
  
$verbindung mysql_connect($host,$benutzer,$passwort);
  
$select mysql_select_db($db,$verbindung);
  if(
$select) {return true;} else {return false;}
  }
 }

$sql = new sql();
if(!
$sql->connect(MYSQL_HOST,MYSQL_DB,MYSQL_BENUTZER,MYSQL_PASSWORT))
 {
 die(
'Fehler bei dem Versuch, Verbindung zur Datenbank herzustellen!');
 }
 else
 {
 echo 
'Verbindung hergestellt';
 }
?>
SJahr ist offline  
Alt 22.07.2008, 15:43  
Neuer Benutzer
 
Registriert seit: 05.05.2008
Beiträge: 19
PHP4ever befindet sich auf einem aufstrebenden Ast
Standard

OMG! Blamed!!! Nu klar ... hast Recht. Danke!
__________________
"Je größer die Insel des Wissens, desto länger die Küste der Verzweiflung!"
PHP4ever ist offline  
Alt 22.07.2008, 15:48  
¯\_(ツ)_/¯
 
Benutzerbild von Flor1an
 
Registriert seit: 18.06.2008
Beiträge: 8.814
PHP-Kenntnisse:
Fortgeschritten
Flor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer Anblick
Standard

Deine Klasse braucht auch kein global! Dafür sind Klassen ja da.
Außerdem würde ich die Fehlerbehandlung IN der Klasse machen da du sonst auch wieder überall diese Fehlerbehebung machen musst.

PHP-Code:
<?php
include('./konfiguration/config.php');

class 
Sql {
    private 
$verbindung;

    public function 
connect($host$db$benutzer$passwort) {
        
$this->verbindung = @mysql_connect($host$benutzer$passwort);
        if (
$this->verbindung === false) {
            
trigger_error('Fehler beim Herstellen einer Verbindung zur Datenbank!');
            return 
false;
        }
        
$select = @mysql_select_db($db$this->verbindung);
        if(
$select === false) {
            
trigger_error('Fehler beim Auswählen der Datenbank!');
            return 
false;
        }
        return 
true;
    }
}

$sql = new Sql();
$sql->connect(MYSQL_HOSTMYSQL_DBMYSQL_BENUTZERMYSQL_PASSWORT);
Bei Klassennamen verwendet man oft einen Großbuchstaben am Anfang!
Flor1an ist offline  
Alt 22.07.2008, 16:05  
Neuer Benutzer
 
Registriert seit: 05.05.2008
Beiträge: 19
PHP4ever befindet sich auf einem aufstrebenden Ast
Standard

Zwecks global ... die Funktion ist schon älter (weiß also nicht mehr genau wie es war!) aber ich hatte damals Probleme beim beenden meiner Verbindung wenn ich
Code:
global $verbindung;
nicht mit im Quelltext hatte!
Das Beenden erfolgte über eine weitere Funktion:
Code:
function close()
 {
 global $verbindung;
 if(mysql_close($verbindung)) {return true;} else {return false;}
 }
Das mit dem sofortigen auswerten werde ich mir zu Herzen nehmen! ^^

Frage: Wozu "$this->verbindung"?
__________________
"Je größer die Insel des Wissens, desto länger die Küste der Verzweiflung!"

Geändert von PHP4ever (22.07.2008 um 16:09 Uhr).
PHP4ever ist offline  
Alt 22.07.2008, 16:12  
¯\_(ツ)_/¯
 
Benutzerbild von Flor1an
 
Registriert seit: 18.06.2008
Beiträge: 8.814
PHP-Kenntnisse:
Fortgeschritten
Flor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer Anblick
Standard

Schau doch im Manual nach, da steht beschrieben wie Klassen funktionieren!

$this->verbindung ist eine "globale" Variable innerhalb der Klasse. Genau das was du mit global $verbindung versuchst zu machen.

Die Methode zum schließen der Verbindung könnte dann so aussehen.

PHP-Code:
<?php
public function close() {
    if (
$this->verbindung !== null) {
        return 
mysql_close($this->verbindung);
    }
}
Flor1an ist offline  
Alt 27.07.2008, 16:06  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 34.247
PHP-Kenntnisse:
Fortgeschritten
nikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz sein
Standard

Zitat:
Zitat von Flor1an
Außerdem würde ich die Fehlerbehandlung IN der Klasse machen da du sonst auch wieder überall diese Fehlerbehebung machen musst.
Das liegt zwar nahe, im Rahmen des Themas Zusicherungen (assertions) habe ich aber auch des öfteren Gegenteiliges gelesen:

Zitat:
Wenn die Parameter explizit überprüft werden, muss das vom Aufrufer erledigt werden, weil die Methode nie Parameter zu sehen bekommen darf, die ihre Vorbedingungen verletzen.
Dort am Bsp. Wurzelziehen
Zitat:
Wenn der Benutzer eine negative Zahl eingibt, muss der aufrufende Quelltext dafür sorgen, dass sie nicht an sqrt übergeben wird. Der aufrufende Quelltext hat viele Möglichkeiten: Er kann das Programm abbrechen, eine Warnung ausgeben und eine neue Zahl einlesen oder die Zahl mit -1 multiplizieren und "i" an das Ergebnis von sqrt anhängen. Was auch immer getan wird, es ist definitiv nicht die Aufgabe von sqrt.
aus: Der pragmatische Programmierer

Ein interessanter Ansatz finde ich. Klingt auch logisch. Ist aber eine mächtige Umstellung, das muß man sich immer wieder ins Gedächtnis rufen.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist gerade online  
Alt 27.07.2008, 16:24  
¯\_(ツ)_/¯
 
Benutzerbild von Flor1an
 
Registriert seit: 18.06.2008
Beiträge: 8.814
PHP-Kenntnisse:
Fortgeschritten
Flor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer Anblick
Standard

Das ist schon richtig. Hab gestern erst eine Klausur über Vor- und Nachbedingungen von Funktionen geschrieben Der pragmatische Programmierer hab ich noch nicht ganz fertig, gammelt seit Weihnachten noch im Regal.

Auf jeden Fall ist die Frage wie du deine Vor- und Nachbedingungen für deine eigenen Funktionen definierst. Man kann natürlich nur true/false bei connect() zurückgeben. Funktioniert genauso dann muss deine Applikation die Fehlerbehandlung machen. Wenn allerdings diese immer gleich aussieht, dann würde es ebenfalls gegen das DRY Prinzip verstoßen Hier wieder aus Der pragmatischer Programmierer.

Bei meiner DB Klasse wird connect() nur intern aufgerufen! Und zwar erst wenn wirklich eine Verbindung hergestellt werden MUSS. Meistens also beim ersten Query oder beim ersten mysql_real_escape_string(). Daher wird die Fehlerbehandlung von der Klasse übernommen da ich nicht bei jedem Query die Fehlerbehandlung für !mysql_connect() übernehmen möchte.
__________________
▇█▓▒░◕‿‿◕░▒▓█▇
Flor1an 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
[Erledigt] Klassen und Funktionen wetteronkel PHP Tipps 2008 11 11.06.2008 13:32
[Erledigt] Submit Button mit 2 Funktionen Spacecop PHP Tipps 2008 23 27.05.2008 17:38
Variable aus Klasse herausbekommen GSJLink PHP Tipps 2008 7 16.02.2008 22:25
Klassen und externe Funktionen ? ssm PHP-Fortgeschrittene 17 18.07.2007 11:59
String-Parser Klasse - was muss rein? Matze PHP Tipps 2007 2 08.04.2007 22:14
Funktionen überprüfen und Grafik Funktionen hans.karl2 PHP Tipps 2006 10 31.07.2006 20:08
mehr als eine Klasse einbinden Alpha Centauri PHP-Fortgeschrittene 4 13.04.2006 20:56
gzip klasse verwenden oder nicht? danysahne333 PHP Tipps 2006 3 02.04.2006 13:58
[Erledigt] Auswertung von Funktionen innerhalb von Strings PHP Tipps 2006 5 30.01.2006 14:03
Instanz einer Klasse in einer anderen Klasse verwenden Buhmann PHP-Fortgeschrittene 7 28.10.2005 23:12
define-Konstante in Klasse verwenden? bicpi PHP-Fortgeschrittene 4 04.08.2005 15:03
[Erledigt] Funktionen in einer Klasse 'registrieren' bzw. includieren ? PHP-Fortgeschrittene 1 16.07.2005 13:23
Instanz einer Klasse innerhalb einer Funtion verwenden PHP-Fortgeschrittene 9 14.04.2005 21:51
Klasse holt sich die Klasse PHP-Fortgeschrittene 9 07.10.2004 11:53
Klasse ändern UniQ PHP Tipps 2004 5 24.08.2004 14:46

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
code dry fehlerbehandlung, php class member function sql, funktionen global verwenden klasse

Alle Zeitangaben in WEZ +1. Es ist jetzt 15:20 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