• Hallo zusammen

    Ich habe für mein Glossar diese Funktion geschrieben:

    function rad_glossar_frontend($wort){
        global $wpdb;
        // Alle Begriffe laden
        $sql = $wpdb->get_results("SELECT * FROM ".$wpdb->prefix."rad_glossar");
        $ersetzen = array(
    	    // Zu ersetzendes Wort => Neuer Text
            'Lorem' => '<a href="#">Lorem</a>',
            'ipsum' => '<a href="#">ipsum</a>',
    	    'dolor' => '<a href="#">dolor</a>',   
        );
        $wort = str_replace(array_keys($ersetzen), $ersetzen, $wort);
        return $wort;
    }

    Das funktioniert soweit, auch die darin enthaltene DB Abfrage führt zu keinem Fehler. Um das Array aus der Datenbank zu füllen, habe ich die Funktion angepasst:

    function rad_glossar_frontend($wort){
        global $wpdb;
        // Alle Begriffe laden
        $sql = $wpdb->get_results("SELECT * FROM ".$wpdb->prefix."rad_glossar");
        $ersetzen = array(
    	    // Zu ersetzendes Wort => Neuer Text
            foreach($sql as $result)
            {
              // Füllt das Arry mit den Begriffen
              $result->glossar_term => '<a href="#">Lorem</a>',
            }
    	    'sdcndjffkvhdht' => '<a href="#">dolor</a>'  
        );
        $wort = str_replace(array_keys($ersetzen), $ersetzen, $wort);
        return $wort;
    }

    Rein theoretisch müsste der Inhalt im Array stimmen. Extra auch die Alibizeile am Schluss, damit die letzte Zeile im Array ohne Komma abschliesst. Das bringt allerdings die Seite zum Absturz. Ich habe den Verdacht, dass das foreach im Array nicht möglich ist. Aber wie sonst?

    Gruß René

Ansicht von 15 Antworten – 1 bis 15 (von insgesamt 21)
  • Ähmmm, ehrlich gesagt, verstehe ich nicht, was du da vorhast.

    16.14. Warum soll ich nicht SELECT * schreiben?
    http://www.php-faq.de/q/q-sql-select.html

    • Diese Antwort wurde vor 7 Jahren, 2 Monaten von bscu geändert.
    Thread-Starter René A. Da Rin

    (@radarin)

    Der Text aus the_content() läuft vor der Ausgabe durch diese Funktion. Die Wörter die im Array des 1. Beispiel hinterlegt sind, werden in einen Link verwandelt. Das funktioniert einwandfrei.

    Nun sollen die Einträge im Array aber nicht fix drin stehen, sondern aus der Datenbank kommen. Das funktioniert so wie ich es im 2. Beispiel habe so gar nicht.

    Datenbank Abfrage und die Schleife funktioniert wenn ich sie auf einer Seite liste.

    Ich überlege mir gerade, dass vielleicht noch das ‚return‘ fehlt? Kann das aber erst später testen.

    Was meinst wegen dem Select? Damit hab ich kein Problem. In der Tabelle habe ich 3 Spalten, die brauche ich alle.

    • Diese Antwort wurde vor 7 Jahren, 2 Monaten von René A. Da Rin geändert.

    Was meinst wegen dem Select? Damit hab ich kein Problem. In der Tabelle habe ich 3 Spalten, die brauche ich alle.

    Trotzdem sollte man nicht „Select *“ schreiben, sondern zähle die Spalten auf, die du brauchst, auch wenn es alle sind.

    Rein theoretisch müsste der Inhalt im Array stimmen

    Rein theoretisch müsste ich Millionär sein, aber ein Blick auf meine Kontoauszüge sagen was anderes. Also prüfe doch mal, ob der Inhalt wirklich das ist, was du erwartest.

    • Diese Antwort wurde vor 7 Jahren, 2 Monaten von bscu geändert.
    Thread-Starter René A. Da Rin

    (@radarin)

    Ok, die beiden Sternchen habe ich entfernt.

    Rein theoretisch müsste ich Millionär sein, aber ein Blick auf meine Kontoauszüge sagen was anderes.

    Wenn du berechtigten Grund hast anzunehmen, dass deine Theorie stimmt, dann solltest den Fehler in den Kontoauszügen suchen :).

    Also ist mein Ansatz nicht grund verkehrt. Ich passe das jetzt mal so an, dass ich prüfen kann, was der Loop wirklich ausgibt.

    Nur mal so als Tipp, wird oft in PHP-Foren gepostet:

    Richtig debuggen

    • Man bemerkt, dass ein Skript nicht das tut, was es soll.
    • Man schreibt an den Anfang des Scriptes die Zeile: error_reporting(-1);
    • Man verwendet ini_set(‚display_errors‘, true); damit die Fehler auch angezeigt werden.
    • Man versucht, die Stelle die daran Schuld sein kann, schonmal einzugrenzen. Falls dies nicht geht, wird zunächst das komplette Skript als fehlerhaft angesehen.
    • An markanten Stellen im Skript lässt man sich wichtige Variableninhalte ausgeben und ggf. auch in bedingten Anweisungen eine kurze Ausgabe machen, um zu überprüfen, welche Bedingung ausgeführt wurde. Wichtig bei MySQL Fehlern (…not a valid MySQL result resource…): mysqli_error() verwenden oder Abfrage ausgeben und zb mit phpmyadmin testen.
    • Schritt 5 wird so lange wiederholt, bis Unstimmigkeiten im Skript auffallen
      Damit hat man das Problem (Unstimmigkeit) gefunden und kann versuchen diese zu beheben. Hierzu dienen dann die PHP-Dokumentation und andere Quellen als Ratgeber.
      Lässt sich das konkrete Problem trotzdem nicht beheben, kann man in Foren um Rat fragen.
    • Das Programm läuft und man kann die Debug-Ausgaben wieder entfernen.
    Thread-Starter René A. Da Rin

    (@radarin)

    ini_set(‚display_errors‘, true); kommt auch in das Script?

    Wenn mich nicht alles täuscht, erreicht man das auch bei WordPress, wenn man das Debugging in der wp-config.php aktiviert.

    Thread-Starter René A. Da Rin

    (@radarin)

    In der wp-config.php hat es schon eine Einstellung um die Fehler auszugebern, musste diese nur auf true setzen.

    Ich hab den String, welchen ich zeilenweise im Array benötige so mit Ersatzzeichen zusammengesetzt, dass er bei der Ausgabe die korrekte Schreibweise hat. Das Array schaut nun so aus:

    $ersetzen = array(
         // Zu ersetzendes Wort => Neuer Text
         //return $ausgabe;
         echo $ausgabe;
        );

    Ich habe es mit echo und return versucht, ergibt jeweils ein Parse Fehler.

    Parse error: syntax error, unexpected ‚echo‘ (T_ECHO), expecting ‚)‘ in /home/…/wp-content/plugins/radglossar/glossar.php on line 299

    Wenn ich den Inhalt von $ausgabe auf der Seite ausgebe, bekomme ich das:

    'Begriff' => '<a>Begriff<span>Begriff</span></a>',
    'Glossar' => '<a>Glossar<span>Glossar</span></a>',
    'Tabelle' => '<a>Tabelle<span>Tabelle</span></a>',
    'SQL' => '<a>SQL<span>SQL</span></a>',
    'Test mit 2 Zeilen' => '<a>Test mit 2 Zeilen<span>Test mit 2 Zeilen</span></a>',
    'df5s4ghjt7fg' => '<a>df5s4ghjt7fg<span>df5s4ghjt7fg</span></a>',

    Kopiere ich diesen Text an Stelle von return $ausgabe ins Array, funktioniert die Funktion einwandfrei. Die entsprechenden Begriffe werden im Text verlinkt.

    Der Inhalt der Variable ist jetzt auch praktisch korrekt, nur kriege ich ihn so nicht ins Array rein. Muss da allenfalls noch was um die Variable rum (im Array), odern hat es einen Einfluss, dass die Variable ausserhalb vom Array bestückt wird?

    Die Verarbeitung des Arrays und die Ausgabe erfolgt so:

    $wort = str_replace(array_keys($ersetzen), $ersetzen, $wort);
        return $wort;

    global $ausgabe; hilft auch nicht.

    • Diese Antwort wurde vor 7 Jahren, 2 Monaten von René A. Da Rin geändert.
    • Diese Antwort wurde vor 7 Jahren, 2 Monaten von René A. Da Rin geändert.
    • Diese Antwort wurde vor 7 Jahren, 2 Monaten von René A. Da Rin geändert.

    Ungetestet:

    function rad_glossar_frontend($wort)
    {
        global $wpdb;
        
        $data = array();
        
        // Alle Begriffe laden
        $results = $wpdb->get_results("SELECT * FROM ".$wpdb->prefix."rad_glossar", OBJECT_K);
        
        foreach ($results as $key => $value)
           $data[$key] = $value;
           
        $wort = str_replace(array_keys($data), $data, $wort);
        
        return $wort;
    }
    Thread-Starter René A. Da Rin

    (@radarin)

    Recoverable fatal error: Object of class stdClass could not be converted to string in

    $wort = str_replace(array_keys($data), $data, $wort);

    Ich kann das im Moment nicht testen, mach‘ ich nachher mal. So aus dem Stand habe ich die WP-API auch nicht im Griff. 😉

    Thread-Starter René A. Da Rin

    (@radarin)

    Muss doch irgendwie möglich sein, eine Variable im Array zu übernehmen. Ich habe aber im Hinterkopf, dass es da noch irgend was mehr braucht. Ich hab sowas mal vor Jahren gebraucht, weiss nur nicht mehr wo…

    Kannst du mit mal die Struktur der Tabelle rad_glossar schreiben

    Vielleicht hilft dir das schon mal weiter:

    function rad_glossar_frontend($wort)
    {
        global $wpdb;
        
        $data = array();
        
        // Alle Begriffe laden
        $results = $wpdb->get_results("SELECT * FROM ".$wpdb->prefix."rad_glossar", ARRAY_A);
        
        var_dump($results);
        
        die ("Script gekillt");
           
        $wort = str_replace(array_keys($data), $data, $wort);
        
        return $wort;
    }

    Die Ausgabe ist ein multidimensionales Array

    Thread-Starter René A. Da Rin

    (@radarin)

    Die Tabelle hat 3 Spalten, glossar_ID, glossar_term und glossar_description.

    $sql = $wpdb->get_results("SELECT glossar_ID, glossar_term, glossar_description FROM ".$wpdb->prefix."rad_glossar");
    
    foreach($sql as $result)
            {
              // Füllt das Array mit den Begriffen
              $ausgabe .= "'".$result->glossar_term."'";
              $ausgabe .= " => ";
              $ausgabe .= "&apos;<a href&quot;#&quot; ";
              $ausgabe .= "class=&quot;tooltips&quot;";
              $ausgabe .= "alt=&quot;&quot;>";
              $ausgabe .= $result->glossar_term;
              $ausgabe .= "<span>".$result->glossar_term."</span>";
              $ausgabe .= "</a>&apos;,<br />";
            }
    • Diese Antwort wurde vor 7 Jahren, 2 Monaten von René A. Da Rin geändert.
Ansicht von 15 Antworten – 1 bis 15 (von insgesamt 21)

Das Thema „Array aus DB füllen“ ist für neue Antworten geschlossen.