Mysql – funkční dotaz nejde v nette
- n.u.r.v.
- Člen | 485
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!
- n.u.r.v.
- Člen | 485
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)