Richtige Weg, um bind-Parameter mit Hilfe von MySQL "IN" syntax in Yii2?
Ok, ich bin mit Yii2
und ich bin vertraut mit der Vorbereitung/binden von Daten bei der Verwendung von mysql-Abfragen, wie:
$sql = $this->db->createCommand("UPDATE some_table SET something='foo' WHERE some_id=:some_id");
$sql->bindValue(':some_id', $some_id);
Aber was ist, wenn der Wert kann mehrere Werte enthalten, wie bei der Verwendung der MySQL
syntax IN
?
Beispiel:
$sql = $this->db->createCommand("UPDATE some_table SET something='foo' WHERE some_id IN (:parents)");
$sql->bindValue(':parents', $parents);
Nun, wie ich verstehe, das würde nur gut funktionieren, wenn die $parents
var hatte nur eine Wert; aber wenn es mehrere Werte wie 1,2,3
dann würden Sie am Ende mit etwas wie '1,2,3'
wenn Sie wirklich wollen '1','2','3'
ODER 1,2,3
.
Was ist der richtige Weg, dies zu tun?
- anstelle der Beratung bei Themen, die Sie nicht kennen, dann Lesen Sie das Handbuch, bevor Sie geben.
- mögliche Duplikate von Kann ich das binden eines array zu einer IN () - Zustand?
- Dies ist in der Tat ein Duplikat von meinem problem. Dank Brett
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie einfach Yii ' s QueryBuilder Funktionen und alles wird automatisch behandelt werden. Versuchen Sie dies:
Das Ergebnis:
['and', ['not', ['some_id' => [1, 2, 3]]], ['some_field' => 2]]
. Siehe Spezifikation yiiframework.com/doc-2.0/yii-db-query.html#where()-detailIch gefunden habe, diese Lösung
Yii2 die DB-Funktionen basieren auf
PDO
.Nach der Anleitung von
bindValue
es gibt keine Unterstützung Wert vonArray
geben. (Dritter parameter -data_type
).Die Lösung ist, erstellen Sie eine Zeichenfolge vor der Abfrage, das passt zu Ihr
IN
- Klausel und binden Sie es wie ein string.Etwas wie:
Bearbeiten
Scheint es, dass der Platzhalter wird ersetzt durch den implodiert array als einen string-Wert
'1,2,3'
statt'1','2','3'
(da es eine einmalige Platzhalter).Um dieses Problem zu lösen, werde ich vorschlagen, über das mehrere
?
Platzhalter.Also anstatt
IN (:parents)
Sie hätteIN (?, ?, ?, ? ,....)
, und da haben wir bereits ein array angeordnet - wir könnencount($array)
zu wissen, wie viel Platzhalter, die wir brauchen, um zu stellen.Bitte beachten Sie die übergebene Wert des ersten Parameters von bindValue;
Es ist aus dem Grund
$i+1
und nicht$i
erwähnt im Handbuch:Weitere Informationen und alternative Lösungen, betrachten die folgende Antwort:
https://stackoverflow.com/a/920523/998096
'1,2,3'
?1,2,3
nicht'1,2,3'
und die Abfrage funktioniertbindValue
Ursache der Wert, zitiert zu werden obwohl?IN
; ich glaube, ich war mehr auf der Suche nach einer robusten Lösung und nicht nur für diese Besondere situation.'1,2,3'
und funktionierte nicht richtig.?
Platzhalter. Ich werde mein edit beantworten.Landete ich mache es so:
Wo
$this->db
ist eine Instanz vonYii::$app->db
.Wenn Daten VERTRAUENSWÜRDIGEN, diese Lösung funktioniert ziemlich gut:
'
oder ` am Ende der Zeichenkette. Würde ich nicht verwenden, das für alles, außer den ganzen zahlen.Wenn jemand eine Lösung braucht für Yii1:
Nur tun
Sollte wahrscheinlich den trick tun.
'1','2','3'
.