Diskuze: PDO - získat počet řádků v tabulce
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 11 zpráv z 11.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
A když to uděláš takto:
$stm = $pdo->query('
SELECT count(user_id)
FROM user
WHERE user_id LIKE ?
OR user_name LIKE ?
OR user_mail LIKE ?
');
$res = $stm->execute(array($search_field, $search_field, $search_field));
if ($res) {
$total = $stm->fetch(PDO::FETCH_ASSOC);
}
Taky nic. Vyhodí chybu:
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]:
Syntax error or access violation: 1064 You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right
syntax to use near '? OR user_name LIKE ? OR user_mail LIKE ?' at line 3' in
/admin/user_table.php:37 Stack trace: #0 /admin/user_table.php(37):
PDO->query('\r\n SELECT co...') #1 {main} thrown in /admin/user_table.php
on line 37
Kde řádek 37 obsahuje právě : ');
chtěl jsem poradit. ale už jsi to zkoušel...
Teď mi trochu chodí tohle:
$search = '%'.$_GET['search'].'%';
$select = $pdo->prepare("
SELECT count(user_id) FROM user
WHERE user_id LIKE :searching1 OR
user_name LIKE :searching2 OR
user_mail LIKE :searching3
");
$select->bindParam(':searching1', $search);
$select->bindParam(':searching2', $search);
$select->bindParam(':searching3', $search);
$select->execute();
$total = $select->fetchColumn();
Ale hodí to chybu,když to nic v tabulce nenajde. Nevím proč ...
Jedna věc - když používáš pojmenované identifikátory (:searching), pak je nemusíš dělat 3x, ale stačí pouze jeden.
Jakou chybu to hodí? Pokud v tabulce není žádný takový záznam, fetchColumn() by mělo vrátit FALSE.
No když ho dám jednou tak to nechodí.
Ale mohl bych to asi napsat lépe třeba takto :
$word = "%$_GET[search]%";
$select = $pdo->prepare("SELECT count(user_id) FROM user
WHERE user_id=? OR user_name LIKE ? OR user_mail LIKE ?
");
$select->execute(array($_GET[search], $word, $word));
Nicméně hodí mi to chybu :
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]:
Syntax error or access violation: 1064 You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right
syntax to use near '-2' at line 6' in /admin/user_table.php:122 Stack trace:
#0 /admin/user_table.php(122): PDOStatement->execute() #1 {main} thrown in
/admin/user_table.php on line 122
Ale to už je asi další problém na úrovni zobrazení výsledku.
To provádí tenhle kod:
$stmt = $pdo->prepare('
SELECT `user_id`,`user_name`,`user_mail`,`user_level`,`date`,`last_login`,`count_login`
FROM user
WHERE user_id LIKE :searching11 OR user_name LIKE :searching22 OR user_mail LIKE :searching33
ORDER BY user_id DESC
LIMIT :limit
OFFSET :offset
');
$stmt->bindParam(':searching11', $search, PDO::PARAM_INT);
$stmt->bindParam(':searching22', $search, PDO::PARAM_INT);
$stmt->bindParam(':searching33', $search, PDO::PARAM_INT);
$stmt->bindParam(':limit', $limit, PDO::PARAM_INT);
$stmt->bindParam(':offset', $offset, PDO::PARAM_INT);
$stmt->execute();
}
Kde řádek 122 je právě : $stmt->execute();
No a proč u toho
$select->execute
v prvnim parametru nedas rovnou
$word
?
Tedy:
$word = ˙%˙ . $_GET[˙search˙] . ˙%˙;
$select = $pdo->prepare("SELECT count(user_id) FROM user
WHERE user_id=? OR user_name LIKE ? OR user_mail LIKE ?
");
$select->execute(array($word, $word, $word));
A tomu druhemu kodu bych upravil prvni příkaz na
$stmt = $pdo->prepare('
SELECT `user_id`,`user_name`,`user_mail`,`user_level`,`date`,`last_login`,`count_login`
FROM user
WHERE user_id LIKE :searching11 OR user_name LIKE :searching22 OR user_mail LIKE :searching33
ORDER BY user_id DESC,
LIMIT :limit,
OFFSET :offset
');
Kde u čárky za
LIMIT
si nejsem jistý.
Ještě by bylo lepší, kdyby jsi v těch dotazech všechny ty názvy řádků či sloupců dal do `` a COUNT velkým.
$word = ˙%˙ . $_GET[˙search˙] . ˙%˙;
$select = $pdo->prepare("SELECT COUNT(`user_id`) FROM `user`
WHERE `user_id`=? OR `user_name` LIKE ? OR `user_mail` LIKE ?
");
$select->execute(array($word, $word, $word));
Moc děkuji za rady. Každá taková je pro mě jako amatéra velký skok
kupředu ... Vypadá to,že mi to chodí. Teda ale pěkně jsem narazil s
pagingem a vyhledáváním hlavou do zdi.
... Možná by nebylo od
věci,kdyby tady vznikl nějaký článek na toto téma, protože pro laika jako
já je to dost vysoký level programování
Bez pomoci bych na to rozhodně
nepřišel ...
Ještě jednou díky za pomoc!
Zobrazeno 11 zpráv z 11.
