Richtige Verwendung der DB

rethus
Beiträge: 1851
Registriert: Di 28. Mär 2006, 11:55
Wohnort: Mönchengladbach
Kontaktdaten:

Richtige Verwendung der DB

Beitrag von rethus »

Ich habe nun öfter hier gesehen, das einige Module so programmiert sind, das normale SQL-Statements genutzt werden, um ddie Verbindung zu Datenbank aufzubauen etc.

Soweit ich es aber sehen konnte gibt es ja da auch in Klassen geschachtelte Funktionen.

Kann hier jemand kurz einen Hinweis geben, wie man für ein Modul - sauber im Contenido-Style" ne Datenbank-Verbindung aufbaut, eine Abfrage erstellt und die Datenbankverbindung wieder schließt?

Ideal wäre auch ein Hinweis wo man sich über die verwendbaren DB-Funktionen informieren kann.

Den Umstand in einem Modul den Benutzernamen und Passwort der DB unterzubringen finde ich nicht sauber, und es gibt ja schließlich andere Möglichkeiten.
MichFress
Beiträge: 750
Registriert: Mo 5. Jan 2004, 22:32
Wohnort: Bochum
Kontaktdaten:

Beitrag von MichFress »

im Wesentlichen ist es wohl dieses hier:

Code: Alles auswählen

$db = new DB_Contenido;
$query = "SELECT * FROM ".$cfg['tab']['tabelle']."";
$db->query($query):
$wieviel = $db->numRows();

while($db->next_record()){
  echo $db->f("spaltenname");
  //alternativ:
  $arr =  $db->copyResultToArray();
}
Ein Blick die Module des Beispielmandanten empfiehlt sich zudem...

EDIT: hab das copyResult... mal mit aufgenommen
Zuletzt geändert von MichFress am Di 10. Jul 2007, 13:50, insgesamt 1-mal geändert.
"Es wird keine Handlung geben, keine Geschichte mit ihrer Versprechung auf einen Anfang und ihrer Hoffnung auf ein Ende." (Andrzej Stasiuk)
Dodger77
Beiträge: 3626
Registriert: Di 12. Okt 2004, 20:00
Wohnort: Voerde (Niederrhein)
Kontaktdaten:

Beitrag von Dodger77 »

Einfach geht das über das DB-Objekt, ungefähr so:

Code: Alles auswählen

// Wenn kein DB-Objekt zur Verfügung steht, ein neues erzeugen.
// Um den Aufbau der Verbindung muss man sich nicht gesondert 
// kümmern.
if ( !is_object($db) ) {
        $db = new DB_Contenido;
}

// SQL Abfrage bauen
$sql = "SELECT * FROM ".$cfg["tab"]["cat"]." WHERE 1 = 1";

// SQL-Abfrage ausführen
$db->query($sql);

// Ergebnisse der Abfrage durchlaufen
while ($db->next_record()) {

  // Jeweils die idcat ausgeben.
  echo $db->f('idcat');

}
Ein Blick in die Datei "/conlib/db_mysql.inc" sollte die weiteren Möglichkeiten auszeigen.

EDIT: MichFress war schneller. :(
Zuletzt geändert von Dodger77 am Mi 11. Jul 2007, 09:40, insgesamt 1-mal geändert.
rethus
Beiträge: 1851
Registriert: Di 28. Mär 2006, 11:55
Wohnort: Mönchengladbach
Kontaktdaten:

Beitrag von rethus »

Danke Leute, das war super schnell :-)
rethus
Beiträge: 1851
Registriert: Di 28. Mär 2006, 11:55
Wohnort: Mönchengladbach
Kontaktdaten:

Beitrag von rethus »

Hab mal unter conlib in die mysql.inc reingeschaut, aber ich hab keine möglichkeit gefunden, das Ergebnis als array oder kompletten result zurückzugeben.

Ich nutze bei normalen SQL-Kommandos gerne

Code: Alles auswählen

while($row =mysql_fetch_array_result)
{
    echo $row['titel']."-".$row['text'];
}
Dodger77
Beiträge: 3626
Registriert: Di 12. Okt 2004, 20:00
Wohnort: Voerde (Niederrhein)
Kontaktdaten:

Beitrag von Dodger77 »

rethus
Beiträge: 1851
Registriert: Di 28. Mär 2006, 11:55
Wohnort: Mönchengladbach
Kontaktdaten:

Beitrag von rethus »

Danke für den Tipp,
aber gibts da nicht einen Ersatz für:

Code: Alles auswählen

while($row= mysql_fetch_array($result))
{
    echo $row[0].$row[1];
}
Wenn ich nämlich $db->$db->copyResultToArray() nutze, muss ich ja immer ne foreach-schleife proggen, und das ist ja umständlicher, als der normale mysql_fetch_array()-Befehl.

Ich finde es fehlt in der DB-Klasse ne funktion, die den kompletten query-Result zurückgibt, damit man AUCH mysql-standartfunktionen wie mysql_fetch_array, mysql_fetch_object etc. nutzen kann.

Was haltet Ihr davon?

Würde ja schon reichen, wenn $db->query anstatt die Query_ID den Result zurückgibt.

Um beides zu haben könnte man ja eine optionale Parameterübergabe machen, dass wenn der 2. Parameter bei $db->query() 1 ist, dass dann anstatt die Query_ID der Result zurückgegeben wird, oder?
rethus
Beiträge: 1851
Registriert: Di 28. Mär 2006, 11:55
Wohnort: Mönchengladbach
Kontaktdaten:

Beitrag von rethus »

Hab selbst ne Lösung gefunden... der Result wird über die Funktion query_id() zurückgegeben.

Damit geht das nutzen normaler mysql-funktionen z.B. so:

Code: Alles auswählen

$db->query($sql);
while($row = mysql_fetch_array($db->query_id()))
{
print_r($row);	
}
Dodger77
Beiträge: 3626
Registriert: Di 12. Okt 2004, 20:00
Wohnort: Voerde (Niederrhein)
Kontaktdaten:

Beitrag von Dodger77 »

Folgendes macht doch in etwa das Gleiche:

Code: Alles auswählen

while ($db->next_record()) {

  print_r($db->Record);

} 
rethus
Beiträge: 1851
Registriert: Di 28. Mär 2006, 11:55
Wohnort: Mönchengladbach
Kontaktdaten:

Beitrag von rethus »

Ja super, das sieht auch viel sauberer aus, denn bei meinem mysql_fetch_array oben gibt es im backend immer eine Fehlermeldung.

So klappt es wunderbar.

Danke
rethus
Beiträge: 1851
Registriert: Di 28. Mär 2006, 11:55
Wohnort: Mönchengladbach
Kontaktdaten:

Beitrag von rethus »

Kommando zurück! Ist doch nicht was ich brauche.

Wobei gerade als ich es jetzt anwenden möchte, sehe ich dass es nicht das gleiche ist.

Bei meinem Beispiel oben kann ich innerhalb der While-Schleife direkt auf $row[0] oder $row['titel'] zugreifen.

Dein Beispiel oben gibt den NUR gesamten Array aus, dort kann ich nicht auf die einzelnen Schlüssel zugreifen.
Sinn und zweck ist ja, das solange mysql_fetch_array daten bekommt die Schleife ausgeführt wird, und auf die Inhalte von $row DIREKT zugegriffen werden kann.

PS: den Error den ich beschrieben habe für den Backendbereich resultiert daraus, das die übergebene ID fehlt :-) also scheint meine Lösung vorab doch die praktikabelste zu sein...
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

rethus hat geschrieben:Bei meinem Beispiel oben kann ich innerhalb der While-Schleife direkt auf $row[0] oder $row['titel'] zugreifen.

Dein Beispiel oben gibt den NUR gesamten Array aus, dort kann ich nicht auf die einzelnen Schlüssel zugreifen.
ähm, dann schreib den code doch etwas um so das es funktioniert...

Code: Alles auswählen

while ($db->next_record()) { 

  $row = $db->Record;
  echo $row[0];

} 
*** make your own tools (wishlist :: thx)
Dodger77
Beiträge: 3626
Registriert: Di 12. Okt 2004, 20:00
Wohnort: Voerde (Niederrhein)
Kontaktdaten:

Beitrag von Dodger77 »

Klar, kann man da direkt drauf zugreifen. Wenn du das Array mit print_r() ausgeben lassen kannst, dann kannst du auch drauf zugreifen, z.B.:

Code: Alles auswählen

// SQL-Abfrage ausführen
$db->query($sql);

// Ergebnisse der Abfrage durchlaufen
while ($db->next_record()) {

  // per Index auf die Ergebnisse zugreifen
  echo $db->Record[0] . " " . $db->Record[1];

  // per Feldtitel auf die Ergebnisse zugreifen
  echo $db->Record['feld1'] . " " . $db->Record['feld2'];

} 
rethus
Beiträge: 1851
Registriert: Di 28. Mär 2006, 11:55
Wohnort: Mönchengladbach
Kontaktdaten:

Beitrag von rethus »

Ahhhhh sorry :oops:
Ich stand auf der Leitung... wird Zeit für ein kleines Päuschen 8)

Ich war irgendwie der Meinung, das $db->Record eine Funktion anspricht, wobei er ja auf eine Variable in der Klasse weist.

Ist doch was dran, das man beim Coden mindestens jede 45 Min 10 Min. Pause machen sollte :!:
rethus
Beiträge: 1851
Registriert: Di 28. Mär 2006, 11:55
Wohnort: Mönchengladbach
Kontaktdaten:

Beitrag von rethus »

Kann mir jemand einen kurzen Tipp geben, wie ich eine andere Datenbank über die Contenido-Funktion - beispielsweise als "$db1" ansprechen kann?

ich dachte da an:
if ( !is_object($db1) ) {
$db1 = new DB_Contenido;
}
Aber wo sage ich Ihm, welche Datenbank er nehmen soll?
Could I help you... you can help me... buy me a coffee . (vielen ❤ Dank an: Seelauer, Peanut, fauxxami )

xstable.com: - HighSpeed Hosting, Domains, DomainReselling, Linux-Administration
suther.de: - App-Programierung, High-Performance-Webpages, MicroServices, API-Anbindungen & Erstellung

Software... ein Blick wert: GoogleCalender Eventlist, xst_dynamic_contentType
Gesperrt