Verschiedene Apostrophe bei SELECT GREATEST

  • Hallo,
    habe soeben zufällig eine Merkwürdigkeit entdeckt.

    Irgendwo in den weiten den Internets fand ich einen PHP-Code-Schnipsel für eine SELECT GREATEST Anweisung, bei der ungewöhnliche Apostrophen verwendet wurden. Ahnungslos habe ich den Schnipsel mit den Apostrophen kopiert und bei mir eingefügt. Nach einer Weile rumprobieren bekam ich die Anweisung auch zum erwünschten Erfolg und konnte sie auf eine SELECT LEAST erweitern. Nun sind mir auf dem Weg zum Erfolg die Apostrophe aufgefallen, die eben nicht wie die gewöhnlichen aussehen. Das allerkomischte ist nun, dass die Anweisung NUR mit diesen merkwürdigen Apostrophen funktioniert und nicht mit den herkömmlichen. Ich habe auch schon (im Testfile) ein header("Content-Type: text/html; charset=utf-8"); gesetzt, hat aber nichts genützt. Und vorher das File/den Code im Editor in UTF-8 gesetzt. Server ist ein Apache, kein Windows.

    Die merkwürdigen Apostrophe sehen so aus: `
    Die herkömmlichen Apostrophe sehen so aus: '
    Ein klitzekleiner Unterschied der die PHP Funktion zum laufen bringt oder killt.
    Kann mit das mal bitte einer erklären?

  • Ich widerspreche in diesem Fall einmal vorsichtig.

    Das hat im Fall SQL-Anqweisung mit PHP nicht wirklich etwas mit Systemanweisungen zu tun. In PHP werden Tabellen und Spaltenbezeichnungen, die als SQL-Statement dienen zwischen Backticks gestellt. So wäre es die korrekte Syntax.

    Dass PHP bei SQL-Anweisungen hin und wieder fehlende Backticks ignoriert hat nichts damit zu tun, wie die korrekte Syntax eigentlich sein SOLLTE, PHP erlaubt da nur Schlampigkeit.

    Auch Singlequotes haben eine feste Bedeutung und können (wenn sie fehlen) unterschiedliche Ergebnisse liefern
    Bsp:

    PHP
    $sql = 'SELECT `feld1`, `feld2` FROM `'.$db_name.'`.`tabelle` WHERE `tabelle`.`feld1` = \''.$suchert.'\' LIMIT 1';


    Unterscheidet sich ganz erheblich von

    PHP
    $sql = 'SELECT `feld1`, `feld2` FROM `'.$db_name.'`.`tabelle` WHERE `tabelle`.`feld1` = '.$suchert.' LIMIT 1';

    Fall1:
    Ist feld1 INT, und $suchwert '3a' wird der Datensatz gefunden, der im feld1 den Wert 3 hat, obwohl $suchwert eigentlich ein String ist. Die Singlequotes vor und nach dem Suchwert veranlassen SQL den Übergabewert nach INT zu casten.

    Fall2
    Ist feld1 INT und $suchwert='3a' gibt es einen Fehler, weil eine Zahl als Suchwert erwartet wird.

    Ähnliche Fehler werden immer wieder bei Single und Double-Quotes gemacht.

    PHP
    $a = 4711;
    echo 'Die Zahl lautet $a';
    echo "Die Zahl lautet $a";
    echo "Die Zashl lautet ".$a;
    
    
    // oder besser noch
    echo '$a';
    echo "$a";
    echo $a;


    Ein nicht ganz triviales Thema, das immer wieder heftig, mit unterschiedlichsten Ansichten diskutiert wird. Das erste echo ist klar, aber die beiden nachfolgenden (also welche die richtige Schreibweise ist) scheinen eine Religionsansicht zu sein :roll:

  • Das sollte natürlich keine Klugscheisserei sein.

    Nicht korrekte Syntax (in diesem speziellen Fall wird das Statement ja dann von der MYSQL-Datenbank verarbeitet) ist oft der Grund, wieso Scripte in PHP 4.x laufen und unter 5.x dann nicht mehr.
    Ich persönlich finde das Suchen nach solchen Syntaxfehlern generell anstrengender als den Code gleich neu zu schreiben.