Citace od: Filip Jirsák kdy 09. 05. 2019, 08:58:26Citace od: Kamil Podlešák kdy 09. 05. 2019, 07:58:47Děkuji za názornou ukázku toho, proč by se měli lidé rovnou učit používat bindování parametrů. To, co jste napsal, je celé špatně. Ten odvozený řetězec v PHP triviálně vytvoříte kódem "%" . $querystr . "%". Mně ten kód v PHP připadá asi tak stokrát čitelnější, než libovolné skládání v SQL.
S tím vším se dá jen souhlasit, má to ale jeden praktický háček: v tomto konkrétním případě se nepoužívá hodnota přímo, ale odvozený řetězec (jsou tam přidaná procenta na začátek a konec).
Takže jedině něco jako:Kód [Vybrat]
SELECT * FROM users WHERE firstname LIKE '%'||?||'%' OR lastname LIKE '%'||?||'%'Citace od: Kamil Podlešák kdy 09. 05. 2019, 07:58:47V každé databázi ne, jenom v těch, které neumí LIKE přeložit na použití fulltextového indexu. Relační databáze to sice většinou nedělají a raději vás nechají použít speciální operátory pro fulltext, ale nezapomeňte, že i spousta NoSQL databází umožňuje používat pro dotazování jazyk SQL.
V každém případě: tento dotaz vždy a v každé databázi dělá FULL TABLE SCAN! Takže pokud tam někdy bude netriviální množství uživatelů, tak se databáze utaví. Na druhou stranu, pravděpodobnost je asi malá :-)
Kód [Vybrat]
$lastnameParam = '%' . $lastname . '%';
$sth = $dbh->prepare("SELECT * FROM users WHERE firstname OR lastname LIKE :lastname");
$sth->bindParam(':lastname', $lastnameParam, PDO::PARAM_STR);
$sth->execute();