sql-Syntax nicht valide, warum

  • ich schiebe gerade ziemlichen Frust, ein SQL-String wird in meinem Blog nicht verarbeitet und ich finde partout nicht den Fehler:
    Hier der String (mit echo ausgegeben):

    SQL
    SELECT * FROM  WHERE ort=’büro’ ORDER BY lastname firstname ASC

    Hier wie er im skript angegeben ist:

    PHP
    $sql = "SELECT * FROM ".$tabellenname." WHERE ort='büro'";
    if($_GET['masort'] == 1)
        {$sql.=" ORDER BY lastname firstname ASC";}
    elseif($_GET['masort'] == 2)
        {$sql.=" ORDER BY firstname lastname ASC";}
    else
        {$sql.=" ORDER BY lastname firstname ASC";}

    Hier die Fehlermeldung:

    Code
    Warning:  mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /srv/www/wordpress/wp-content/plugins/exec-php/includes/runtime.php(42) : eval()’d code on line 32

    Hier der Hinweis vom mysql_error():

    Zitat

    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘WHERE ort=’büro’ ORDER BY lastname firstname ASC’ at line 1

    Die MySQL server version kann nicht der Fehler sein, genau die selbe Syntax funktioniert in einer anderen Anwendung auf dem selben Server, ausserdem:
    Auf einer anderen Seite mit einer anderen Abfrage an die selbe DB-Tabelle gibt es keine Probleme.

    Auf dem Blog läuft Exec-PHP

    Kann mir irgendjemand sagen, wo das Problem liegt?

    Danke im voraus,
    diltigug

    P.S. werde erst morgen reagieren, habe für heute die Nase voll

    • 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

  • Wo ist denn der Tabellenname abgeblieben?

    SQL
    SELECT * FROM  WHERE ort=’büro’ ORDER BY lastname firstname ASC
    Code
    $sql = "SELECT * FROM [COLOR="Red"]".$tabellenname."[/COLOR] WHERE ort='büro'";

    Offensichtlich ist $tabellenname leer. Wo kommt die Variable her?

  • Guten Morgen,

    Wo ist denn der Tabellenname abgeblieben?

    SQL
    SELECT * FROM  WHERE ort=’büro’ ORDER BY lastname firstname ASC


    Ups, da habe ich nicht aufgepasst und hatte tatsächlich eine falschen Variablennamen erwischt.:oops:
    Aber leider war das nicht die Lösung des Problems.

    Die Variablen sind am Anfang des Skripts definiert.

    Ich habe heute den sql-String direkt in phpmyadmin eingegeben und ich glaube das bringt mich der Lösung näher:

    Zitat

    MySQL meldet:
    #1054 - Unknown column '’büro’' in 'where clause'

    Es gibt anscheinend ein Problem mit den Umlauten in der where-Klausel, was ich allerdings nicht verstehe, weil ich, wie schon gesagt, die Klausel mit der selben column in einer anderen Anwendung mit der selben DB auch verwende. Und dort funkt sie ganz normal.
    Die Datenbank hat als Kollation latin1_general_ci, ich habe sowohl das Feld, als auch die gesamte DB versuchsweise mal auf [FONT=Verdana]utf8_general_ci und auf [/FONT][FONT=Verdana]utf8_unicode_ci umgestellt.
    Geholfen hat´s nicht.
    :confused:

    [/FONT]

  • Warum enthält der Spaltenname Umlaute? Welche Zeichencodierung ist für die MySQL-Verbindung vorgesehen?
    Editing wp-config.php « WordPress Codex

    Enthält er eigentlich nicht die colum heisst "ort" und aus der soll er mir alle Einträge rausholen die "Büro" enthalten. Oder steh´ da gerade auf dem Schlauch?

    Das mit der Zeichencodierung ist interessant, z. Zt. sieht die wp-config bei mir so aus:

    Zitat

    define('DB_CHARSET', 'utf8');
    define('DB_COLLATE', '');

    Muss ich bei DB_COLLATE vielleicht was definieren?

    Wenn ich mir die WP-Tabellen in php-myadmin anschaue so stehen unter Kollation unterschiedliche einträge: latin1_general_ci, latin1_german1_ci, utf8_general_ci und die letzte Zeile:

    Zitat


    23 Tabellen Gesamt 10.612 MyISAM latin1_german1_ci 1,3 MiB 18,4 KiB

    Rein aus dem Bauch raus, sollte man das nicht vereinheitlichen?

  • Als erstes würde ich mal mit Prepared Statements arbeiten, statt irgendwelche Werte direkt in die Query zu tippen. Siehe hier:
    WordPress Coding Standards « WordPress Codex
    (Abschnitt "Formatting SQL statements")
    Möglicherweise behebt das bereits das Problem, da hier Escaping und Quoting der Daten die WPDB-Klasse für dich übernimmt und so eine mögliche Fehlerquelle ausgeschlossen wird.

    Prinzipiell ist es egal, welche Kollation die DB-Tabellen haben, solange das verarbeitende Script immer die gleichen Ein- u. Ausgabedaten erwartet. Dann ist es ja egal, wie die Daten in der DB codiert sind.

    (Geh ich richtig davon aus, dass du die WP-DB-Klasse nutzt?)

  • Zitat

    MySQL meldet:
    #1054 - Unknown column '’büro’' in 'where clause'

    Das scheint mir eher daran zu liegen, dass hier irgend welche falschen Anführungszeichen verwendet werden. Die werden ja von diverser Software gern mal zu typografischen gemacht, mit denen dann aber MySQL nichts anfangen kann.

  • Das scheint mir eher daran zu liegen, dass hier irgend welche falschen Anführungszeichen verwendet werden.


    Ja, daher mein Hinweis auf Prepared Statements und die Hinweise auf die WP-Konstanten.

    Zitat

    #1054 - Unknown column '[COLOR="Red"]’[/COLOR]b[COLOR="Blue"]ü[/COLOR]ro[COLOR="#ff0000"]’[/COLOR]' in 'where clause'


    Das rote sind auf jeden Fall mal irgendwelche UTF-8-codierten Non-ANSI-Anführungszeichen, das blaue ein UTF-8-codiertes 'ü'.


    Zitat

    Die werden ja von diverser Software gern mal zu typografischen gemacht, mit denen dann aber MySQL nichts anfangen kann.


    Ich würde die Schuld hier nicht unbedingt auf einen Editor schieben.

  • Als erstes würde ich mal mit Prepared Statements arbeiten, statt irgendwelche Werte direkt in die Query zu tippen. Siehe hier:
    WordPress Coding Standards « WordPress Codex
    (Abschnitt "Formatting SQL statements")
    Möglicherweise behebt das bereits das Problem, da hier Escaping und Quoting der Daten die WPDB-Klasse für dich übernimmt und so eine mögliche Fehlerquelle ausgeschlossen wird.


    Prepared Statements ? in die Query zu tippen ? WP-DB-Klasse nutzen ?

    So langsam komme ich da als Hobby-WPler doch ins schwitzen :???:.
    Aber egal, ich werde trotz meiner beschränkten Englischkenntnisse mal mit dem Codex-Link beschäftigen. Auf den ersten Blick wird da der SQL-String irgendwie so übergeben (Bsp. aus dem WP Codex):

    Zitat

    $wpdb->query( $wpdb->prepare( "UPDATE $wpdb->posts SET post_title = %s WHERE ID = %d", $var, $id ) );

    Das habe ich bisher nicht so gemacht. Demnach sähe die Abfrage ungefähr so aus:

    Code
    $wpdb->query( $wpdb->prepare( "SELECT $wpdb-> * FROM mitarbeiter WHERE ort='büro' ORDER BY lastname firstname ASC ) );

    richtig? Wenn ja, werde ich damit nachher mal rumspielen. Mein SQL-String wird ja auch noch durch eine if-Abfrage zusammengesetzt. Aber ich glaub, das bekomme ich hin.
    Bin jetzt aber erstmal weg, melde mich auf jeden Fall nochmal, ob es klappt.
    Jedenfalls schon jetzt mal danke für diesen Super-Support von Euch.
    Ich glaube, ohne dieses Forum wären meine autodidaktischen Fähigkeiten schon lange an ihre Grenzen gestossen.

    diltigug

  • Prepared Statements ? in die Query zu tippen ? WP-DB-Klasse nutzen ?

    So langsam komme ich da als Hobby-WPler doch ins schwitzen :???:.


    Naja, eigene datenbank-Abfragen erfordern schon ein gewisses Wissen, was man da eigentlich anstellt. Das kann sonst nicht nur nicht funktionieren, sondern auch Scheuentor-große Lücken in den Copde reißen.

    Zitat

    Das habe ich bisher nicht so gemacht. Demnach sähe die Abfrage ungefähr so aus:

    Code
    $wpdb->query( $wpdb->prepare( "SELECT $wpdb-> * FROM mitarbeiter WHERE ort='büro' ORDER BY lastname firstname ASC ) );

    richtig?


    Naja, fast. Aber irgendwie auch nicht. $wpdb enthält eine Instanz der Klasse, die in WP die Datenbank-Verbindung übernimmt. Hier mal noch ein Link dazu:
    Function Reference/wpdb Class « WordPress Codex

    Der Code sollte bei dir in etwa so aussehen (Einrückungen für die bessere Übersicht):

    Zitat

    Mein SQL-String wird ja auch noch durch eine if-Abfrage zusammengesetzt.


    Das dürfte nicht das Problem sein. Du solltest aber niemals (!) ungeprüften Werte an die DB übergeben. Werte die aus irgendwelchen Eingaben kommen, filtert prepare() für dich, und fügt sie der Reihe nach in deinen Query-String ein. (Im Beispiel werden potentiell gefährliche Zeichen in $ort_value escaped, dann werden automatisch Anführungszeichen eingefügt und der Wert anstelle des Platzhalters %s (s für String, siehe sprintf()) in den Query-String eingefügt.)

    Wenn Fragen: sagen! :-D

  • Hallo marX,

    mir fehlt einfach Grundwissen in Bezug auf Klassen und deren Anwendung. Und alles was ich dazu lese, verstehe ich im Moment nicht wirklich. Ziemlich frustrierend.

    Ich habe es mal mit Deinem Code probiert, habe aber jetzt z. B. überhaupt keine Ahnung, wie ich die Daten denn damit ausgeben kann.

    Mir ist klar, das das Forum hier kein PHP-Grundkurs sein kann, aber vielleicht kannst Du mir ja doch nochmal weiterhelfen?

    Hier mal mein bisherigen Code im Zusammenhang:

    Ich würde die Tabellen so gerne in dem Blog ausgeben, wäre ein echter Mehrwert für unser Büro-Intranet.

    Gruß, diltigug

  • Hallo marX,

    mir fehlt einfach Grundwissen in Bezug auf Klassen und deren Anwendung. Und alles was ich dazu lese, verstehe ich im Moment nicht wirklich. Ziemlich frustrierend.


    Naja, ist weniger kompliziert als du dir das vorstellst. ;-)

    Zitat

    Ich habe es mal mit Deinem Code probiert, habe aber jetzt z. B. überhaupt keine Ahnung, wie ich die Daten denn damit ausgeben kann.


    Einfach mal die Doku zur WPDB-Klasse lesen, da sind die wichtigsten Methoden (so heißen Funktionen in Klassen) beschrieben. Du suchst get_results().

    Zitat

    Mir ist klar, das das Forum hier kein PHP-Grundkurs sein kann, aber vielleicht kannst Du mir ja doch nochmal weiterhelfen?


    Also für OOp im allgemeinen eher nicht, da musst du dich schon selbst durchwursteln. ;-) Aber was WP und WPDB angeht helf ich gerne soweit ich kann.

    PHP
    <?php
    $pass="xxx";  //Datenbankpasswort
    $data="xxx";  //Datenbank
    $user="xxx";  //Datenbanknutzer
    $tabelle="mitarbeiter";


    Bis hierher okay.

    PHP
    $link=mysql_connect("localhost", $user, $pass, true);
    mysql_select_db($data, $link);


    So, hier legst du jetzt eine neue Datenbank-Verbindung mit Hilfe der WPDB-Klasse an. Besser wäre es allerdings, wenn du die bestehende Datenbank-verbindung nutzen könntest, d.h. die Mitarbeiter-Tabelle würde in der selben Datenbank liegen wie die wp_*-Tabellen. Dann sparst du dir eine weitere Datenbank-Verbindung, das spart Resourcen und schließt mögliche Fehlerquellen aus.


    PHP
    /*Hier der Code von marX*/
    $ort_value = 'büro';
    $wpdb->query(
       $wpdbprepare("
           SELECT * FROM mitarbeiter 
           WHERE ort = %s 
           ORDER BY lastname ASC, firstname ASC",
           $ort_value));
    /*marX-Code ende, und dann... ? */


    Und dann? Kein Problem: das Result-Set liegt jetzt in der WPDB-Klasse vor. Du musst es dir nur noch holen, mit der o.g. get_results()-Methode. Funktioniert analog zu mysql_fetch_array():

    PHP
    <?php $ergebnis = $wpdb->get_results(null, ARRAY_N); ?>


    (ARRAY_A liefert ein assoziative Array, ARRAY_N ein nummeriertes Array und OBJECT ein Objekt als Resultat -> Doku)

    Die <table> gibst du dann einfach per foreach-Schleife über $ergebnis aus.

    Alle Klarheiten beseitigt? :-D

  • PHP
    <?php
    $pass="xxx";  //Datenbankpasswort
    $data="xxx";  //Datenbank
    $user="xxx";  //Datenbanknutzer
    $tabelle="mitarbeiter";

    Bis hierher okay.

    PHP
    $link=mysql_connect("localhost", $user, $pass, true);
    mysql_select_db($data, $link);

    So, hier legst du jetzt eine neue Datenbank-Verbindung mit Hilfe der WPDB-Klasse an.


    Hier geht´s leider schon wieder los, wie genau mach ich das? Ich habe mich mit meine Englischkenntnissen versucht was in der Doku zu finden, leider ohne Erfolg. Darum einfach mal ins Blaue geraten:

    PHP
    $pass="xxx";
    $data="xxx";
    $user="xxx";
    $tabelle="mitarbeiter";
    $wpdb->selectdb($data, $wpdb->connect("localhost", $user, $pass, true));

    Funktionert natürlich nicht:

    Zitat


    Fatal error: Call to a member function selectdb() on a non-object in /srv/www/wordpress/wp-content/plugins/exec-php/includes/runtime.php(42) : eval()'d code on line 17

    ich vermute, weil selectdb und connect keine Objekte der Klasse sind? Ist das so richtig formuliert?

    Besser wäre es allerdings, wenn du die bestehende Datenbank-verbindung nutzen könntest, d.h. die Mitarbeiter-Tabelle würde in der selben Datenbank liegen wie die wp_*-Tabellen. Dann sparst du dir eine weitere Datenbank-Verbindung, das spart Resourcen und schließt mögliche Fehlerquellen aus.


    Ist in diesem Fall leider nicht möglich.

    PHP
    /*Hier der Code von marX*/
    $ort_value = 'büro';
    $wpdb->query(
       $wpdbprepare("
           SELECT * FROM mitarbeiter
           WHERE ort = %s
           ORDER BY lastname ASC, firstname ASC",
           $ort_value));
    /*marX-Code ende, und dann... ? */

    ...

    Alle Klarheiten beseitigt?

    Wie man siehtst, leider nein. In dem Code oben, muss das $wpdbprepare oder $wpdb->prepare heissen. Ist im Zitat und Original unterschiedlich.

    Gruss,
    diltigug, oder die Hoffnung stirbt zuletzt.:?

  • ich vermute, weil selectdb und connect keine Objekte der Klasse sind? Ist das so richtig formuliert?


    Nein. selectdb() und connect() sind Instanzmethoden der Instanzen (Objekte) der WPDB-Klasse. Mach mal folgendes:

    PHP
    $my_wpdb = new wpdb($user, $pass, $data, "localhost");


    Damit legst du eine neue Instanz der Datenbankklasse mit deinen verbindungsdaten an. Die Instanz heißt dann $my_wpdb.


    Zitat

    In dem Code oben, muss das $wpdbprepare oder $wpdb->prepare heissen. Ist im Zitat und Original unterschiedlich.


    $wpdb->prepare() natürlich. prepare() ist ja eine Methode. Bzw. im Falle deiner neuen Verbindung $my_wpdb->prepare().

  • so, jetzt hab´ich´s soweit und stehe, glaub ich, wieder am Anfang:
    Folgende Meldung wird ausgegeben:

    Zitat


    Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /srv/www/wordpress/wp-content/plugins/exec-php/includes/runtime.php(42) : eval()’d code on line 25

    Das hatte ich irgendwann schon mal. Müsste sich eigentlich auf die folgende Zeile beziehen:

    Zitat

    while($ergebnis=mysql_fetch_array($ergebnis))

    So schaut der Code jetzt aus:

    Dann noch gleich die Frage, wie schliesse ich die DB-Verbindung wieder?

  • PHP
    $ergebnis = $my_wpdb->get_results(null, ARRAY_N);


    Hier holst du dir das Result-Set (komplett!) in ein Array.

    PHP
    while($ergebnis=mysql_fetch_array($ergebnis))


    Hier musst du dann durch dieses Array laufen, z.B. mittels foreach(). Mit mysql_* hast du eigentlich nix mehr am Hut, das macht alles die wpdb-klasse für dich. ;-) Lasst dir $ergebnis einfach mal anzeigen:

    PHP
    var_dump($ergebnis);
    Zitat

    Dann noch gleich die Frage, wie schliesse ich die DB-Verbindung wieder?


    Einfach die Instanz zerstören, d.h. "null" zuweisen:

    PHP
    $my_wpdb = null;


    (In PHP wird die Verbindung übrigens automatisch am Scriptende geschlossen.)

  • Lass dir mal hier dazwischen:

    PHP
    $my_wpdb->query($my_wpdb->prepare("SELECT * FROM mitarbeiter WHERE ort = %s ORDER BY lastname ASC, firstname ASC", $ortvalue));
    $ergebnis = $my_wpdb->get_results(null, ARRAY_N);


    eventuelle Fehlermeldungen ausgeben.

  • so?

    PHP
    $my_wpdb->query($my_wpdb->prepare("SELECT * FROM mitarbeiter WHERE ort = %s ORDER BY lastname ASC, firstname ASC", $ortvalue));
    echo mysql_error();
    $ergebnis = $my_wpdb->get_results(null, ARRAY_N);
    var_dump($ergebnis);

    Da kommen keine weiteren Meldungen:

    Zitat


    NULL

    Warning: Invalid argument supplied for foreach() in /srv/www/wordpress/wp-content/plugins/exec-php/includes/runtime.php(42) : eval()’d code on line 27

Jetzt mitmachen!

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