Joomla-DB-API: Frage zu Prepared Statement versus plumpem Typecasting

  • In einem GiHub-Pull-Request wurde darum gebeten, dass in einer Datenbankabfrage die Zeile

    Code
    1. $query->where($db->quoteName('usergroupmap.group_id') . ' = ' . (int) $groupIds);

    in ein Prepared Statement umgeschrieben werden soll, also statt Typumwandlung "(int) $groupIds" so:

    Code
    1. $query->where($db->quoteName('usergroupmap.group_id') . ' = :group_id')
    2. ->bind(':group_id', $groupIds, ParameterType::INTEGER);

    Prepared Statements sind mir bekannt, ich verstehe in diesem Fall nur nicht, was die Vorteile in diesem Joomla-Umfeld sind. Einfach "Best practice" oder steckt mehr dahinter?


    SniperSister Da du um die Änderung gebeten hast, vielleicht kannst mir einen kurzen Tipp geben, warum. Danke.

  • Meine Vermutung: Das Casten kann im ersten Fall zu einer falschen Datenbankabfrage führen.


    Wenn du beispielhaft einen String 'ab123' als int castes kommt dort einfach '0' raus. Das würde in der ersten Abfrage zu einer Bedingung where group_id = 0 führen. Bei der zweiten Variante würde ein Fehler geworfen, weil der Parameter nicht den richtigen Datentypen hat.

    Das wäre so meine Idee! Habe ich mit dem Code mal eben getestet:


    PHP
    1. <?php
    2. $testA = 'ab123';
    3. $testB = (int)$testA;
    4. var_dump($testB);
    5. ?>

    Ergebnis ist so:

    int(0)


    Das würde meine Vermutung untermauern...

  • Leider doch nicht.


    Wenn ich die Codes vergleiche, verhalten die sich von der Ausgabe komplett identisch, wenn ich die 3 $id nacheinander durchspiele:


    (quoteName etc. habe ich absichtlich weggelassen)