Kleine SQL-Abfrage einfügen

Gesperrt
milsa
Beiträge: 7
Registriert: So 22. Jun 2008, 20:07
Kontaktdaten:

Kleine SQL-Abfrage einfügen

Beitrag von milsa »

Mahlzeit,

ich habe einen kleinen Terminkalender für ein Projekt programmiert, der unabhängig von Contenido läuft. Allerdings möchte ich jetzt im Content eine Abfrage einfügen, die die Daten aus der DB liest. Ich habe bisher noch keine Ahnung davon, wie man eigene Module in Contenido einfügt. Das wäre quasi der erste Schritt :wink:

Ich möchte nur ein Einfaches Modul haben, mit dem ich die SQL-Abfrage ausgeben kann. Wie muss ich da vorgehen?

Vielen Dank schon mal im Voraus
GaMbIt_
Beiträge: 674
Registriert: Do 16. Mär 2006, 16:17
Kontaktdaten:

Beitrag von GaMbIt_ »

Wo liegt denn die Tabelle??

ich würde die DB Klasse von Contenido verwenden und die Tabelle ins Contenido Config Array einfügen...

und dann ein Modul erstellen dass die Datenbankinhalte ausliest und in den Content ausgibt.
milsa
Beiträge: 7
Registriert: So 22. Jun 2008, 20:07
Kontaktdaten:

Beitrag von milsa »

Die Tabelle liegt in der DB, in der auch Contenido installiert wurde.

Wie heißt denn die DB Klasse von Contenido und das Contenido Config Array?? Wie gesagt, ich kenn mich damit absolut nicht aus.

Hast du vllt. mal ein Beispiel??
GaMbIt_
Beiträge: 674
Registriert: Do 16. Mär 2006, 16:17
Kontaktdaten:

Beitrag von GaMbIt_ »

Na dann gehen wirs mal an ;)

Keine Garantie auf Richtigkeit...

Hier kann ich auch glaich mal ein Modul von mir posten.. (ich Angeber)
Das ist ein umgebautes Imagemodul vom Timo A. Hummel ... und nicht fertig... und auch fehlerhaft... also nur eine Hälfte von der Funktion fertig... und auch sonst nicht wirklich ausgereift...
:lol:

Mit dieser Zeile werden die Grafikfunktionen von Contenido inkludiert.
Die Datei findet man im Verzeichnis "contenido/includes/"

Code: Alles auswählen

cInclude("includes", "functions.api.images.php");
Aber nun mal zum Datenbankzeugs...

Code: Alles auswählen

$query= "SELECT description FROM " . $cfg["tab"]["upl"] . " WHERE idupl = " . $idupl;
Hier wird die Variable $query befüllt, die enthält Dein Datenbankscript...

Das Array

Code: Alles auswählen

$cfg["tab"]["upl"]
definiert die Tabellennamen... lass Dir mit einem

Code: Alles auswählen

var_dump($cfg["tab"]);
einfach mal den Inhalt ausgeben... Diese Config dient unter anderem dazu verschiedene Tabellenpräfixe verwenden zu können ohne seine DB Scripte anpassen zu müssen...
Du kannst dann im Modulinput theoretisch das Array um Deine eigene Tabelle erweitern.. IMHO würde es aber mehr Sinn machen das im Modul zu dokumentieren und die Contenido Config abzuändern damit diese Tabelle auch anderen Modulen zur Verfügung steht...


Und hier wird das SQL Statement ausgeführt...

Code: Alles auswählen

    $db->query($query);
    if ($db->next_record()) {
#        return htmlspecialchars(urldecode($db->f("description")));
        return array("desc"  => htmlspecialchars(urldecode($db->f("description"))),
                     "media" => htmlspecialchars(urldecode($db->f("medianame")))
                     );
    } else {
        return '';
    }
mit

Code: Alles auswählen

$db -> query($query);
schickst Du das Statement ab...
anscheinend hab ich vergessen eine Instanz der Klasse zu generieren... das tut man mit

Code: Alles auswählen

$db = new DB_Contenido;
danach kann man z.B. mit
$db->next_record()
durch die einzelnen Records des Recordsets laufen und z.B. ein Array befüllen oder gleich eine Ausgabe generieren.

Ich glaube dass da die PEAR Datenbankklassen erweitert wurden...
einfach mal in der Doku suchen... oder hier -> Contenido FAQ

Code: Alles auswählen

<?php
/* DEBUG AUSGABE */
$cfg["debug"]["codeoutput"] = false;

/***********************************************
* Piclist
*
* Author      :     Christian Mueller
* Copyright   :     impigra media
* Created     :     05-09-2008
* Modified    :     05-09-2008
************************************************/

cInclude("includes", "functions.api.images.php");

/* Gallery variables */
$bRecursive= false;

/* erlaubte Dateiendungen */
$aValidExtensions= array (
    "jpg",
    "jpeg",
    "gif",
    "png"
);

/* Breite und Höhe definieren */
$iWidth= "CMS_VALUE[0]";
$iHeight= "CMS_VALUE[1]";

if ($iWidth == 0) {
    $iWidth= 600;
}

if ($iHeight == 0) {
    $iHeight= 600;
}

$sPath= "CMS_VALUE[5]";
if ($sPath == '') {
    $sPath= $cfgClient[$client]["path"]["frontend"] . $cfgClient[$client]["upl"]["frontendpath"] . "bildergalerie/";
} else {
    $sPath= $cfgClient[$client]["path"]["frontend"] . $cfgClient[$client]["upl"]["frontendpath"] . "CMS_VALUE[5]";
}



    /* Read all gallery files */
    $aGalleryFiles= scanDirectory($sPath, $bRecursive);
    /* Array sortieren */
    asort($aGalleryFiles);
    
#    var_dump($aGalleryFiles);

/* wenn Files vorhanden */
if (is_array($aGalleryFiles)) {

/* Filtern von "Nicht Bildern" */
        foreach ($aGalleryFiles as $key => $aGalleryFile) {
            $sExtension= strtolower(getFileExtension($aGalleryFile));

            if (!in_array($sExtension, $aValidExtensions)) {
                unset ($aGalleryFiles[$key]);
            }
        }

/* Output vor der Galerie */
echo'    <div id="imageflow" style="margin:0px; width:80%; text-align:center; position: relative;">';
echo'        <div id="loading_bar" style="border:0px solid red; margin:170px 0px 0px 0px; text-align:center;">';
echo'            <b>Bilder werden geladen</b><br/>';
echo'            <img src="images/loading.gif" width="208" height="13" alt="loading" />';
echo'        </div>';
echo'        <div id="images" style="border:0px solid red; width:100%; ">';






/* durch das Bilderarray rattern... */

        foreach ($aGalleryFiles as $sImage) {

            $sDownloadImage= str_replace($cfgClient[$client]['path']['frontend'], '', $sImage);

            /* Do Scaling */
            $sScaledImage= cApiImgScale($sImage, $iWidth, $iHeight);

            $link= 'front_content.php?idcatart=' . $idcatart . '&start=' . $_REQUEST['start'] . '&view=' . urlencode(str_replace($cfgClient[$client]['path']['frontend'], '', $sImage));
            /* Beschreibung abholen */
            $description= pl_getImageDescription($sImage);
            /* falls Beschreibung leer */
            if ($description['desc'] == '') {
                $description['desc']= '&nbsp;';
            }
            if ($description['media'] == '') {
                $description['media']= '&nbsp;';
            }
            
            /* Download Link des Bildes */
            $download_link= str_replace($cfgClient[$client]['path']['frontend'], $cfgClient[$client]['path']['htmlpath'], $sImage);
            /* Dateigröße des Bildes (DEBUG) */
           # $download_size= ig_GetReadableFileSize($sImage);


/* OUTPUT Generating */
# echo '<p>' . $sDownloadImage . '<br /><img src="' . $sScaledImage . '" /><br />' . $link . '<br />Medienname' . $description['media'] . '<br />Description' . $description['desc'] . '<br />' . $download_link . '</p><hr />';

echo '<img src="' . $sScaledImage . '" longdesc="javascript:myLightbox.start(\'' . $sScaledImage . '\');" alt="' . $description['media'] . '" />';
            

        }

/* ### */

}


/* Output nach der Galerie */
echo'</div>';
echo'        <div id="captions"></div>';
echo'        <div id="scrollbar">';
echo'            <div id="slider"></div>';
echo'        </div>';
echo'    </div>';




/* DEBUG Ausgabe */
#    var_dump($aGalleryFiles);


/**
 * pl_getImageDescription
 * @author Christian Müller
 * @param string $idupl Upload ID string || numeric
 * @return array 
 *
 * Funktion aus der Picture_Gallery abgeleitet
 * Diese Funktion soll die Bildbeschreibungen zum aufgerufenen Bild auslesen
 * bis jetzt sind Medienname und Beschreibung verfügbar.
 */


/* Funktion zum Auslesen des Mediennamens */

function pl_getImageDescription($idupl) {

    global $cfg, $cfgClient, $db, $client, $lang;

    $cApiClient= new cApiClient($client);
    $language_separator= $cApiClient->getProperty('language', 'separator');
    if ($language_separator == "") {
        //Sanity, if module used in client without set client setting
        $language_separator= "§§§";
        $cApiClient->setProperty('language', 'separator', $language_separator);
    }
    if (is_numeric($idupl)) {
        //ID is a number 
        $query= "SELECT description FROM " . $cfg["tab"]["upl"] . " WHERE idupl = " . $idupl;
    } else {
        //ID is a string
        $path_parts= pathinfo($idupl);
        $upload= $cfgClient[$client]['upl']['frontendpath'];
        $len= strlen($upload);
        $pos= strpos($idupl, $upload);
        $dirname= substr($path_parts['dirname'], $pos + $len) . '/';
#        $query= "SELECT description FROM " . $cfg["tab"]["upl"] . " WHERE (dirname = '" . $dirname . "') AND (filename='" . $path_parts['basename'] . "') AND (filetype='" . $path_parts['extension'] . "')";
        
        $query = "SELECT u.description, m.medianame
        FROM " . $cfg["tab"]["upl"] . " u INNER JOIN " . $cfg["tab"]["upl_meta"] . " m
        ON u.idupl = m.idupl
        WHERE (u.dirname = '" . $dirname . "') AND (u.filename='" . $path_parts['basename'] . "') AND (u.filetype='" . $path_parts['extension'] . "')";

    }
    $db->query($query);
    if ($db->next_record()) {
#        return htmlspecialchars(urldecode($db->f("description")));
        return array("desc"  => htmlspecialchars(urldecode($db->f("description"))),
                     "media" => htmlspecialchars(urldecode($db->f("medianame")))
                     );
    } else {
        return '';
    }
}



?>
Zum Moduloutput...
Das ist alles noch nicht ausgegoren...
Und dieses Modul sollte mir einfach nur eine Bilderliste ausgeben damit man die mit einer schicken Javascript Galerie verbasteln kann...

Wenn interesse besteht dann veröffentliche ich das Ding wenns fertig ist...
Oldperl
Beiträge: 4316
Registriert: Do 30. Jun 2005, 22:56
Wohnort: Eltmann, Unterfranken, Bayern
Hat sich bedankt: 6 Mal
Danksagung erhalten: 4 Mal
Kontaktdaten:

Beitrag von Oldperl »

@GaMbIt_: bitte poste doch deine Module in einem eigenen thread, den hier schießt das Modul IMO etwas über das Ziel hinaus sowie am Ziel vorbei. :wink:

Contenido verwendet als DB-Layer die nun schon etwas in die Jahre gekommene PHPLIB.
Diese Lib findet man im Verzeichnis /conlib.
In der Datei prepend.php werden benötigte Klassen der Lib eingebunden und in der Datei local.php werden diese Klassen dann soweit notwendig überschrieben.

Dort wird auch die Klasse DB_Contenido, welche die Klasse DB_Sql erweitert, eingeführt.

Diese Klasse, bzw. eine Instanz davon, wird in Contenido durchgängig als Object in der Variablen $db geführt.
Diese Variable/Instanz steht dir grundsätzlich in deinen Modulkontext automatisch zur Verfügung. Trotzdem sollte man prüfen, ob diese Instanz vorhanden ist und gegebenenfalls neu Erzeugen.

Code: Alles auswählen

if(!is_object($db)) {
	$db = new DB_Contenido();
}
Benötigt man mehrer Instanzen der DB, z.B. für weitere SQL-Abfragen in Ergebnisschleifen der letzten Abfrage, so wird das allgemein durch Anhängen einer Zahl gemacht.

Code: Alles auswählen

if(!is_object($db1)) {
	$db1 = new DB_Contenido();
}
Nun kann man die Klassenfunktionen zum Abfragen bzw. Schreiben der DB nutzen.

Die Contenido eigenen Tabellennamen werden, wie von GaMbIt_ schon richtig gesagt, im $cfg-Array unter 'tab' vorgehalten. Diese sollte man im eigenen Modul nutzen, da hierbei auf den DB-Prefix geachtet wird, der ja nicht immer con_ sein muss.
Welche das sind kann man in der Datei contenido/includes/cfg_sql.inc.php nachschauen.
Benötigt man eigene Tabellen, so könnte man sie dort im entsprechenden Format eintragen, besser ist es aber, das im Modul zu machen.

Hier mal ein einfaches Beispiel:

Code: Alles auswählen

$sql = "SELECT realname, email FROM ".$cfg["tab"]["phplib_auth_user_md5"]." WHERE user_id = '".$auth->('uid')."'";
$db->query($sql);
while($db->next_record()) {
    echo "Angemeldet ist: ".$db->f('realname')."<br />Email: ".$db->f('email');
}
Bin ich im Back- oder Frontend angemeldet, wird aus der Usertabelle der reale Name und die Email des angemeldeten Users $auth->('uid') ausgelesen und angezeigt.
Auf die einzelnen Feldnamen kann über $db->f('feldname') zugegriffen werden.

Interessant ist auch noch eine von den Contenidoentwicklern implementierte Funktion $db->copyResultToArray(), die einem ein Ergebnis-Array der Abfrage liefert, welches man daher am Besten in eine Variable zur weiteren Verarbeitung speichert, Bsp.:

Code: Alles auswählen

$db->query($sql);
while($db->next_record()) {
    $meinArray = $db->copyResultToArray();
}
Soweit zur DB-Klasse in Contenido ;-)

Gruß aus Franken

Ortwin
ConLite 3.0.0-dev, alternatives und stabiles Update von Contenido 4.8.x unter PHP 8.x - Download und Repo auf Gitport.de
phpBO Search Advanced - das Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog
milsa
Beiträge: 7
Registriert: So 22. Jun 2008, 20:07
Kontaktdaten:

Beitrag von milsa »

@GaMbIt_

Danke dir vielmals!!

Habe es damit hinbekommen! Vielen vielen Dank!
GaMbIt_
Beiträge: 674
Registriert: Do 16. Mär 2006, 16:17
Kontaktdaten:

Beitrag von GaMbIt_ »

Freut mich dass ich helfen konnte...

@Oldperl
Das sollte kein "Modulpost" von mir werden...
Ich hab nur ein Modul gepostet an dem ich gerade gebastelt hab.

Deine Ausführung ist ja mal genial... hat auch mir geholfen
Danke :)

Aber eine Frage hab ich...

Wieso sollte eine zusätzliche Tabelle nicht in die Config sondern ins Modul?
Oldperl
Beiträge: 4316
Registriert: Do 30. Jun 2005, 22:56
Wohnort: Eltmann, Unterfranken, Bayern
Hat sich bedankt: 6 Mal
Danksagung erhalten: 4 Mal
Kontaktdaten:

Beitrag von Oldperl »

Danke für's Lob ;-)
GaMbIt_ hat geschrieben:Aber eine Frage hab ich...

Wieso sollte eine zusätzliche Tabelle nicht in die Config sondern ins Modul?
Dafür gibt es IMO 2 Gründe
  1. Bei einem Update von Contenido wird diese Datei überschrieben. Da ist dann eine Fehlersuche vorprogrammiert, wenn man nicht mehr weiß, das man ja an dieser Datei was geändert hat. Man sollte eigentlich grundsätzlich versuchen, an Core-Dateien keine Änderungen zu machen. Man kann (wenn nicht vorhanden, dann erzeugen) die Datei contenido/includes/config.local.php dafür benutzen, die in der contenido/includes/startup.php bei Vorhandensein includiert wird.
  2. Ich persönlich lasse meine für das Modul benötigten Konfigurationen oder benötigte DB-Tabellen gerne im Modul, so habe ich alles kompakt zusammen und kann es per XML-Paket-Funktion von Contenido auch sehr gut weitergeben.
Gruß aus Franken

Ortwin
ConLite 3.0.0-dev, alternatives und stabiles Update von Contenido 4.8.x unter PHP 8.x - Download und Repo auf Gitport.de
phpBO Search Advanced - das Suchwort-Plugin für CONTENIDO 4.9
Mein Entwickler-Blog
Gesperrt