Korrekte Art, Parameter mit der MySQL "IN" -Syntax in Yii2 zu binden?

8

Ok, ich benutze Yii2 und ich bin vertraut mit der Vorbereitung / Bindung von Daten bei der Verwendung von MySQL Abfragen, wie zum Beispiel:

%Vor%

Aber was ist, wenn der Wert mehrere Werte enthalten darf, z. B. bei Verwendung der MySQL Syntax IN ?

Zum Beispiel:

%Vor%

Nun, ich verstehe, dass das obige nur funktionieren würde, wenn $parents var nur eins -Wert hätte; Aber wenn es mehrere Werte wie 1,2,3 hätte, dann würden Sie etwas wie '1,2,3' haben, wenn Sie wirklich '1','2','3' OR 1,2,3 wollen.

Was ist der richtige Weg, dies zu tun?

    
Brett 02.05.2015, 09:03
quelle

6 Antworten

0

Ich habe es so gemacht:

%Vor%

Dabei ist $this->db eine Instanz von Yii::$app->db .

    
Brett 03.05.2015, 09:15
quelle
5

Sie können einfach die QueryBuilder-Funktionen von Yii verwenden und alles wird automatisch bearbeitet. Versuchen Sie Folgendes:

%Vor%

Das Ergebnis:

%Vor%     
laszlovl 05.05.2015 21:10
quelle
3

Die DB-Funktionen von Yii2 basieren auf PDO . Gemäß dem Handbuch von bindValue gibt es keine Unterstützung für den Wert von Array type. (Dritter Parameter - data_type ).

Die Lösung besteht darin, vor der Abfrage eine Zeichenfolge zu erstellen, die zu Ihrer IN -Klausel passt und sie als Zeichenfolge bindet.

Etwas wie:

%Vor%

Bearbeiten

Es scheint, dass der Platzhalter, der durch das implodierte Array ersetzt wird, als ein Zeichenfolgenwert '1,2,3' anstelle von '1','2','3' verwendet wird (da es sich um einen einzelnen Platzhalter handelt).

Um dieses Problem zu lösen, schlage ich vor, die mehreren ? Platzhalter zu verwenden. Anstatt also IN (:parents) zu haben, hätten Sie IN (?, ?, ?, ? ,....) , und da wir bereits ein geordnetes Array haben, können wir count($array) verwenden, um zu wissen, wie viele Platzhalter wir einfügen müssen.

%Vor%

Bitte beachten Sie den übergebenen Wert des ersten Parameters von bindValue; Der Grund dafür ist $i+1 und nicht $i , die im Handbuch erwähnt werden:

  

Für eine vorbereitete Anweisung, die Platzhalter für Fragezeichen verwendet, wird dies der Fall sein   sei die 1-indizierte Position des Parameters.

Weitere Informationen und alternative Lösungen finden Sie in der folgenden Antwort: Ссылка

    
Ofir Baruch 02.05.2015 09:27
quelle
3

Ich habe diese Lösung gefunden

%Vor%     
Rjazhenka 25.05.2016 12:32
quelle
0

Wenn Daten VERTRAUEN sind, funktioniert diese eine Lösung ziemlich gut:

%Vor%     
Alliswell 22.01.2018 11:07
quelle
-2

Tu es einfach

%Vor%

Sollte wahrscheinlich den Trick machen.

    
shyyawn 03.05.2015 08:55
quelle

Tags und Links