Verschachtelte SQL-Abfragen

In diesem Forum kann man Fragen zur Programmierung stellen, die bei der Entwicklung von Mods für phpBB 3.0.x oder dem Modifizieren des eigenen Forums auftauchen.
Forumsregeln
phpBB 3.0 hat das Ende seiner Lebenszeit überschritten
phpBB 3.0 wird nicht mehr aktiv unterstützt. Insbesondere werden - auch bei Sicherheitslücken - keine Patches mehr bereitgestellt. Der Einsatz von phpBB 3.0 erfolgt daher auf eigene Gefahr. Wir empfehlen einen Umstieg auf die neuste phpBB-Version, welches aktiv weiterentwickelt wird und für welches regelmäßig Updates zur Verfügung gestellt werden.
Antworten
mps
Mitglied
Beiträge: 143
Registriert: 10.11.2013 21:02

Verschachtelte SQL-Abfragen

Beitrag von mps »

Hallo zusammen,

ich habe zwei SQL Abfragen von verschiedenen Tabellen. Die beiden Abfragen sollen ins Template gesendet werden. Das ganze sieht so aus bisher:

Code: Alles auswählen

<!-- BEGIN umfrage -->
Inhalt ... {umfrage.TITEL} .. weiterer Inhalt
Das war Teil eins. Das klappt auch alles wunderbar.

Dann kommt der zweite Teil, in dem die zweite Datenbank-Abfrage dort rein soll:

Code: Alles auswählen

<!-- BEGIN umfragepolls -->
Inhalt... {umfragepolls.AUSWAHL_ID} ... weiterer Inhalt
<!-- END umfragepolls -->
<!-- END umfrage -->
Der PHP Code ist insofern richtig, weil der Inhalt von der Abfrage mit umfragepolls auch an das Template gesendet wird (var_dump($template)) Die Abfrage und das Anzeigen im Template von der ersten Abfrage (umfrage) klappt super. Muss ich im PHP-Code irgendwie die Abfrage mit umfragepolls noch verschachteln in die Abfrage umfrage damit das so klappt?

Hier nochmal der PHP-Code (Abfrage weiter unten bei switch; Datei noch lange nicht fertig, daher noch keine Sicherheitsaspekte):

Code: Alles auswählen

<?php
/**
*
* @author Original Autor mps info@raphael-priebe.de - http://raphael-priebe.de
*
* @package {PACKAGENAME}
* @version 2.1.0
* @copyright (c) 2014 Raphael Priebe
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*
*/

/**
* @ignore
*/
// Benötigte Dateien und Variablen von phpBB
define('IN_PHPBB', true);
$phpbb_root_path = './';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
include($phpbb_root_path . 'common.' . $phpEx);


// Session auslesen und Benutzer-Informationen laden
$user->session_begin();  // Session auslesen
$auth->acl($user->data); // Benutzer-Informationen laden
$user->setup('mods/umfrage'); // Sprachvariablen aus eigener Sprach Datei laden

/*
* Nun folgt erst Dein PHP Code für die neue Seite, also:
* Variablen setzen, Datenbankabfragen, Einfügen und Entfernen von Einträgen usw...
*
* Dies ist nun ein sehr primitives Beispiel.
* Es soll nur veranschaulichen wie es funktioniert.
*
*/



//GET_VARIABLEN

$mode    = request_var('mode', '');

 $mode = isset($mode) ? $mode : 'watch';
$mode = trim($mode) == '' ? 'watch' : $mode;

$aktuelle_umfrage = $config['aktuelle_umfrage'];

/*
 * Modes:
 *
 * watch=aktuelle Umfrage ansehen (wenn bereits abgestimmt, dann ergebnisse sehen, wenn nicht, dann antwortmöglichkeiten)
 * see=aktuelle Umfrage ansehen
 * vote=aktuelle Stimme speichern (Datenbank-Update und Form-action)
 * archiv=alte umfragen ansehen
 * results=ergebnisse sehen
 */

if($mode == "watch" || $mode == "see") {
    if ($user->data['user_id'] == ANONYMOUS)
    {
       $show_result_link = true;
    } else {
    //Abfrage ob der Result-Link angezeigt werden soll
    $result = $db->sql_query("SELECT show_link FROM ". U_TABLE ." WHERE umfrage_id = '" . $config['aktuelle_umfrage'] ."';");

    while($row = $db->sql_fetchrow($result))
    {
        $showresultlink = $row['show_link'];

        if($showresultlink = 1){
            $show_result_link = true;
        }
        elseif ($showresultlink = 0){
            $show_result_link = false;
        }
        else {
            echo "Show-Result-Link enth&auml;lt einen falschen Wert! Seiten-Aufbau abgebrochen. Bitte kontaktiere einen Administrator.";
            die;
        }
    } //ENDE
}}

//Wenn Modus watch, dann soll dieser bei Gästen auf see gesetzt werden

if ($user->data['user_id'] == ANONYMOUS && $mode == "watch") {
    $mode = "see";
}
elseif ($user->data['user_id'] != ANONYMOUS && $mode ="watch") {  //Wenn Modus watch, soll bei Usern entschieden werden, ob bereits abgestimmt (MODUS RESULTS) oder noch nicht abgestimmt (MODUS SEE) worden ist

    $result = $db->sql_query("SELECT * FROM " . U_VOTES_TABLE . " WHERE umfrage_id = 1 AND user_vote = 2;");

    if (mysqli_num_rows($result) == 0) {
        $mode = "see";
        $uservoteallready = false;
    }
    elseif (mysqli_num_rows($result) >= 1) {
        $mode = "results";
        $uservoteallready = true;
    }
    else {
        echo "Es ist ein schwerwiegender Fehler aufgetreten. mysqli_num_rows sind nicht 0 oder +1, sondern:";
        $rowsnum = mysqli_num_rows($result);
        echo "$rowsnum";
        exit;
    }
} //ENDE

//GET umfrage_id wenn erforderlich

if ($mode == "see" || $mode == "results"){
    $umfrage_id = request_var('poll', 0);
    //Fülle umfrage_id wenn leer mit aktueller Umfrage

    if ($umfrage_id == "0" || $umfrage_id == ""){
        $umfrage_id = $aktuelle_umfrage;
    }
}

//ENDE
//Teste ob noch Berechtigung für "see" gegeben ist

if ($uservoteallready === true && $mode == "see" && $user->data['user_id'] != ANONYMOUS){
    $mode = "results";
    $error = "allreadyvoted";
}

//ENDE
// Teste ob Berechtigung für "results" gegeben ist

if ($uservoteallready === false && $mode == "results" && $user->data['user_id'] != ANONYMOUS && $show_result_link == false){
    $mode = "see";
    $error = "allreadyvoted";
}
//ENDE

switch($mode){
    //Jetzt werden die erforderlichen Aktionen in PHP je nach MODE ausgeführt. Mode-Liste steht oben

    case('see'):
        $result = $db->sql_query("SELECT * FROM " . U_TABLE . " WHERE umfrage_id = '" . $umfrage_id . "'");

        while($row = $db->sql_fetchrow($result))
        {
            $template->assign_block_vars('umfrage', array(
                'UMFRAGE_ID'        => $row['umfrage_id'],
                'TITEL'        => $row['titel'],
                'MAX_VOTES'        => $row['max_votes'],
                'MIN_VOTES'        => $row['min_votes'],
                'SHOW_LINK'        => $row['show_link'],
            ));

        }

        $result = $db->sql_query("SELECT * FROM " . U_POLLS_TABLE . " WHERE umfrage_id = '" . $umfrage_id . "'");

            while($row = $db->sql_fetchrow($result))
            {
                $template->assign_block_vars('umfragepolls', array(
                    'AUSWAHL_ID'        => $row['auswahl_id'],
                    'TITEL'        => $row['title'],
                ));
            }
    break;

    case('results'):

    break;

    case('archiv'):

    break;

    case('vote'):

    break;

    default:
        echo "Es ist ein schwerwiegender Fehler aufgetreten. Die Variable mode ist verkehrt (aktueller Wert: $mode ). Bitte kontaktiere einen Techniker!";
        exit;
    break;
}

// Ein typischer Gebrauch um Variablen an das Template zu senden.
$template->assign_vars(array(
    'SRL'    => $show_result_link,
    'MODE'    => $mode,

));

// Seiten Titel, diese Sprach Variable sollte in der Sprach Datei,
// welche weiter oben genannt wurde, definiert sein.
page_header($user->lang['MEIN_TITEL']);

// Defniere nun den Dateinamen Deines Templates welches Du benutzen moechtest.
// Dies ist der Name von Deinem Template welches unter /styles/<style>/templates/ zu finden ist.
$template->set_filenames(array(
    'body' => 'umfrage.html',
));

// Script vervollständigen und Seite anzeigen lassen.
page_footer();

?>
Vielen Dank schon einmal im Voraus.

Gruß,
mps
Antworten

Zurück zu „[3.0.x] Mod Bastelstube“