+ Antworten
Ergebnis 1 bis 9 von 9

Thema: Datenbank abfrage

  1. #1
    War schon öfter hier
    Registriert seit
    10.06.2009
    Beiträge
    126
    Bedankte sich
    24
    Erhielt 5 Danksagungen
    in 5 Beiträgen

    Standard Datenbank abfrage

    Hallo,

    ich fange gerade an joomla-extensions mit php zu entwickeln, bzw. habe mir das Buch besorgt und möchte damit einsteigen.

    Ich möchte ein Modul anpassen und habe eine Anfängerfrage.

    mit der helper.php lese ich die Datenbank ein

    PHP-Code:
    $db=& JFactory::getDBO();
    $query =  "SELECT * "
        
    "FROM #__facileforms_subrecords "
    ;
    // SQL-Abfrage an die Datenbank senden
    $db->setQuery$query );

    // Die Daten dem Array $rows zuordnen
    $rows $db->loadObjectList();
    // Variable mit HTML und Daten versorgen

    if ($rows) {
        foreach (
    $rows as $row) {
        
    $books .= "<p>"$row->value;
        
    $books .= "</p>";
         }
        }
        return 
    $books
    Da funktioniert soweit sehr gut.
    Jetzt möchte ich aber die Ausgabe in einer schöneren Form (Tabelle)ausgeben.
    Also die Werte einzeln auslesen und ausgeben.

    Wie komme ich an die einzelnen Werte, also wie lese ich das Array $row dann aus?
    Ideal wäre die Zimmerbelegung nur anzeigen wenn Wert >0.

    Benötige einen kleinen Denkanstoss, habe im mom ein Brett vor dem Kopf!


    Datenbankeinträge
    id record element title name type value
    2 2 6 Einzelzimmer Einzelzimmer Text 1
    3 2 28 Doppelzimmer Doppelzimmer Text 0
    4 2 29 Twinbettzimmer Twinbettzimmer Text 0
    5 2 30 Dreibettzimmer Dreibettzimmer Text 0
    6 2 35 Anreise anreise Calendar 01.10.2010
    7 2 40 Abreise Datum abreise Calendar 02.10.2010
    8 2 45 Vorname Vorname Text Max
    9 2 46 Nachname nachname Text Mustermann
    Geändert von kurtmos (08.12.2010 um 14:43 Uhr)

  2. #2
    Neu an Board
    Registriert seit
    07.12.2008
    Beiträge
    39
    Bedankte sich
    5
    Erhielt 0 Danksagungen
    in 0 Beiträgen

    Standard

    Versuchs mal mit $row[x].

  3. #3
    Moderator Avatar von time4mambo
    Registriert seit
    11.12.2006
    Ort
    76646 Bruchsal
    Alter
    54
    Beiträge
    14.367
    Bedankte sich
    456
    Erhielt 2.978 Danksagungen
    in 2.796 Beiträgen

    Standard

    Vielleicht hilft dir dieser Schnipsel weiter. Musst natürlich für dich anpassen:
    PHP-Code:
        $db->setQuery($query);
        
    $rows $db->loadObjectList();
        
    $i 0;
        if (
    $rows) {
              foreach (
    $rows as $row) {
             
    $buddyid        $row->memberid;
             
    $buddyname[$i]  = $buddyid;
             
    $bid            =& JFactory::getUser($buddyid);
             
    $buddyname[$i]  = $bid->username;
             
    $i++;
          }
        } 

    Axel
    Geändert von time4mambo (05.12.2010 um 23:59 Uhr)
    Schulungen, Webentwicklung: time4mambo
    (Video-)Tutorials: time4joomla

  4. #4
    Joomla Guru Avatar von elkuku
    Registriert seit
    14.06.2006
    Ort
    Guayaquil - Südamerika
    Beiträge
    1.689
    Bedankte sich
    74
    Erhielt 517 Danksagungen
    in 397 Beiträgen

    Standard

    Lass Dir von der helper.php doch einfach die $rows zurückgeben und foreache Dir dann im template ein Tabelle zusammen..

    Axel, Dein Code ist mehr als Sinnfrei..
    Gruß,
    Nikolai
    Hilf mit: Deutsche Joomla! Dokumentation Help testing: EasyCreator Noch Fragen ? Forum.Joomla-Nafu.de

  5. Erhielt Danksagungen von:


  6. #5
    War schon öfter hier
    Registriert seit
    10.06.2009
    Beiträge
    126
    Bedankte sich
    24
    Erhielt 5 Danksagungen
    in 5 Beiträgen

    Daumen runter

    Zuerst vielen Dank für die Tipps, die haben mich veranlaßt mal wieder das Gehirn einzuschalten.

    Für Leute mit ähnlichen Problemen hier meine Lösung, aber vielleicht geht es noch besser.

    PHP-Code:
    $db=& JFactory::getDBO();
    $query =  "SELECT * "
    "FROM #__facileforms_subrecords "
    "ORDER BY id ";
            
    // SQL-Abfrage an die Datenbank senden
    $db->setQuery$query );
    // Die Daten dem Array $rows zuordnen
    $rows $db->loadObjectList();

    //In das Formular wurde ein hidden-Feld eingebaut. 
    //Dies wird für eine neue Tabellenzeile verwendet.

    $i 0;
    foreach (
    $rows as $wert) {
    $testvar $test[$i] = "$wert->value";
      if (
    $testvar != hidden) {
            echo 
    "<td>" $test[$i] . "</td>"; }
      else {
              echo 
    "</tr>" .  "<tr>";
             }    
      
    $i ++;


  7. #6
    Moderator Avatar von time4mambo
    Registriert seit
    11.12.2006
    Ort
    76646 Bruchsal
    Alter
    54
    Beiträge
    14.367
    Bedankte sich
    456
    Erhielt 2.978 Danksagungen
    in 2.796 Beiträgen

    Standard

    Zitat Zitat von elkuku Beitrag anzeigen
    Axel, Dein Code ist mehr als Sinnfrei..
    Magst mir erklären, warum? Alldieweil ich diesen Schnipsel für meine, zugegebenermaßen kleineren, Anpassungen immer benutze.


    Axel
    Schulungen, Webentwicklung: time4mambo
    (Video-)Tutorials: time4joomla

  8. #7
    Hat hier eine Zweitwohnung
    Registriert seit
    14.01.2006
    Ort
    Nienburg
    Alter
    32
    Beiträge
    1.237
    Bedankte sich
    115
    Erhielt 471 Danksagungen
    in 368 Beiträgen

    Standard

    entweder for oder foreach, oder eine andere form (while) - foreach und dann darin $i nutzen ist insofern unsinnig, als dass in $row als einzel(object) von $rows bereits der aktuelle datensatz zu finden ist und so nicht mit einem kuenstlichen index auf $rows[$i] zugegriffen werden muss. zuvor gehoert in die datenbankabfrage zumindest eine fehlerpruefung. ausserdem sollte man anfangen dieses copy & paste passing by reference zu unterbinden. & ist also unnoetig.

    In PHP 5, the infrastructure of the object model was rewritten to work with object handles. Unless you explicitly clone an object by using the clone keyword you will never create behind the scene duplicates of your objects. In PHP 5, there is neither a need to pass objects by reference nor assigning them by reference.
    als naechstes trennt man code vom html / design part und strukturiert helper / und layout / template entsprechend. dazu gehoert ergebnisse / rueckgabewerte nicht bereits vor der verarbeitung mit tags zu "verunreinigen". die iteration durch das array und das bilden von zellen oder listen sollte im layout passieren. stichwort template / layout overrides.

    im detail zu axel:
    PHP-Code:
    // durchlauf 1 ($i = 0)
    $buddyid $row->memberid// ueberfluessig, da in der zeile darunter die id in buddyname[$i] gespeichert wird
    $buddyname[$i]  = $buddyid// angenommen die $memberid aus $row war 3 steht jetzt in $buddyname[0] = 3
    $bid =& JFactory::getUser($buddyid); // ein neues juser object mit den daten der userid 3 wird geladen und in $bid abgelegt
    $buddyname[$i]  = $bid->username// $buddyname[0] wird ueberschrieben mit dem namen des zuvor geladenen benutzers 
    PHP-Code:
    <?php
    // vorherige abfrage ob das array ueberhaupt gefuellt ist count($rows) empty($rows)
    foreach ($rows as $row) :
        
    $user JFactory::getUser($row->memberid);
    ?>
    <tag><?php echo $user->get('username'); ?></tag>
    <?php endforeach; ?>
    vielleicht ist die buddy id NULL und oder es gibt keinen user mehr mit der id, in beiden faellen waere es ratsam eine zusaetzliche fehlerabfrage einzubauen.

    zu kurtmos:
    gewoehne dir an den select nicht mit * zu machen, egal wie viele daten du abfraegst, oder spaeter verarbeiten willst, selbst wenn es wirklich alle felder sind. auflisten und nen alias verwenden. ebenso an die quotes denken, erst recht wenn von ausserhalb filter in den query einspielen.

    PHP-Code:
    $testvar $test[$i] = "$wert->value"
    hier wird in einem vorher nicht definierten array $test und einem kuenstlichen index der wert von $wert->value zugewiesen. die doppelten anfuehrungszeichen sind kaese. die zuweisung ist quasi das gleiche spiel wie in axels code und macht so ganz und gar keinen sinn.
    PHP-Code:
    $testvar != hidden 
    der ganze code ist an sich nicht schluessig. selbst wenn der wert in $testvar "hidden" waere, gehoert der zu testende string in einfachen oder doppelte anfuerhungszeichen. sonst wird angenommen es handelt sich um eine konstante.

    weiterfuehrenden informationen:
    http://wiki.joomla-nafu.de/joomla-do...Factory/getDBO
    http://wiki.joomla-nafu.de/joomla-do...mierung/Module
    http://wiki.joomla-nafu.de/joomla-do...ramework/JUser
    http://wiki.joomla-nafu.de/joomla-do...telle:Override
    Geändert von Matrikular (07.12.2010 um 18:53 Uhr)

  9. Erhielt Danksagungen von:


  10. #8
    Moderator Avatar von time4mambo
    Registriert seit
    11.12.2006
    Ort
    76646 Bruchsal
    Alter
    54
    Beiträge
    14.367
    Bedankte sich
    456
    Erhielt 2.978 Danksagungen
    in 2.796 Beiträgen

    Standard

    Vielen lieben Dank, Sven!

    Die Abprüfung auf NULL habe ich im Original-Code immerhin drin. Aber so wie du es erklärst, habe ich ansonsten doch so einigen Käse geschrieben. Immerhin funktioniert das Modul!
    Werde das aber mal entsprechend überprüfen und umbauen.

    Noch einmal vielen Dank für die genaue Erklärung!


    Axel
    Schulungen, Webentwicklung: time4mambo
    (Video-)Tutorials: time4joomla

  11. #9
    War schon öfter hier
    Registriert seit
    10.06.2009
    Beiträge
    126
    Bedankte sich
    24
    Erhielt 5 Danksagungen
    in 5 Beiträgen

    Standard

    @Matrikular

    Vielen Dank,

    habe select * durch value ersetzt. Der Code stand so im Buch joomla-extensions mit php, aber Dein Tipp leuchtet selbst mir als Anfänger ein.

    Den künstlichen Index habe ich entfernt, war überflüssig.

    Diesen Part habe ich in Anführungszeichen gesetzt.
    $testvar != "hidden";

    Der Sinn ist folgender. Ein Formular speichert Daten in die DB.
    Eine normale Abfrage listet alle Einträge hintereinander auf.
    Ich brauche aber für jeden Eintrag (record) eine eigene Tabellenzeile.

    Leider kenne ich keine saubere Abfrage, deshalb habe ich ein hidden-Feld am Ende des Formulars gesetzt. Dieses hat nur den Zweck das Tabellenende anzuzeigen.

    Wenn man es nicht besser kann muss man erfinderisch sein

    Ich werde mich aber jetzt intensiv in die Materie einarbeiten.
    Deine Links werden mir dabei sehr hilfreich sein.

+ Antworten

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein