IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: PDO - získat počet řádků v tabulce

Aktivity
Avatar
danhill
Člen
Avatar
danhill:8.3.2015 11:11

Ahoj, lámu si hlavu jak zjistím počet řádků v tabulce SQL kvůli pagingu v kombinaci s vyhledávání v tabulce.

První část, pokud není vyplněno vyhledávací pole mi krásně vyhodí počet řádků.

Ale v else dotazu,
jakmile zkusím něco vyhledat, tak to vyhodí chybu místo čísla.

$search_field = $_GET['search'];

//zjistím počet řádků (uživatelů) které budu stránkovat
if (empty($_GET["search"]))
{
$total = $pdo->query('
        SELECT count(user_id)
        FROM user
        ')->fetchColumn();
print $total;
}

//počet řádků pokud je něco ve vyhledávacím poli
else
{
$total = $pdo->query('
        SELECT count(user_id)
        FROM user
        WHERE user_id LIKE :searching OR user_name LIKE :searching OR user_mail LIKE :searching
        ');
$total->bindParam(':searching', $search_field, PDO::PARAM_INT);
$total->fetchColumn();

print $total;

//pokud je nalezeno více než 1 zobraz kolik, pokud je nalezeno 0 = nic nenalezeno
if ($total<1) {
              $zprava_R = 'Nebylo nic nalezeno !';
              }
         else {
              $zprava_G = 'Nalezeno: '.$total;
              }
}

Zkoušel jsem mnoho jiných zápisů, jako třeba:

$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));
        if ($res)
        $total = $stm->fetch(PDO::FETCH_ASSOC);

Ale nic mi nefunguje.
Jakmile mám ve WHERE nějakou proměnnou,tak mi to nechodí :(

Editováno 8.3.2015 11:13
Odpovědět
8.3.2015 11:11
Nikdy není tak zle, aby nemohlo být ještě hůře.
Avatar
Odpovídá na danhill
Michal Šmahel:8.3.2015 11:26

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);
}
Editováno 8.3.2015 11:27
Nahoru Odpovědět
8.3.2015 11:26
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
danhill
Člen
Avatar
Odpovídá na Michal Šmahel
danhill:8.3.2015 11:56

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_ta­ble.php:37 Stack trace: #0 /admin/user_ta­ble.php(37): PDO->query('\r\n SELECT co...') #1 {main} thrown in /admin/user_ta­ble.php on line 37

Kde řádek 37 obsahuje právě : ');

Nahoru Odpovědět
8.3.2015 11:56
Nikdy není tak zle, aby nemohlo být ještě hůře.
Avatar
David Hynek
Tvůrce
Avatar
Odpovídá na danhill
David Hynek:8.3.2015 12:03

chtěl jsem poradit. ale už jsi to zkoušel...

Editováno 8.3.2015 12:05
Nahoru Odpovědět
8.3.2015 12:03
Čím víc vím, tím víc věcí nevím.
Avatar
danhill
Člen
Avatar
Odpovídá na David Hynek
danhill:8.3.2015 12:12

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č ...

Nahoru Odpovědět
8.3.2015 12:12
Nikdy není tak zle, aby nemohlo být ještě hůře.
Avatar
Odpovídá na danhill
Martin Konečný (pavelco1998):8.3.2015 12:14

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.

Nahoru Odpovědět
8.3.2015 12:14
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
danhill
Člen
Avatar
danhill:8.3.2015 12:25

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_ta­ble.php:122 Stack trace: #0 /admin/user_ta­ble.php(122): PDOStatement->execute() #1 {main} thrown in /admin/user_ta­ble.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();

Editováno 8.3.2015 12:26
Nahoru Odpovědět
8.3.2015 12:25
Nikdy není tak zle, aby nemohlo být ještě hůře.
Avatar
adas
Tvůrce
Avatar
Odpovídá na danhill
adas:9.3.2015 16:39

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));
Editováno 9.3.2015 16:42
 
Nahoru Odpovědět
9.3.2015 16:39
Avatar
adas
Tvůrce
Avatar
Odpovídá na danhill
adas:9.3.2015 16:52

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ý.

Editováno 9.3.2015 16:53
 
Nahoru Odpovědět
9.3.2015 16:52
Avatar
adas
Tvůrce
Avatar
Odpovídá na danhill
adas:10.3.2015 16:04

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));
Editováno 10.3.2015 16:05
 
Nahoru Odpovědět
10.3.2015 16:04
Avatar
danhill
Člen
Avatar
Odpovídá na adas
danhill:10.3.2015 16:41

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!

Nahoru Odpovědět
10.3.2015 16:41
Nikdy není tak zle, aby nemohlo být ještě hůře.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 11 zpráv z 11.