PHPStan literal-string, non-empty-string
- Kalfi
- Člen | 14
Ahoj,
narazil jsem na problém s testováním kódů v PHPStan. Nikde jsem nenašel žádné řešení, tak to zkusím zde. Při testování s PHPStan level 5 a výše mi to u jedné metody vyhodí tuto chybu:
------ -------------------------------------------------------------------------------------------------------------------
Line Model\SessionManager.php
------ -------------------------------------------------------------------------------------------------------------------
55 Parameter #1 $sql of method Nette\Database\Explorer::fetchPairs() expects literal-string, non-empty-string given.
------ -------------------------------------------------------------------------------------------------------------------
Řádek 55 obsahuje:
return $this->database->fetchPairs('
SELECT '.self::COLUMN_SESSION.', '.self::COLUMN_SAMACCOUNTNAME.'
FROM '.self::TABLE_NAME.'
WHERE '.self::COLUMN_SESSION.' IN ('.$in.')
');
Kód je normálně funkční a vygeneruje:
SELECT session, samaccountname
FROM sessions
WHERE session IN ('sess_7a4npjblrir0lhc8s8qnt03v6k')
Kód vykoná co má, jen PHPStan vyhodí tuto chybu. Za případnou pomoc nebo nakopnutí děkuji.
- Marek Bartoš
- Nette Blogger | 1274
literal-string je string neobsahující žádné proměnné. Možná ti projde to spojování s konstantami, ale rozhodně bys tam neměl mít $in. Přečti si něco o sql injection a prepared statements – kvůli tomu jsi varován, že by měl string být literal.
I přímo v dokumentaci Nette je velké červené varování že tohle
nemáš dělat a nad tím vysvětlení, jak se to dělá správně
https://doc.nette.org/…atabase/core#…
- Kalfi
- Člen | 14
MajklNajt napsal(a):
Odhliadnuc od toho, že si zarábaš na SQL injection, skús ten dotaz dať do premennej a do metódy dosadiť premennú
Ahoj, je to vyřešeno díky moc MajklNajt. Chtělo to nakonec vyřešit oba problémy najednou. Když jsem uložil dotaz do proměnné, tak PHPStan stále hlásil tu chybu. Až když jsem ošetřil SQL injection, tak chyba zmizela. Ještě jednou děkuji.
$sql = '
SELECT '.self::COLUMN_SESSION.', '.self::COLUMN_SAMACCOUNTNAME.'
FROM '.self::TABLE_NAME.'
WHERE '.self::COLUMN_SESSION.' IN (?)
';
return $this->database->fetchPairs($sql, $in);
- David Grudl
- Nette Core | 8227
Ten literal-string
tam právě kvůli tomu je, jsem rád, že to
zafungovalo.
- kiCkZ
- Člen | 153
David Grudl napsal(a):
Ten
literal-string
tam právě kvůli tomu je, jsem rád, že to zafungovalo.
@DavidGrudl souhlasim, nicméně jak se má třeba používat
$this->database->query('ALTER TABLE ? ADD ? ?;', $tableName, $columnName, $datatype)
Kde pak dojde k problému se syntaxí sql pro MariaDB ?
Editoval kiCkZ (15. 8. 2022 11:20)