Ich habe ein Array wie dieses
%Vor%Wenn ich einen Var-Dump mache, bekomme ich das - & gt;
%Vor%Jetzt versuche ich, dies mit der IN-Anweisung -
zur DB hinzuzufügen %Vor%Das Problem, das ich habe ist, dass implode eine Zeichenfolge zurückgeben. Die 'Telefon'-Spalte ist jedoch eine Ganzzahl in der Datenbank und das Array speichert sie als Integer. Daher bekomme ich den SQL-Fehler, da meine letzte Abfrage so aussieht -
%Vor%Was ist eine falsche Abfrage? Gibt es einen Weg um es herum.
Meine Spaltennamen sind dynamisch basierend auf dem, was der Benutzer einfügen möchte. Daher kann ich die Platzhalter nicht verwenden, wie : phone und : image , da ich möglicherweise nicht immer Werte für diese beiden Spalten erhält. Bitte lassen Sie mich wissen, ob es einen Weg gibt. Ansonsten muss ich für jede Art von Update mehrere Funktionen definieren.
Danke.
Als ich das letzte Mal nachprüfte, war es nicht möglich, eine Aussage zu erstellen, bei der die betroffenen Spalten zur Vorbereitung unbekannt waren - aber dieses Ding scheint zu funktionieren - vielleicht ist Ihr Datenbanksystem fehlerverzeihender als die, die ich benutze (hauptsächlich Postgres) / p>
Was eindeutig falsch ist, ist die implode () - Anweisung, da jede Variable von ihr selbst behandelt werden muss, benötigen Sie auch Klammern um die Feldliste in der insert-Anweisung.
Um benutzerdefinierte Felder einzufügen, denke ich, dass Sie so etwas tun müssen (zumindest so, wie ich es tue);
%Vor%Wenn Sie den Feldnamen in $ a nicht vertrauen können, müssen Sie etwas wie
tun %Vor%Wo validfields eine Funktion ist, die Sie schreiben, die jeden Feldnamen testet und prüft, ob sie gültig ist (schnell und schmutzig, indem Sie ein assoziatives Array $ valfields = array ('name' = & gt; 1, 'email' = & gt; 1 , 'Telefon' = & gt; 1 ... und dann nach dem Wert von $ valfields [$ f] oder (wie ich es vorziehen würde) durch Abrufen der Feldnamen vom Server suchen)
SQL-Abfrageparameter können nur dort verwendet werden, wo Sie sonst einen Literalwert angeben würden.
Wenn Sie also sehen könnten, dass Sie an dieser Stelle in der Abfrage ein String-Literal, Datumsliteral oder ein numerisches Literal in Anführungszeichen setzen, können Sie einen Parameter verwenden.
Sie können keinen Parameter für einen Spaltennamen, einen Tabellennamen, eine Liste von Werten, ein SQL-Schlüsselwort oder andere Ausdrücke oder Syntax verwenden.
In diesen Fällen müssen Sie immer noch Inhalt in die SQL-Zeichenfolge interpolieren, sodass Sie ein gewisses Risiko einer SQL-Injektion haben. Der beste Schutz dagegen besteht darin, die Spaltennamen mit Whitelisting zu versehen und alle Eingaben abzulehnen, die nicht mit der Whitelist übereinstimmen.
Weil alle anderen Antworten SQL injection zulassen. Für Benutzereingaben müssen Sie nach erlaubten Feldnamen filtern:
%Vor%Ich schätzte MortenSickel's Antwort, aber ich wollte die benannten Parameter verwenden, um auf der sicheren Seite zu sein:
%Vor%Ich weiß, dass diese Frage schon vor langer Zeit beantwortet wurde, aber ich habe sie heute gefunden und habe neben der Antwort von @MortenSickel einen kleinen Beitrag dazu geleistet.
In der folgenden Klasse können Sie ein assoziatives Array in Ihre Datenbanktabelle einfügen oder aktualisieren. Für weitere Informationen über MySQL PDO besuchen Sie bitte Ссылка
%Vor%Verwendung der dbConnection-Klasse:
%Vor%