PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Inkludieren in klassen...



cocaxx
03-12-2002, 20:08
Hi!

Ich hab fol. Problem: Ich hab eine Klasse, die alles für ein news system enthält. Jetzt brauche ich für jede funktion einen "sql Zugang. Inkludieren meiner connect.php geht nicht. Wenn cih den code rauskopiere und in die funktionen der klasse reinkopiere gehts aber. Wie kann cih Dateien inkludieren?


greetz
cocaxx

Gaert
03-12-2002, 20:36
was steht denn in deiner connect.php drin und an welcher stelle willst du sie includen?

cocaxx
03-12-2002, 21:19
Hi!

Ich hab mir das jetzt so berlegt: Ich hab ne klasse mysql_lib. DIe sieht so aus:



class mysql_db {

function connect() {
// server adress where the mysql database is running...
$server = "localhost";
// name of the db which contains the tables
$db = "k2116db";
// username for login
$user = "";
// password for login
$pass = "";

$error = false;
$errornum = false;

$dbh = mysql_connect($this->server, $this->user, $this->pass);
$dbs = mysql_select_db($this->db, $dbh);

$errornum = mysql_errno($dbh);
$error = mysql_error($dbh);
echo $errornum . ": " . $error;

} //END function
} // Class end

cocaxx
03-12-2002, 21:22
Hi!

Jetzt hab ich ne andere klasse mit dem schema:





include("connect.php");
$database = new mysql_db;

class news_sql_Module extends ContentModule {

function action() {

}


function run() {
shownews();
}

function shownews() {
$database->connect();
}
}



Wenn ich nun dieses script hier starte, bekomme ich den fehler, dass keine mysql datenbank ausgewählt ist. Die vErbindung steht aber! Das Beste ist, dass es die DAtenbank gibt und wenn ich das verwendete script in jede function einfüge, dann gehts !

Gaert
03-12-2002, 21:47
schon mal dran gedacht $database als global zu deklarieren... so kanns ja net gehen!

Also:



...
global $database;
$database = new mysql_db;
....

class news_sql_Module extends ContentModule {

....

function shownews() {
$GLOBALS['database']->connect();
}
}
;

cocaxx
04-12-2002, 07:41
Hi!

Das geht auch nicht...es kommt der selbe Fehler wie immer, Verbindung zur DB ist hergestellt aber es konnte keine DB ausgewählt werden:

1046: No Database Selected
Warning: mysql_db_query(): supplied argument is not a valid MySQL-Link resource in /home/httpd/htdocs/projects/h4cms-dev2/modules/news_sql/index.php on line 61



greetz
cocaxx

Xerxes
04-12-2002, 08:07
ich würd's so machen:

<?php
//
// Der Konstruktor sollte sich mit dem Db-Server verbinden und eine
// Datenbank auswählen.
//
$db = new meinemysqlklasse();

//
// Eine Instanz der Newsklasse wird erstellt
// Kann man dann irgendwas mit machen ;-)
//
$news = new news();

//
// Und hier ein Teil der News-Klasse
//
class news
{
function news()
{
global $db;

$db->query( "SELECT spalte FROM tabelle" );
}
}
?>
So kannst du innerhalb deiner Klasse garantiert auf dein Datenbank-Objekt zugreifen.
Wenn es immer noch nicht funktioniert, teste dein Objekt mal außerhalb einer Klasse. Gut möglich, dass du überhaupt nicht richtig verbunden bist... ;)

cocaxx
04-12-2002, 10:12
Hi!

In einem anderen forum wurde ich aufs class nesting hingewiesen....ich probier mal beides aus :)



greetz
cocaxx

mehlvogel
05-12-2002, 17:10
Hachja, wenn erstma die neueste PHP Version raus ist - die ordentliche Klassenprogrammierung möglich macht.

Ich würde es so machen:



class news .. {
var $db = 0;
// Konstruktor
function news ($db) {
$this->db = $db;
$this->db->connect();
}


Aufgerufen wird der Spaß jetzt mit:



include("sqlklasse.php");
include("newsklasse.php");
$sql = new sqlklasse(...);
$news = new news($sql);


So funzt es 100 pro ;)

Xerxes
05-12-2002, 20:55
ich ist aber langsamer, als sich die db-klasse immer mit global $db; (oder wie auch immer das objekt gerade heißt) rein zu holen.
nach deiner methode wird nämlich eine kopie des objektes erstellt (eigentlich sogar zweimal: einmal beim call-by-value-aufruf des konstruktors und dann im kopierbefehl selbst nochmal).
wenn man sich die datenbank-klasse in den benötigen funktionen per global sichtbar macht, wird keien kopie erstellt. das bringt besseren und schnelleren code. :)

mehlvogel
05-12-2002, 21:08
Ja, ein Call - by - Reference Aufruf wäre praktisch. Geht das in PHP? Ich streube mich immer ein wenig gegen globale Variablen - weil dieser in den meisten Fällen mehr negatives als positives ansich haben.

Xerxes
05-12-2002, 21:26
na in diesem fall aber nicht. ;)

call by reference geht noch nicht ganz so, wie in c, aber ein wenig schon.
http://www.dclp-faq.de/q/q-php-variablen.html
hier schön lesen. (am besten die ganze seite, da sind überall schöne nette tipps versteckt, wie man sauber programmiert. :)

mehlvogel
09-12-2002, 09:13
Naja, das greift auch wieder nur auf Globale Variablen zurück... wie gesagt, ich bin von den Dingern kein Freund - weil das für mich "unsauber" ist. Aber nun gut, lässt sich wahrscheinlich nicht eleganter lösen - man muss wohl auf die neue PHP (bzw neue Zend Engine) warten.