PHPStan literal-string, non-empty-string

Kalfi
Člen | 10
+
0
-

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.

MajklNajt
Člen | 471
+
+3
-

Odhliadnuc od toho, že si zarábaš na SQL injection, skús ten dotaz dať do premennej a do metódy dosadiť premennú

Marek Bartoš
Nette Blogger | 1165
+
+3
-

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 | 10
+
0
-

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 | 8109
+
+8
-

Ten literal-string tam právě kvůli tomu je, jsem rád, že to zafungovalo.

kiCkZ
Člen | 153
+
0
-

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)

David Grudl
Nette Core | 8109
+
+1
-

Tuším ?n, mrkni do dočká.