Diskuze: Chyba pri práci s databázou (teda aspoň si myslím)
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.


Zobrazeno 18 zpráv z 18.
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.


Tady spíš vypadá, že máš někde var_dump() nebo print_r().
Jak voláš tu metodu fetchNumDouble()?
Kód kde ju zavolám....
$result = new Fetch();
$result->fetchNumDouble('users', 'name', $nickname, 'active', $active);
výsledok potom vložím do podmienky:
if($result != 0) {
header('Location: home.php');
}
a to tiež nefunguje, lebo nevypisuje číslo...
// EDIT: var_dump a print_r v tomto prípade nepoužívam (použil som to len na hľadanie chyby)
Chápu tedy správně, že napíšeš $result->fetchNumDouble(...) a pak
if ($result != 0)?
Pokud jo, tak porovnáváš objekt s číslem. Spíš to tam chce něco jako if
($result->result != 0).
Skúšal som ten $result->result. Teraz zobrazuje vo var_dump len bool(false) ale takisto to nejde.
Já když jsem posledně získával count, tak jsem použil na konci:
$this->result = $make->fetch(PDO::FETCH_ASSOC)['count(*)']
Vo var_dump vypíše NULL aj keď to nula nie je ...
Pokud ta proměnná $result není public, tak to fungovat nebude.
Nevím, jak přesně to v aplikaci máš, ale nějak takto by to fungovat
mělo.
class Fetch
{
public $result;
public function fetchNumDouble()
{
// query dotaz
$this->result = $make->fetchColumn();
}
}
$f = new Fetch();
$f->fetchNumDouble(...);
if ($f->result != 0) {
// OK
}
Dám tu celý zdroják:
trieda Fetch
<?php
class Fetch extends Connection {
public $result;
public function fetchNum($table, $param, $value) {
$query = 'SELECT COUNT(*) AS num FROM :table WHERE :param = :value';
$make = $this->conn->prepare($query);
$make->bindParam(':table', $table);
$make->bindParam(':param', $param);
$make->bindParam(':value', $value);
$make->execute();
$this->result = $make->fetchColumn();
}
public function fetchNumDouble($table, $param, $value, $param1, $value1) {
$query = 'SELECT COUNT(*) AS num FROM :table WHERE :param = :value AND :param1 = :value1';
$make = $this->conn->prepare($query);
$make->bindParam(':table', $table);
$make->bindParam(':param', $param);
$make->bindParam(':value', $value);
$make->bindParam(':value1', $value1);
$make->bindParam(':param1', $param1);
$make->execute();
$this->result = $make->fetch(PDO::FETCH_ASSOC)['count(*)'];
}
public function select($param, $table, $param1, $value) {
$query = 'SELECT :param FROM :table WHERE :param1 = :value';
$make = $this->conn->prepare($query);
$make->bindParam(':table', $table);
$make->bindParam(':param', $param);
$make->bindParam(':value', $value);
$make->bindParam(':param1', $param1);
$make->execute();
$result = $make->fetchColumn();
return $result;
}
public function update($table, $param, $value, $param1, $value1) {
$query = 'UPDATE :table SET :param = :value WHERE :param1 = :value1';
$make = $this->conn->prepare($query);
$make->bindParam(':table', $table);
$make->bindParam(':param', $param);
$make->bindParam(':value', $value);
$make->bindParam(':value1', $value1);
$make->bindParam(':param1', $param1);
$make->execute();
}
public function register($nick, $pass, $mail, $rday, $active) {
$query = 'INSERT INTO users (name, pass, mail, rday, active) VALUES (:nick, :pass, :mail, :rday, :active)';
$make = $this->conn->prepare($query);
$make->bindParam(':nick', $nick);
$make->bindParam(':pass', $pass);
$make->bindParam(':mail', $mail);
$make->bindParam(':rday', $rday);
$make->bindParam(':active', $active);
$make->execute();
}
}
volanie triedy:
$nickname = $_SESSION['nickname'];
$active = 1;
$result = new Fetch();
$result->fetchNumDouble('users', 'name', $nickname, 'active', $active);
/* --- test --- var_dump($result->result); */
if($result->result != 0) {
header('Location: home.php');
}
?>
takto to nefunguje.
Nejsem si jistej, ale můžeš bindovat do query dotazu název tabulky?
Můžeš ještě zkusit v té metodě fetchNumDouble() místo
$this->result = $make->fetch(PDO::FETCH_ASSOC)['count(*)'];
hodit
$this->result = $make->fetch(PDO::FETCH_ASSOC)['num'];
No istotne sa pozriem na to bindovanie názvu tabuľky. Na Stacku som našiel
niečo takéto. Myslíš, že to môže byť (hlavne z hľadiska
zabezpečenia):
"SELECT * FROM {$mytable}" ?
Dnes už sa mi nechce v tom hrabať. 
Když to ošetříš přes mysql_real_escape_string tak by to z hlediska bezpečnosti tak nějak šlo, ale nemyslím si, že je to ideální řešení.
Nerád by som do toho pchal príkazy typu mysql_xxx
, takže asi najideálnejšie
riešenie bude urobiť pre každú tabuľku zvlášť funkciu.
Aj tak ostatné tabuľky budem riešiť väčšinou cez AJAX.
Každopádne zajtra skúsim, či to pôjde.
dúfam, že hej. 
Pokud ten název tabulky nezadává uživatel, tak je to v poho. Jinak to musíš nějak ošetřit, jak psal Jirka (v PDO by k tomu měla být alternativa PDO::quote()).
Tahle funkce se běžně používá, neříkám ti, že máš používat
jinak ovladač mysql(i) 
No názov tabuľky užívateľ zadávať nebude. Bude pevne daný, vidz kód, kde vytváram inštanciu.
Dík moc
Vážne sa
nesmú bindovať názvy tabuliek a dokonca ani stĺpcov
už to funguje.
Nemáš zač a díky za označení, i když to ode mě byl spíš dotaz, taky
jsem si nebyl jistý 
Zobrazeno 18 zpráv z 18.