wpde Klasse Verständnisproblem

  • Ich hoffe, ich bin hier richtig! Falls nicht, kann mir jemand nen Tipp geben, wo ich die Frage posten kann?

    Folgendes Problem:
    Ich habe die Klasse wpde ausprobiert um verschiedene Daten aus der Datenbank abzufragen. Funktioniert auch erstmal alles einwandfrei.

    Nun möchte ich aber per Javascript eine php Datei aufrufen, die dann die Datenbankabfrage macht (der Hintergrund ist etwas komplizierter, aber vielleicht auch nicht so wichtig). Ich kann auch problemlos die php Datei ausführen lassen. Aber sobald ich folgenden Code einfüge, wird das ganze Script nicht mehr ausgeführt:

    Code
    $wpdb->get_col( "SELECT meta_value FROM wp_postmeta WHERE post_id = 2 AND meta_key LIKE '%abc'" );

    Gibt es da Einschränkungen aus Sicherheitsgründen? Oder warum kann ich wpdb nicht mehr benutzen, sobald die Datei durch ein Javascript aufgerufen wird? Und gibt es eine Möglichkeit, wie die php Datei doch an Daten aus der Datenbank kommt?

    merci!!

    • Anzeige

    Hallo!

    Wenn du gerade an deiner Website arbeitest oder dein aktuelles Hosting überdenkst: Wir betreiben mit NetzLiving eine Hosting-Plattform, die speziell auf Performance, Sicherheit und einfache Verwaltung ausgelegt ist.

    • ✔️ Schnelle Ladezeiten (optimiert für WordPress & Co.)
    • ✔️ Deutsche Server & DSGVO-konform
    • ✔️ Persönlicher Support (kein 0815-Ticket-System)

    Mehr erfahren

  • Ist die Klasse in der PHP-Datei eingebunden? Fehlermeldungen? Was sagt var_dump? Ajax-Request? Wie sieht der aus?

  • Ich bin mir nicht ganz sicher, wie das mit dem Klassen einbinden funktioniert. Glaube, das muss ich gar nicht, da es keine fremde Klasse ist. Man findet sie bei Wordpress unter /wp-includes/wp-db.php.

    Zitat

    [COLOR=#333333]Fehlermeldungen? Was sagt var_dump?[/COLOR]


    Geht beides nicht, weil die php Datei scheinbar gar nicht erst ausgeführt wird.

    Hier die php Datei, die per Javascript aufgerufen wird:

    PHP
    <?php
    echo "klappt"; 
    $as = $wpdb->get_col( "SELECT meta_value FROM wp_postmeta WHERE post_id = 2 AND meta_key LIKE '%abc'" );
    foreach ( $as as $id ) {
      echo '</br>'.$id;
    }
    ?>


    So wie es da steht, wird gar nichts ausgegeben. Sobald ich die Zeile mit wpdb entferne, funktioniert der echo Befehl.

    Zitat

    Ajax-Request? Wie sieht der aus?


    Ist ein Ajax-Request, wenn eine php Datei via Javascript aufgerufen wird? Das sähe in meinem Fall so aus:

    PHP
    <script type="text/javascript">
    jQuery(document).ready(function($) {
    $("#display").load("/wp-content/themes/graphene/display.php?post=<?php echo $post->ID;?>",function() {});
    });
    </script>


    Das funktioniert auch. Die display.php wird wie gesagt ausgeführt, solange ich darin nicht wpdb verwende.

  • PHP
    <?php 
    
    
    require( 'Dein_WP_Pfad/wp-blog-header.php' );
    
    
    global $wpdb;
    $as = $wpdb->get_col( "SELECT meta_value FROM $wpdb->postmeta WHERE post_id = 2 AND meta_key LIKE '%abc'" );  ?>

    Du brauchst das require und das global.
    Dann sollte es gehen. Oder hast Du das schon?

    Damit Dein Code unabhängig vom gewählten Tabellenprefix ist,
    schreibe die Tabellen so, wie ich es oben im SELECT geändert habe.
    Schließlich hat jeder ein anderes Prefix.
    Und wp_ als Prefix ist unsicher.

    Lang lebe Edward Snowden!

    Einmal editiert, zuletzt von entwickler (24. Juli 2013 um 12:02)

  • Zitat

    [COLOR=#333333]schreibe die Tabellen so, wie ich es oben im SELECT geändert habe[/COLOR]


    Danke!

    Zitat

    [COLOR=#333333]Du brauchst das require und das global.[/COLOR]


    Mit dem require verhält es sich jetzt leider genauso, wie mit dem $wpdb->get_col(). Sobald ich es benutze, geht gar nichts mehr (echo "klappt"; wird nicht mehr ausgeführt).

    Klingt für mich, als ob das Script bestimmte Aktionen nicht ausführen darf. Kann das sein? Es wird ja scheinbar komplett abgebrochen.

  • Debuggen will gelernt sein. Lass Dir mal den XHR-Status in der Konsole ausgeben.

    Probiers mal saubererer:

  • Puuuh, bitte nachsichtig sein. Ich hab eigentlich kaum Ahnung von Javascript und natürlich auch noch nie von Debugging per Console gehört. Wenn ich jetzt nicht völlig auf dem Holzweg bin, meinst du das, was man sich von Firebug anzeigen lassen kann, oder?

    Da wird sinngemäß folgendes gemeldet:


    Warum jetzt 404? Wenn die Datei nicht gefunden wird, wie kommt Firefox dann an die korrekte Ausgabe der php Datei?

  • ...die Ausgabe bei firebug funktioniert allerdings ohne console.log() im javascript genauso. Versteh noch nicht ganz wozu die Anweisung gut ist.

  • Poste bitte mal den aktuellen, kompletten Inhalt der display.php.

    Ersetze ihn Testweise durch:

    PS: Es hilft auch, die display.php mit angehängtem Parameter mal direkt im Browser aufzurufen und mit aktiviertem error logging von PHP zu analysieren. In diesem Bezug das Thema Sicherheit nicht vergessen! ;)

  • Hier die komplette display.php:

    PHP
    error_reporting(E_ALL);
    ini_set('display_errors', 1);
    
    
    echo "abc";
    require( '/PFAD/wp-blog-header.php' );                                                                                   global $wpdb;
    $as = $wpdb->get_col( "SELECT meta_value FROM $wpdb->postmeta WHERE post_id = 2 AND meta_key LIKE '%abc'" );
    foreach ( $as as $nummer )
      {echo '</br>'.$nummer;   }

    Wenn ich die php Datei direkt im Browser aufrufe, sehe ich die korrekte Ausgabe der echo Anweisungen. Nur per Javascript in den <div id="display"></div> kann ich nichts einhängen. Der bleibt leer, es sei denn ich lösche die Zeile mit $wpdb->get_col().

    Wenn ich den Inhalt der display.php durch Code von formateins ersetze, bleibt beides leer. Sowohl der div, als auch die Ausgabe der display.php direkt im Browser.

    Ich bin mir allerdings auch nicht ganz sicher, ob mein Error Reporting in der php Datei wirksam ist. Auf eine zentrale php.ini Datei habe ich keinen Zugriff. Kann ich stattdessen einfach eine zweite im beliebigen Verzeichnis erstellen?

  • Ok, nochwas - Lasse ich require() weg, bekomme ich jetzt diese Fehlermeldung:

    Zitat

    Fatal error: Call to a member function get_col() on a non-object in /PFAD/display.php on line 12

    Mit require('domain.tld/wp-blog-header.php') bekomme ich diese Fehlermeldung:

    Zitat

    Warning: require(): Unable to access domain.tld/wp-blog-header.php in /PFAD/wp-content/themes/graphene/display.php on line 7Warning: require(domain.tld/wp-blog-header.php): failed to open stream: No such file or directory in /PFAD/wp-content/themes/graphene/display.php on line 7 Fatal error: require(): Failed opening required 'domain.tld/wp-blog-header.php' (include_path='.:/usr/share/php:/usr/share/pear') in /PFAD/wp-content/themes/graphene/display.php on line 7

    Wenn ich bei require() statt der Domain den kompletten Pfad der Verzeichnisse auf dem Server angebe, bekomme ich gar keine Fehlermeldung im Browser, aber die Konsole meldet 404.

  • Entweder setzt Du Dich mal intensiver mit dem Thema auseinander oder Du wirst Dich dauerhaft im Kreis drehen. Ohne Programmierkenntnisse ist letzteres garantiert. ;)

    1. Vollkommen klar, dass das nicht funktioniert. Auch Fehlermeldungen kann man Googeln. Nur soviel: keine Objektinstanz der WPDB-Klasse > nix funktionieren.
    2. Wenn Du die Wordpress-API nutzen willst, musst Du sie auch richtig einbinden. Schon mal einen Blick in die wp-blog-header.php geworfen? Die befindet sich im Wurzelverzeichnis und inkludiert auch von dort aus. Wenn Du diese Datei irgendwo im Theme einbindest, funktioniert des nicht.

    Probiers mal hiermit, das funktioniert 100% ohne Probleme:

    Code
    include_once($_SERVER['DOCUMENT_ROOT'].'/wp-load.php' );

    Wenn Dein Blog in einem Unterverzeichnis installiert ist, bitte mit angeben.

  • Zitat

    [COLOR=#333333]Entweder setzt Du Dich mal intensiver mit dem Thema auseinander oder Du wirst Dich dauerhaft im Kreis drehen[/COLOR]


    Das merke ich auch langsam. Hätte ich ein bischen mehr Zeit, würde ich liebend gerne nochmal php von Grund auf lernen ;)

    Zitat

    [COLOR=#333333]keine Objektinstanz der WPDB-Klasse > nix funktionieren[/COLOR]


    hmm ...jetzt muss ich mich auch noch mit oop auseinandersetzen? Ich versteh zwar nicht warum, aber durch das inkludieren der wp-load.php scheint jetzt ja auch das Objekt verfügbar zu sein. Zumindest funktioniert jetzt alles einwandfrei und ohne Fehlermeldung.

    Hast mir echt weiter geholfen. Ich hab zwar scheinbar zu viele Wissenslücken, um meinen Fehler so richtig zu kapieren ...aber es funzt!!! :D ...Danke!!

  • Es gibt nur OOP und MVC. Okay, ich mag ja auch Spaghetticode hier und dort, aber sehr begrenzt. Jeder fängt mal an und ich hab auch schon richtig böse Dinger gebastelt.

    Die wp-load.php inkludiert schlichtweg alles. Steht aber auch in der Datei drin. Kann man aufmachen und lesen. :D Bei der wp-blog-header.php fehlt die Angabe des ABSPATH (absoluter Pfad), deswegen versucht sie, die weiteren Dateien relativ reinzuholen. Ergo hättest Du den ABSPATH dort übermitteln müssen. Kann man sich sparen - wp-load.php und fertig.

    Einer der Gründe, warum ich Wordpress sch... nicht mag. Und nach wie vor wird um eine Problemzone drumherum gebastelt, anstatt sie mal richtig anzugehen...

  • Ich bin bisher immer ans Ziel gekommen, indem ich an den vorhandenen Dateien des Themes oder der Plugins rumeditiert habe. Für meine kleineren Probleme war weder OOP noch MVC nötig. Ein paar Grundlagen werde ich mir da aber wohl oder übel mal aneignen müssen..

    Zitat

    [COLOR=#3E3E3E]Die wp-load.php inkludiert schlichtweg alles. Steht aber auch in der Datei drin. Kann man aufmachen und lesen[/COLOR]

    Da geht's ja schon los - ich hatte auch mal reingeschaut und gesehen das die wp-config.php und wp-settings.php geladen wird. Aber ohne die WP Hierarchie ein wenig zu kennen, nützt mir das Wissen auch erstmal nicht viel. Aber sei's drum - danke nochmal, kommt ja doch noch etwas Licht ins Dunkel.

  • Ich könnte ja jetzt noch schreiben, dass man das idealerweise gar nicht in eine externe Datei presst sondern einfach als Funktion in der functions.php hinterlegt, aber wenn es funktioniert... alles wird gut... :D

  • Wie kann ich denn Funktionen aus der functions.php im Javascript nutzen? Meines Wissens nach geht das nicht und ich muss stattdessen den Request machen.

    Es geht ja darum, nachdem die Seite vollständig geladen ist, weitere Inhalte nachzuladen. Dabei soll auch noch ein sleep in der display.php verwendet werden, damit die Ausgabe erst nach ein paar Sekunden erscheint.

  • In JavaScript nutzt Du die ja auch nicht. Grundsätzlich steht die functions.php im Theme zur Verfügung. Es wäre also ein Leichtes, ein Objekt (oder von mir aus ein Array) mit Daten zu füllen und diese mit einem kleinen jQuery-Script zeitversetzt (setTimeout) darzustellen. Spart den zusätzlichen Request über Ajax und bietet ein wenig mehr Sicherheit. :)

  • Zitat

    [COLOR=#333333]Dabei soll auch noch ein sleep in der display.php verwendet werden, damit die Ausgabe erst nach ein paar Sekunden erscheint.[/COLOR]


    Das Delay wäre clientseitig besser aufgehoben. Ansonsten startest Du serverseitig einen PHP-Prozess, der dann einige Sekunden läuft und die Ressourcen blockiert. Wenn Du es mit Javascript implementieren würdest, würdest Du das auf den Benutzer "abwälzen". Warum brauchst Du ein Dely, wenn ich fragen darf?

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!