1. Herzlich willkommen bei WPDE.org, dem grössten und ältesten deutschsprachigen Community-Forum rund um das Thema WordPress. Du musst angemeldet oder registriert sein, um Beiträge verfassen zu können.
    Information ausblenden

sql-Syntax nicht valide, warum

Dieses Thema im Forum "Konfiguration" wurde erstellt von diltigug, 23. Juli 2008.

  1. diltigug

    diltigug Well-Known Member

    Registriert seit:
    20. Juli 2006
    Beiträge:
    279
    Zustimmungen:
    0
    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):

    Code:
    Entschuldige, aber du musst dich registrieren oder anmelden um den Inhalt sehen zu können!
    Hier wie er im skript angegeben ist:

    PHP:
    Entschuldige, aber du musst dich registrieren oder anmelden um den Inhalt sehen zu können!
    Hier die Fehlermeldung:

    Code:
    Entschuldige, aber du musst dich registrieren oder anmelden um den Inhalt sehen zu können!
    Hier der Hinweis vom mysql_error():

    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
     
  2. marX

    marX Well-Known Member
    Ehrenmitglied

    Registriert seit:
    5. Oktober 2006
    Beiträge:
    12.943
    Zustimmungen:
    0
    Wo ist denn der Tabellenname abgeblieben?
    Code:
    Entschuldige, aber du musst dich registrieren oder anmelden um den Inhalt sehen zu können!
    Code:
    Entschuldige, aber du musst dich registrieren oder anmelden um den Inhalt sehen zu können!
    Offensichtlich ist $tabellenname leer. Wo kommt die Variable her?
     
    #2 marX, 24. Juli 2008
    Zuletzt bearbeitet: 24. Juli 2008
  3. diltigug

    diltigug Well-Known Member

    Registriert seit:
    20. Juli 2006
    Beiträge:
    279
    Zustimmungen:
    0
    Guten Morgen,

    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:
    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 utf8_general_ci und auf utf8_unicode_ci umgestellt.
    Geholfen hat´s nicht.
    :confused:

     
  4. marX

    marX Well-Known Member
    Ehrenmitglied

    Registriert seit:
    5. Oktober 2006
    Beiträge:
    12.943
    Zustimmungen:
    0
  5. diltigug

    diltigug Well-Known Member

    Registriert seit:
    20. Juli 2006
    Beiträge:
    279
    Zustimmungen:
    0
    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:
    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:
    Rein aus dem Bauch raus, sollte man das nicht vereinheitlichen?
     
  6. marX

    marX Well-Known Member
    Ehrenmitglied

    Registriert seit:
    5. Oktober 2006
    Beiträge:
    12.943
    Zustimmungen:
    0
    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?)
     
  7. spickzettel

    spickzettel Well-Known Member

    Registriert seit:
    19. Januar 2006
    Beiträge:
    1.848
    Zustimmungen:
    0
    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.
     
  8. marX

    marX Well-Known Member
    Ehrenmitglied

    Registriert seit:
    5. Oktober 2006
    Beiträge:
    12.943
    Zustimmungen:
    0
    Ja, daher mein Hinweis auf Prepared Statements und die Hinweise auf die WP-Konstanten.
    Das rote sind auf jeden Fall mal irgendwelche UTF-8-codierten Non-ANSI-Anführungszeichen, das blaue ein UTF-8-codiertes 'ü'.


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

    diltigug Well-Known Member

    Registriert seit:
    20. Juli 2006
    Beiträge:
    279
    Zustimmungen:
    0
    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):
    Das habe ich bisher nicht so gemacht. Demnach sähe die Abfrage ungefähr so aus:
    Code:
    Entschuldige, aber du musst dich registrieren oder anmelden um den Inhalt sehen zu können!
    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
     
  10. marX

    marX Well-Known Member
    Ehrenmitglied

    Registriert seit:
    5. Oktober 2006
    Beiträge:
    12.943
    Zustimmungen:
    0
    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.

    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):
    Code:
    Entschuldige, aber du musst dich registrieren oder anmelden um den Inhalt sehen zu können!
    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
     
  11. diltigug

    diltigug Well-Known Member

    Registriert seit:
    20. Juli 2006
    Beiträge:
    279
    Zustimmungen:
    0
    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:
    PHP:
    Entschuldige, aber du musst dich registrieren oder anmelden um den Inhalt sehen zu können!
    Ich würde die Tabellen so gerne in dem Blog ausgeben, wäre ein echter Mehrwert für unser Büro-Intranet.

    Gruß, diltigug
     
  12. marX

    marX Well-Known Member
    Ehrenmitglied

    Registriert seit:
    5. Oktober 2006
    Beiträge:
    12.943
    Zustimmungen:
    0
    Naja, ist weniger kompliziert als du dir das vorstellst. ;)

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

    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:
    Entschuldige, aber du musst dich registrieren oder anmelden um den Inhalt sehen zu können!
    Bis hierher okay.

    PHP:
    Entschuldige, aber du musst dich registrieren oder anmelden um den Inhalt sehen zu können!
    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:
    Entschuldige, aber du musst dich registrieren oder anmelden um den Inhalt sehen zu können!
    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:
    Entschuldige, aber du musst dich registrieren oder anmelden um den Inhalt sehen zu können!
    (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
     
  13. diltigug

    diltigug Well-Known Member

    Registriert seit:
    20. Juli 2006
    Beiträge:
    279
    Zustimmungen:
    0
    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:
    Entschuldige, aber du musst dich registrieren oder anmelden um den Inhalt sehen zu können!
    Funktionert natürlich nicht:
    ich vermute, weil selectdb und connect keine Objekte der Klasse sind? Ist das so richtig formuliert?

    Ist in diesem Fall leider nicht möglich.

    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.:?
     
  14. marX

    marX Well-Known Member
    Ehrenmitglied

    Registriert seit:
    5. Oktober 2006
    Beiträge:
    12.943
    Zustimmungen:
    0
    Nein. selectdb() und connect() sind Instanzmethoden der Instanzen (Objekte) der WPDB-Klasse. Mach mal folgendes:
    PHP:
    Entschuldige, aber du musst dich registrieren oder anmelden um den Inhalt sehen zu können!
    Damit legst du eine neue Instanz der Datenbankklasse mit deinen verbindungsdaten an. Die Instanz heißt dann $my_wpdb.


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

    diltigug Well-Known Member

    Registriert seit:
    20. Juli 2006
    Beiträge:
    279
    Zustimmungen:
    0
    so, jetzt hab´ich´s soweit und stehe, glaub ich, wieder am Anfang:
    Folgende Meldung wird ausgegeben:
    Das hatte ich irgendwann schon mal. Müsste sich eigentlich auf die folgende Zeile beziehen:
    So schaut der Code jetzt aus:
    PHP:
    Entschuldige, aber du musst dich registrieren oder anmelden um den Inhalt sehen zu können!
    Dann noch gleich die Frage, wie schliesse ich die DB-Verbindung wieder?
     
  16. marX

    marX Well-Known Member
    Ehrenmitglied

    Registriert seit:
    5. Oktober 2006
    Beiträge:
    12.943
    Zustimmungen:
    0
    PHP:
    Entschuldige, aber du musst dich registrieren oder anmelden um den Inhalt sehen zu können!
    Hier holst du dir das Result-Set (komplett!) in ein Array.

    PHP:
    Entschuldige, aber du musst dich registrieren oder anmelden um den Inhalt sehen zu können!
    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:
    Entschuldige, aber du musst dich registrieren oder anmelden um den Inhalt sehen zu können!
    Einfach die Instanz zerstören, d.h. "null" zuweisen:
    PHP:
    Entschuldige, aber du musst dich registrieren oder anmelden um den Inhalt sehen zu können!
    (In PHP wird die Verbindung übrigens automatisch am Scriptende geschlossen.)
     
  17. diltigug

    diltigug Well-Known Member

    Registriert seit:
    20. Juli 2006
    Beiträge:
    279
    Zustimmungen:
    0
    gebe ich
    PHP:
    Entschuldige, aber du musst dich registrieren oder anmelden um den Inhalt sehen zu können!
    ein, steht da nur NULL.
    :-? Toll, heisst das jetzt, ich habe immer noch keine Daten aus der DB erhalten?
     
  18. marX

    marX Well-Known Member
    Ehrenmitglied

    Registriert seit:
    5. Oktober 2006
    Beiträge:
    12.943
    Zustimmungen:
    0
    Lass dir mal hier dazwischen:
    PHP:
    Entschuldige, aber du musst dich registrieren oder anmelden um den Inhalt sehen zu können!
    eventuelle Fehlermeldungen ausgeben.
     
  19. diltigug

    diltigug Well-Known Member

    Registriert seit:
    20. Juli 2006
    Beiträge:
    279
    Zustimmungen:
    0
    so?
    PHP:
    Entschuldige, aber du musst dich registrieren oder anmelden um den Inhalt sehen zu können!
    Da kommen keine weiteren Meldungen:
     
  20. marX

    marX Well-Known Member
    Ehrenmitglied

    Registriert seit:
    5. Oktober 2006
    Beiträge:
    12.943
    Zustimmungen:
    0
    Nein, natürlich mit der WPDB-Methode dafür. ;)
    PHP:
    Entschuldige, aber du musst dich registrieren oder anmelden um den Inhalt sehen zu können!
    Am besten schaltest du direkt den Debug-Modus ein, also direkt nach dem Anlegen der Instanz schreibst du:
    PHP:
    Entschuldige, aber du musst dich registrieren oder anmelden um den Inhalt sehen zu können!
     
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden