PDO PHP aus einem assoziativen Array in DB einfügen

8

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.

    
Fox 22.11.2012, 07:13
quelle

6 Antworten

8

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)

    
MortenSickel 22.11.2012, 07:51
quelle
6

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.

    
Bill Karwin 22.11.2012 08:06
quelle
3

Weil alle anderen Antworten SQL injection zulassen. Für Benutzereingaben müssen Sie nach erlaubten Feldnamen filtern:

%Vor%     
PiTheNumber 02.06.2016 12:11
quelle
2

Sie können die Felder :phone und :image im Voraus tatsächlich mit Nullwerten verknüpfen. Die Struktur der Tabelle ist sowieso festgelegt und du solltest es wahrscheinlich auch bekommen.

Aber die Antwort auf Ihre Frage könnte so aussehen:

%Vor%     
Alex 22.11.2012 08:45
quelle
2

Ich schätzte MortenSickel's Antwort, aber ich wollte die benannten Parameter verwenden, um auf der sicheren Seite zu sein:

%Vor%     
Joseph Heininge 21.05.2015 22:58
quelle
2

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%     
Teun Ouwehand 07.01.2015 18:26
quelle

Tags und Links