Diskuze: Nefunkční DB Wrapper
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.


No, a co ses docetl v google translator, ze ta hlaska znamena? A co sis nasel
googlem pro kod, text te hlasky? Znas google?
Domnivam se, ze "Access denied" znamena, ze mas zamitnuty pristup k
databazi.
Obvykle, kdyz si naistalujes Xamp server, tak pristup do databaze je pres
$CFG['sql'] = array( // http://localhost/
'host' => 'localhost',
'user' => 'root', // chybova hlaska: user 'mojekonickytk'@'konik.stable.cz' === 'root'@'localhost'
'psw' => '',
'db' => 'tebou_vytvorena_databaze'
);
Takze, prihlas se do http://localhost/phpmyadmin/ jako "root", prazdne heslo a vytvor si tam databazi. Automaticky k ni ziskava opravneni user root. A pak si zmen prihlaseni v configu pro tvuj program. (idealne stary zakomentuj) Ja bych to s mym provedl takto
/*
$CFG['sql'] = array( // http://localhost/
'host' => 'konik.stable.cz',
'user' => 'mojekonickytk',
'psw' => 'heslo',
'db' => 'tebou_vytvorena_databaze'
);
*/
$CFG['sql'] = array( // http://localhost/
'host' => 'localhost',
'user' => 'root', // chybova hlaska: user 'mojekonickytk'@'konik.stable.cz' === 'root'@'localhost'
'psw' => '',
'db' => 'tebou_vytvorena_databaze'
);
Pokud je to nejaky funkcni web nebo tak neco a vse jelo a prestalo, tak napis
administratovi. Protoze to vypada jinak na problem nekde u nich, ze jsi mozna
prisel o celou databazi.
Mne treba konik.stable.cz napise chyba spojeni. Jakoby vubec neexistoval.
weverka:11.4.2022 14:45
Včera to na lokálu jelo a po nahrání na endoru to přestalo. Administrátory jsem kontaktoval řekli mi jen to že tam mám chybu. Přijde mi právě divné že Acess Denied a přitom všechny údaje jsou přímo zkopírované z dialogového okna po rychlém vytvoření uživatele a databáze pro stránku na endoře. Zkoušel jsem zda tam někdo není mezera nebo něco, ale nic nefunguje. Pokud by to bylo u nich, tak by to asi nevadilo. Musel bych se přesunout na 000webhost a tam to zkusit zprovoznit. A ano vím co je google a vím co ta chyba znamená.
Tak si zkontroluj,
- zda tam ta db je a
- zda je v ni, co ma byt a
- zda do ni ma pristup take tvuj uzivatel s pravy pro cteni a zapis.
A zkontroluj si, jake udaje mas v configu. Na localhostu muze fungovat kde
co. Ale, pokud to venku jeste nefungovalo, tak mas chybne neco ty,
pravdepodobne.
Access denied znamena, ze selhalo prihlaseni uzivatele. Takze ten uzivatel nema
nejspis vubec prihlaseni. Jinak by napsal, ze nemas pristup k te db.
Ono by stacilo mozna pridat do tveho kodu error_reporting, aby ti php vypisovalo tyto hlasky na obrazovku, pripadne vypis chyb k sql dotazum. Ja mam ve svych programech neco takoveho. To ale nemusi pasovat do prikladu programu tady.
public function query($query='', $line_of_code='')
{
if (!$this->conn)
{
return false;
}
$stmt = $this->conn->prepare($query);
if (!$stmt)
{
$this->error('Stmt failed! (line '.$line_of_code.')');
$this->error($query);
return false;
}
try {
$stmt_exec_bool = $stmt->execute();
}
catch (PDOException $e)
{
$this->error('Stmt_exec failed! (line '.$line_of_code.')');
$this->error($query);
// $this->error($e->getMessage());
$this->error(implode(" - ", $stmt->errorInfo())); //$stmt->errorCode().' '.
return false;
}
weverka:11.4.2022 15:33
Tak k db už se to připojí teď je problém jiný
Parse error: syntax error, unexpected 'INSERT' (T_STRING), expecting ',' or ')' in /storage/ssd5/165/18766165/public_html/Db.php on line 141
A tam mám
public static function insert($table, $data) {
$keys = array_keys($data);
self::checkIdentifiers(array($table) + $keys);
$query = "
INSERT INTO $table (`" . implode('`, `', $keys) . ")
VALUES (" . str_repeat('?,', count($data) - 1) . "?)
";
$params = array_merge(array($query), array_values($data));
$statement = self::executeStatement($params);
RETURN $statement->rowCount();
}
Samozrejme mas blbe uvozovky. Vypis si ten sql dotaz na obrazovku. To je tak,
kdyz kod pises amaterskym zpusobem a nepohlidas si realne problemy.
A propo, pdo ma prepare statement, proc to nepouzijes? google = pdo prepare
statement array data example
<?php
// https://stackoverflow.com/questions/22234945/inserting-array-data-using-pdo-prepared-statements
$stmt = $db->prepare("INSERT INTO first_page_data(first_name,surname,phone_no,email,postcode) VALUES(:fname,:sname,:phone,:email,:postcode)");
PDO_Value_Binder::bindValues($stmt, array(
'fname' => 'Bob', //Will be bound as PDO::PARAM_STR
'sname' => 'Bobson', //Will be bound as PDO::PARAM_STR
'phone' => null, //Will be bound as PDO::PARAM_NULL
'email' => 'my@email.com', //Will be bound as PDO::PARAM_STR
'postcode' => 123 //Will be bound as PDO::PARAM_INT
));
$stmt->execute();
?>
// schvalne, jestli si vsimnes, co je jinak a proc? A zda najdes tu pridanou uvozovku :)
public static function insert($table='', $data=array()) {
self::checkIdentifiers(array($table) + $keys);
if (is_array($data) && count($data)>0)
{
// ja osobne treba tady pouzivam cyklus foreach ($data as $key=>$value) {$keys[]=$key; $values[]='?';}
$keys = array_keys($data);
$keys = "`".implode('`, `', $keys)."`";
$values = str_repeat("?,", count($data) - 1) . "?";
$query = "INSERT INTO `$table` ($keys) VALUES ($values)";
$params = array_merge(array($query), array_values($data));
$statement = self::executeStatement($params);
if ($statement)
RETURN $statement->rowCount();
}
RETURN false;
}
---
public static function insert($table, $data) {
$keys = array_keys($data);
self::checkIdentifiers(array($table) + $keys);
$query = "
INSERT INTO $table (`" . implode('`, `', $keys) . ")
VALUES (" . str_repeat('?,', count($data) - 1) . "?)
";
$params = array_merge(array($query), array_values($data));
$statement = self::executeStatement($params);
RETURN $statement->rowCount();
}
---
Zobrazeno 7 zpráv z 7.