Nach neu laden der Seite keine Verbindung zu DB?

Nach neu laden der Seite keine Verbindung zu DB?

am 20.07.2006 16:33:36 von Bernhard Schimanski

Hallo NG,

habe zwei Klasse in eine php Datei aufgerufen, die unabhängig von sich
arbeiten, also drei Dateien.

Die erste Klasse "klasse1" liest z.B. alle Autoren aus der DB, die
zweite Klasse "klasse2", alle Titel, die die Autoren schon
geschirieben habe, diese werden in eine Auswahlliste angezeigt.
Schreibe die erste Klasse ein neuen Eintrag in die DB und ruft die
Seite erneut auf, "steigt" die Klasse "klasse2" aus mit folgender Meldung:

Warning: mssql_select_db() [function.mssql-select-db]: Unable to
select database: DBName in

Zu der Struktur der Klassen.
Ich habe eine extra Klasse geschrieben, die nur sich um die Verbindung
zu Datenbank kümmert, diese Klasse ist in den Klassen "klasse1",
"klasse2" eingebunden, dann noch zusätzlich eine Klasse, in der alle
Tabellen Namen und spalten Namen mit "const" definiert sind, diese
Klasse ist ebenfalls in den Klassen "klasse1", "klasse2" eingebunden,
alle per "require_once".
In den beiden Klassen "klasse1", "klasse2" wird die Datenbank Klasse
und Tabellen Klasse im Konstruktor aufgerufen.
Auf die Variablen der Datenbank Klasse greife ich per
"DBKlasse::VaraiblenName".

In der php Datei habe ich sie per:
- require_once
- require
- include
- include_once
nichts geholfen.

Was ist die Ursache, der unterbrochenen Verbindung?

Danke im Voraus.

Grüße Bernhard

Re: Nach neu laden der Seite keine Verbindung zu DB?

am 20.07.2006 17:08:37 von thornythegod

Bernhard Schimanski schrieb:

> Was ist die Ursache, der unterbrochenen Verbindung?

Was ist der Code, welcher das verursacht?
Warum glaubst du, dass es war mit require/include zu tun hat?
Ist die DB wirklich da?
Was sagt mysql_error()?

Gruß,
Torsten

Re: Nach neu laden der Seite keine Verbindung zu DB?

am 20.07.2006 17:26:43 von Bernhard Schimanski

Torsten Zühlsdorff schrieb:

> Was ist der Code, welcher das verursacht?
Von meiner Seite nur eine Vermutung, also wenn die "klasse1" die Daten
in die DB schreibt ist die Verbindung zu der DB noch offen, danach
wird sofort die "klasse2" aufgerufen, da die Verbindung zu der DB noch
steht, kann die "klasse2" die DB nicht finden.
Die "klasse2" wird als zweite eingebunden.

> Warum glaubst du, dass es war mit require/include zu tun hat?
Nur eine Vermutung

> Ist die DB wirklich da?
Ja Die DB ist wirklich da, denn beim ersten Aufruf der php Seiten wird
die DB schon abgefragt.
> Was sagt mysql_error()?
Verwende MSSQL.

Habe schon mit "mssql_pconnect" versucht, kein Erfolg.

Grüße Bernhard

Re: Nach neu laden der Seite keine Verbindung zu DB?

am 21.07.2006 10:48:45 von thornythegod

Bernhard Schimanski schrieb:

>> Was ist der Code, welcher das verursacht?
>
> Von meiner Seite nur eine Vermutung, also wenn die "klasse1" die Daten
> in die DB schreibt ist die Verbindung zu der DB noch offen, danach wird
> sofort die "klasse2" aufgerufen, da die Verbindung zu der DB noch steht,
> kann die "klasse2" die DB nicht finden.
> Die "klasse2" wird als zweite eingebunden.

Das ist absolut keine Antwort auf meine Frage. Außerdem schriebst du:
"In den beiden Klassen "klasse1", "klasse2" wird die Datenbank Klasse
und Tabellen Klasse im Konstruktor aufgerufen". Liegt es am Konstruktor?
Verwendest du einen Singleton?
Wie um alles in der Welt sollen wir wissen, was du machst? Vermutlich
ist dein Code oder dein Design kaputt. Meine Glaskugel ist es auf alle
Fälle ;)

>> Warum glaubst du, dass es war mit require/include zu tun hat?
>
> Nur eine Vermutung

Möglich, aber abwegig, da alles das nichts mit Datenbanken zu tun hat.
Dann würde die Fehlermeldung postulieren, dass eine Methode, ein Objekt
oder eine Datei nicht gefunden bzw. instanziert werden kann.

>> Ist die DB wirklich da?
>
> Ja Die DB ist wirklich da, denn beim ersten Aufruf der php Seiten wird
> die DB schon abgefragt.

Code für die DB-Verbindungsverwaltung? Wenn du die DB jeweils im
Konstruktor aufrufst, baut sie dann auch jedesmal eine neue Verbindung
auf? Gibt es einen Destructor?

>> Was sagt mysql_error()?
>
> Verwende MSSQL.

Selbst Schuld :P
Kannst du kein PDO nehmen und schauen ob dieses eine Fehlermeldung
zurückliefert?

Gruß,
Torsten

Re: Nach neu laden der Seite keine Verbindung zu DB?

am 21.07.2006 15:22:00 von Bernhard Schimanski

Torsten Zühlsdorff schrieb:

>>> Was ist der Code, welcher das verursacht?

Die Datenbank Klasse, die die Verbindung zu der DB aufbaut(insgesammt
vier Dateien, etwas lang).



require_once ("class\klasse1.class.php");
require_once ("class\klasse2.class.php");

$k1 = new klass1();
$k2 = new klass2();

if( isset($_POST["Save") )
{
$k1 = SetInsertDaten( $_POST["vName"], $_POST["vAnzahl"]);
}

/*
Beim erstem Aufruf geht alle glan, werden die Daten über ein Formular
geschick, dh. die Seite wird das zweite Mal aufgerufen
kommte die Fehler Meldung, die gleiche Datenbank soll das zweite Mal
ausgelsene werden von den zwei gleichen Klassen.
*/

$getAlle = $k2->GetAlleS();
$getTreffer =$k2->GetAnzahlTreffer();
?>


















NameElemente AnzahlAngaben












require_once ("DB_Zugang.class.php");
require_once ("DBatenBankFelder.class.php");


class klasse2
{
private $db;

function klasse2() {
$this->db = new dbccess();
$this->db->db_Connect();
}

public function GetAnzahlDerDaten() {
$query = "SELECT " . DBatenBankFelder :: aNr . " FROM " .
DBatenBankFelder :: TAB_ARTdarwn;
$this->db->db_Query($query);
$n = $this->db->db_GetNumRows();
if ($n > 0) {
$this->db->db_close();
return $n;
} else {
$this->db->db_close();
return -1;
}
}

public function GetAlleS() {
$query = "SELECT " . DBatenBankFelder ::sNr . ", " .
DBatenBankFelder ::spName;
$query .= " FROM " . DBatenBankFelder ::TAB_ARTdarwn;
$this->db->db_Query($query);
if ( $this->db->db_GetNumRows() > 0) {
$result = array ();
while ($row = $this->db->db_GetRowFetchArray() )
{
$result[] = $row;
}
$this->db->db_close();
return $result;
} else {
$this->db->db_close();
return -1;
}
}
}
?>


require_once ("DB_Zugang.class.php");
require_once ("DBatenBankFelder.class.php");


class klasse1
{
private $db;

public function klasse1()
{
$this->db = new dbccess();
$this->db->db_Connect();
}

public function GetAnzahlTreffer()
{
$query = "SELECT " . DBatenBankFelder::spalte_Nr . " FROM " .
DBatenBankFelder :: TAB_tab1;
$this->db->db_Query($query);
$n = $this->db->db_GetNumRows();
if ($n > 0) {
$this->db->db_close();
return $n;
} else {
$this->db->db_close();
return -1;
}
}
public function SetInsertDaten($name, $ElementeZahl)
{
$query = "INSERT INTO " . DBatenBankFelder ::TAB_tab1 . " ( " ;
$query.= DBatenBankFelder::vName .", " . DBatenBankFelder::vElement;
$query.= ") VALUES (";
$query.= "'" . $nme . "', '" . $ElementeZahl . "')";
$query.= " SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY] SELECT
@@IDENTITY AS [@@IDENTITY] ";
$this->db->db_Query( $query );
$row = $this->db->db_GetRowFetchArray( );
$this->db->db_close();
return $row[0];
}
}
?>



class DBZugang
{
private $ConnectionID = -1;
private $QueryID;
public $ConnectionData = false;

private $query;

private $NumFields;
private $NumRows;


public function DBZugang()
{

$this->DatabaseServer = "ServerID";
$this->DatabaseName = "DbName";
$this->DatabaseUser = "myUser";
$this->DatabasePasswd = "myPwd";
$this->ConnectionData = true;
}

//Get Connection
public function db_Verbinudng()
{
if($this->ConnectionData)
{
$this->ConnectionID = mssql_pconnect($this->DatabaseServer,
$this->DatabaseUser, $this->DatabasePasswd);
mssql_select_db($this->DatabaseName, $this->ConnectionID) or
die("Keine Verbindung.");
return true;
}
else
{
return false;
}
}

//Send Query
public function db_Query($q)
{
$this->query=$q;
#echo "q: ".$q."
";
#Returns:
#1 = Erfolg
#-1 = Query Fehlgeschlagen
#-2 = Keine Datenbankverbindung
if (isset($this->ConnectionID))
{
$this->QueryID = mssql_query($this->query,$this->ConnectionID);

if(isset($this->QueryID))
{
$this->NumFields=@mssql_num_fields($this->QueryID);
$this->NumRows=@mssql_num_rows($this->QueryID);
return 1;
}
return -1;
}
return -2;
}

//Get numrows:
public function db_NumRows()
{
if(isset($this->QueryID))
{
return $this->NumRows;
}
else
{
return -1;
}

}

public function db_GetNextRow()
{
if (isset ($this->ConnectionID))
{
return mssql_fetch_row($this->QueryID);
}
return false;

}

public function db_GetRowAssoc($rownumber)
{
if (isset ($this->ConnectionID))
{
mssql_data_seek($this->QueryID,$rownumber);
return mssql_fetch_assoc($this->QueryID);
}
return false;

}

public function db_GetNextRowAssoc()
{
if (isset ($this->ConnectionID))
{
return mssql_fetch_assoc($this->QueryID);
}
return false;

}

public function db_GetRowFetchArray()
{
if ( isset( $this->ConnectionID) )
{
return mssql_fetch_array( $this->QueryID );
}
return false;
}


/** Close Connection */
public function db_close()
{
if ( isset($this->ConnectionID) )
{
mssql_close($this->ConnectionID);
}
}
}
?>

> Kannst du kein PDO nehmen und schauen ob dieses eine Fehlermeldung
> zurückliefert?
Was ist ein PDO?

Grüße Bernhard

Re: Nach neu laden der Seite keine Verbindung zu DB?

am 21.07.2006 16:15:09 von thornythegod

Bernhard Schimanski schrieb:

>>>> Was ist der Code, welcher das verursacht?
>
> Die Datenbank Klasse, die die Verbindung zu der DB aufbaut(insgesammt
> vier Dateien, etwas lang).

Und ein wenig unübersichtlich. Hast du da ernsthaft klasse1 als
Klassenname verwendet?

> > require_once ("class\klasse1.class.php");
> require_once ("class\klasse2.class.php");
>
> $k1 = new klass1();
> $k2 = new klass2();
>
> if( isset($_POST["Save") )
> {
> $k1 = SetInsertDaten( $_POST["vName"], $_POST["vAnzahl"]);
> }

Irgendwie erscheint mir die Syntax seltsam. Warum nicht
$k1->SetInsertDaten( $_POST["vName"], $_POST["vAnzahl"]);

> /*
> Beim erstem Aufruf geht alle glan, werden die Daten über ein Formular
> geschick, dh. die Seite wird das zweite Mal aufgerufen
> kommte die Fehler Meldung, die gleiche Datenbank soll das zweite Mal
> ausgelsene werden von den zwei gleichen Klassen.
> */
>
> $getAlle = $k2->GetAlleS();
> $getTreffer =$k2->GetAnzahlTreffer();
> ?>

Wenn ich deine Klassen überfliege, sollte das schon nicht klappen, da du
aus unerfindlichen Gründen, die Datenbankverbindung (scheinbar) im
Konstruktor öffnest und nach der Abfrage wieder schließt. Ein zweites
Query würde an der geschlossenen Verbindung scheitern.

> > require_once ("DB_Zugang.class.php");
> require_once ("DBatenBankFelder.class.php");
>
>
> class klasse2
> {
> private $db;
>
> function klasse2() {
> $this->db = new dbccess();
> $this->db->db_Connect();
> }
>
> public function GetAnzahlDerDaten() {

[wird bei Bedarf gelesen]

Im übrigen vermischt du die Schreibweisen von PHP4 und PHP5. In PHP4
mußte der Konstruktor dem Klassennamen entsprechen. In PHP5 gibt es
dafür die Methode __construct(). Auch __destruct() wurde eingeführt.

Was macht dbccess? Warum schließt du nach jedem Query die Verbindung?

>> Kannst du kein PDO nehmen und schauen ob dieses eine Fehlermeldung
>> zurückliefert?
>
> Was ist ein PDO?

Ein Datenbanklayer von PHP. Gibt es seid Version 5.1 und sollte meiner
Meinung nach verwendet werden, sobald es möglich ist. Siehe auch:
http://www.php.net/pdo

Gruß,
Torsten

Re: Nach neu laden der Seite keine Verbindung zu DB?

am 21.07.2006 16:34:34 von Bernhard Schimanski

Torsten Zühlsdorff schrieb:

> Und ein wenig unübersichtlich. Hast du da ernsthaft klasse1 als
> Klassenname verwendet?
Nein, in Projekt heißen sie anders.


>> >> require_once ("class\klasse1.class.php");
>> require_once ("class\klasse2.class.php");
>>
>> $k1 = new klass1();
>> $k2 = new klass2();
>>
>> if( isset($_POST["Save") )
>> {
>> $k1 = SetInsertDaten( $_POST["vName"], $_POST["vAnzahl"]);
>> }
>
> Irgendwie erscheint mir die Syntax seltsam. Warum nicht
> $k1->SetInsertDaten( $_POST["vName"], $_POST["vAnzahl"]);
Bitte Erklärung, für Vorschläge bin ich offen.

> Wenn ich deine Klassen überfliege, sollte das schon nicht klappen, da du
> aus unerfindlichen Gründen, die Datenbankverbindung (scheinbar) im
> Konstruktor öffnest und nach der Abfrage wieder schließt. Ein zweites
> Query würde an der geschlossenen Verbindung scheitern.
:-( zu mindestens kann ich jetzt den Fehler eingrenzen, das öffnen der
Datenbank soll beim einlogen des Users statt finden und schließe beim
auslogen ? Oder in jeder Methode ? Was meinst Du?

> [wird bei Bedarf gelesen]
>
> Im übrigen vermischt du die Schreibweisen von PHP4 und PHP5. In PHP4
> mußte der Konstruktor dem Klassennamen entsprechen. In PHP5 gibt es
> dafür die Methode __construct(). Auch __destruct() wurde eingeführt.

In letzte Zeit habe ich nicht viel mit php gemacht, meine letzte
Scripte waren noch in php 4, ich muss mir noch ein Buch über php 5
besorgen.
Danke für Tipp.

>
> Was macht dbccess? Warum schließt du nach jedem Query die Verbindung?
alte Gewohneit, in php 4 habe ich in jeder Methode die Verbindung
geöffnet und am Ende der Methode wider geschlossen.

> Ein Datenbanklayer von PHP. Gibt es seid Version 5.1 und sollte meiner
> Meinung nach verwendet werden, sobald es möglich ist. Siehe auch:
> http://www.php.net/pdo
Danke für den Tipp und für die schnelle Antwort.

Grüße Bernhard

Re: Nach neu laden der Seite keine Verbindung zu DB?

am 22.07.2006 02:37:12 von Frank Schenk

Bernhard Schimanski schrieb:
> :-( zu mindestens kann ich jetzt den Fehler eingrenzen, das öffnen der
> Datenbank soll beim einlogen des Users statt finden und schließe beim
> auslogen ? Oder in jeder Methode ? Was meinst Du?

Das ist zwar furchtbar zu lesen aber ich antworte trotzdem.

Du musst jedesmal, wenn das Script vom Surfer aufgerufen wird, die
Datenbankverbindung herstellen und die Datenbank wählen. Du musst nicht,
nach jedem Query die Verbindung schließen. Darüber kannst du nachdenken,
wenn du 1000 Queries die Sekunde hast. Ansonsten verbrät es nur CPU
Leistung und IO Leistung, weil jedesmal die Verbindung hergestellt und
das Protokoll initialisiert werden muss.

gruß, Frank