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.

Člen

Zobrazeno 11 zpráv z 11.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
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.