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.

Tvůrce

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