Mysql – funkční dotaz nejde v nette

n.u.r.v.
Člen | 485
+
0
-

Ahoj, mám tento sql dotaz který když spustím např. vy MySQL Wokrbench, tak funguje a dělá to co chci (kopíruje v rámci jedné tabulky vybrané položky z jednoho seznamu do dalších s podmínkou že v cílovém seznamu je max 49 položek a ignorují se duplicity):

foreach ($destinationCLList as $destinationCL) {
                $this->database->queryArgs("INSERT INTO user_list_item(CL, CX, ITEM_TYP, NAME, DESCRIPTION, NICE_URL, DATE)
                                            (SELECT ? AS CL, CX, ITEM_TYP, NAME, DESCRIPTION, NICE_URL, DATE
                                            FROM user_list_item CLI1
                                            WHERE CL =? AND CLI IN (?)
                                            AND ? > (SELECT count(CLI) FROM user_list_item WHERE CL =?)
                                            AND NOT EXISTS (SELECT 1 FROM user_list_item CLI2 WHERE CL =? AND CLI2.CX = CLI1.CX))", array($destinationCL, (int)$sourceCL, $cliList, $maxListItem, $destinationCL, $destinationCL));
            }

Problém je že mě to nejde odpálit v nette když tam mám AND CLI IN (?). Dostanu chybu
Invalid argument supplied for foreach() v File: …\nette\database\src\Database\SqlPreprocessor.php:180

Když do sql dosadím do IN () ty hodnoty přímo ručně, tak to funguje. předaný parametr $cliList je pole.

Je chyba v nette, nebo něco zapisuji blbě? Můžete mě poradit, docela to spěchá. Díky moc!

Zuben45
Člen | 268
+
0
-

a jsou v poli data ?

n.u.r.v.
Člen | 485
+
0
-

ano jsou – viz.: http://nurv.cz/tracy.png

Editoval n.u.r.v. (14. 8. 2017 2:20)

n.u.r.v.
Člen | 485
+
0
-

když nepoužiji queryArgs ale jen query tak to funguje:

foreach ($destinationCLList as $destinationCL) {
                $this->database->query("INSERT INTO user_list_item(CL, CX, ITEM_TYP, NAME, DESCRIPTION, NICE_URL, DATE)
                                            (SELECT ".((int)$destinationCL)." AS CL, CX, ITEM_TYP, NAME, DESCRIPTION, NICE_URL, DATE
                                            FROM user_list_item CLI1
                                            WHERE CL = ".((int)$sourceCL)." AND CLI IN (". implode(',', $cliList).")
                                            AND ".((int)$maxListItem)." > (SELECT count(CLI) FROM user_list_item WHERE CL =".((int)$destinationCL).")
                                            AND NOT EXISTS (SELECT 1 FROM user_list_item CLI2 WHERE CL =".((int)$destinationCL)." AND CLI2.CX = CLI1.CX))");
                /*$this->database->queryArgs("INSERT INTO user_list_item(CL, CX, ITEM_TYP, NAME, DESCRIPTION, NICE_URL, DATE)
                                            (SELECT ? AS CL, CX, ITEM_TYP, NAME, DESCRIPTION, NICE_URL, DATE
                                            FROM user_list_item CLI1
                                            WHERE CL =? AND CLI IN (?)
                                            AND ? > (SELECT count(CLI) FROM user_list_item WHERE CL =?)
                                            AND NOT EXISTS (SELECT 1 FROM user_list_item CLI2 WHERE CL =? AND CLI2.CX = CLI1.CX))", array($destinationCL, (int)$sourceCL, $cliList, $maxListItem, $destinationCL, $destinationCL));*/
            }

Jenže takhle by se to asi dělat nemělo… V queryArgs se tam asi nette snaží ten dotaz upravit (kvůli insertu)???

Tady ještě posílám odkaz na stažení db tabulek s ukázkovými daty a php kod: http://nurv.cz/sample.zip

Edit: když nechám původní variantu (s queryArgs), ale CLI IN dosadím přímo (pomocí implode), tak to funguje… takže opravdu nejde jen varianta IN(?)

Editoval n.u.r.v. (14. 8. 2017 10:38)

n.u.r.v.
Člen | 485
+
0
-

nikoho nic nenapadá? můžu tedy alespoň nechat dosazené hodnoty ručně, nebo to je špatně?