Ankündigung

Einklappen
Keine Ankündigung bisher.

Prepared Statements mit PHP

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Prepared Statements mit PHP

    Hallo. Ich habe eine Umsetzung von Prepared Statements gefunden, die mir nicht ganz einleuchtet.

    Eine Beispiel eines SQL-Statements geht so:
    PHP-Code:
    $id 1;
    $column2 $_REQUEST['col2'];
    $column3 $_REQUEST['col3'];
    $column4 $_REQUEST['col4'];

    $DB->Update('INSERT INTO `table` VALUES (?,?,?,?)', array($id$column2$column3$column4 )); 
    Die Benutzereingaben werden als Array an die Update-Methode übergeben.
    In den SQL-String werden dann die Elemente des Arrays eingefügt.

    PHP-Code:
    class DB
    {
        public function 
    Update($query$binds = array() )
        {
            
    $query $this->Prepare($query$binds);
            
    $result mysql_query($query);

            
    //error check + return der affected_rows
        
    }

        public function 
    Prepare($query$binds = array() )
        {
            if( empty(
    $binds) )
            {
                return 
    $query;
            }
            
            
    $query_result '';
            
    $index 0;

            
    $pieces preg_split('~(\?|#)~'$query, -1PREG_SPLIT_DELIM_CAPTURE);
            foreach( 
    $pieces as $piece )
            {
                if( 
    $piece == '?' )
                {
                    if( 
    $binds[$index] === null )
                    {
                        
    $query_result .= 'NULL';
                    }

                    else
                    {
                        
    $query_result .= "'" mysql_real_escape_string($binds[$index]) . "'";
                    }

                    
    $index++;
                }
                else
                {
                    
    $query_result .= $piece;
                }
            }

            return 
    $query_result;
        }

    Mal ganz abgesehen davon, dass $_REQUEST benutzt wird, sehe ich keinen großen Zusatznutzen im Vergleich zur gewöhnlichen Implementierung mit Übergabe des fertigen SQL-Strings.
    Die Variablen werden lediglich escaped. Mir leuchtet der Nutzen des ganzen nicht ein, ausser dass das Escapen eben in der Klasse vorgenommen wird...

  • #2
    Das sind eben keine richtigen prepared statements, sondern nur eine Art „Workaround“. Die Übergabe an die Datenbank erfolgt nach wie vor in einem Textstring.

    Was echte prepared statements sind, und wo deren Vorteile liegen, ist klar?
    [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

    Kommentar


    • #3
      Ich habe darüber gelesen. Was intern in PDO abläuft, weiss ich nicht recht. Ich nehme an, das wird schon so ähnlich wie oben aussehen, nur dass es sich bei PDO eben um eine Abfrage handelt, die zwischengespeichert wird.

      Ich habe mich eben nur gefragt, ob obiges Beispiel ein verbreitetes Design Pattern ist?
      Und ob es vielleicht einen Nutzen gibt, den ich übersehe? (Wie gesagt, würde man es nicht so machen, dann müsste man die Variablen vor Einbettung in den SQL-String eben escapen oder anders überprüfen.)

      Kommentar


      • #4
        Na das ist doch schon mal ein Nutzen. Übersichtliche Queries ebenso.
        [COLOR="#F5F5FF"]--[/COLOR]
        [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
        [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
        [COLOR="#F5F5FF"]
        --[/COLOR]

        Kommentar

        Lädt...
        X