Proměnný název sloupce v kombinaci s IN()

deextaar
Člen | 4
+
0
-

Zdravím,
chtěl bych se zeptat, používám v databaseCore místo názvu tabulek, sloupců, zástupný symbol ?name.
Neměl jsem s tím dosud problém, nicméně při použití v kombinací s IN () dochází ke špatnému dosazení hodnot.
Pokud použiji WHERE ?name IN(?), je po spuštění z nějakého důvodu dosazeno WHERE id IN ((?) AND (?)) .
Pokud ?name nahradím přímo názvem sloupce, jsou hodnoty dosazeny jak mají WHERE id IN(?, ?) .

Je toto nějaká chyba, nebo dělám něco špatně ? Tabulku dosazuji také přes zástupný symbol, ale to na funkci vliv nemá.

Díky

Editoval deextaar (2. 10. 2021 22:48)

Michal Kumžák
Člen | 106
+
0
-

Můžeš sem dát celý ten zdroj toho sql dotazu? A hodnoty co do něj posíláš.

deextaar
Člen | 4
+
0
-

Michal Kumžák napsal(a):

Můžeš sem dát celý ten zdroj toho sql dotazu? A hodnoty co do něj posíláš.

Jasné.
Například při takovémto použití to dělá. Pokud místo ?name dám rovnou název sloupce, dotaz je v pořádku

$arrayWithValues=array(1,2);
        $nazevSloupce="user_id";
        bdump($this->database->query("SELECT * FROM users WHERE ?name IN(?)",$nazevSloupce,$arrayWithValues));
romco
Člen | 4
+
0
-

deextaar napsal(a):

Michal Kumžák napsal(a):

Můžeš sem dát celý ten zdroj toho sql dotazu? A hodnoty co do něj posíláš.

Jasné.
Například při takovémto použití to dělá. Pokud místo ?name dám rovnou název sloupce, dotaz je v pořádku

$arrayWithValues=array(1,2);
        $nazevSloupce="user_id";
        bdump($this->database->query("SELECT * FROM users WHERE ?name IN(?)",$nazevSloupce,$arrayWithValues));

Ahoj no neviem či to bude zrovna najčistejší kód ale skús tento zápis , lebo výčty , teda IN() sa zapisujú inak

$this->database->query("SELECT * FROM users WHERE" , [$nazevSloupce => $arrayWithValues]);

Editoval romco (5. 10. 2021 1:24)

deextaar
Člen | 4
+
0
-

Ano díky, tímto způsobem to funguje. Nicméně právě v dokumentaci je hned ze začátku uvedeno použití IN způsobem, který zde používám https://doc.nette.org/…atabase/core#… a nevidím úplně důvod proč by to s sloupcem jako proměnnou nemělo fungovat.

romco
Člen | 4
+
0
-

deextaar napsal(a):

Ano díky, tímto způsobem to funguje. Nicméně právě v dokumentaci je hned ze začátku uvedeno použití IN způsobem, který zde používám https://doc.nette.org/…atabase/core#… a nevidím úplně důvod proč by to s sloupcem jako proměnnou nemělo fungovat.

Lebo ?name IN(?) nie je to isté ako výraz stlpec IN(?)
Takto vyhodnotí tie query výrazy

SELECT * FROM tab WHERE ?name IN(?) // "SELECT * FROM tab WHERE [meno] IN((?) AND (?))" - toto je čo skúšaš, takto to vyhodnotí a preto ti to nejde
SELECT * FROM tab WHERE ?name = ?   // "SELECT * FROM tab WHERE [meno] = ?"
SELECT * FROM tab WHERE meno = ?    // "SELECT * FROM tab WHERE meno = ?"
SELECT * FROM tab WHERE meno IN(?)  // "SELECT * FROM tab WHERE meno IN(?, ?)"
SELECT * FROM tab WHERE ,  [ $nazovStlpca => $pole] // "SELECT * FROM tab WHERE ([meno] IN (?, ?))"
nightfish
Člen | 518
+
0
-

Popsané chování se děje v nette/database do verze 3.0.7. Od verze 3.1.0 již pro ?name IN ? generuje dotaz správně. Takže pokud můžeš, aktualizuj, pokud ne, nezbyde než použít některý z výše popsaných workaroundů.

deextaar
Člen | 4
+
0
-

ok, díky všem