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í.
Avatar
weverka
Člen
Avatar
weverka:11.4.2022 11:03

Ahoj, dělám ve škole web na informatiku. Všichni dělají přes webnode, ale já jakožto "ajťák" jsem si zvolil že to nakóduju. Vše by fungovalo , ale po nahrání na server přestal fungovat databázový wrapper ze zdejšího seriálu na php a mysql. Po kontaktu podporys jsem zjistil jen chybovou hlášku, kterou jsem si nakonec stejně vytáhnul sám a ta hlásá.

[11-Apr-2022 08:15:42 Europe/Prague] PHP Fatal error:  Uncaught PDOException: SQLSTATE[HY000] [1045] Access denied for user 'mojekonickytk'@'konik.stable.cz' (using password: YES) in /home/users/mojekonickytk/mojekonicky.tk/web/Db.php:50
Stack trace:
#0 /home/users/mojekonickytk/mojekonicky.tk/web/Db.php(50): PDO->__construct()
#1 /home/users/mojekonickytk/mojekonicky.tk/web/index.php(25): Db::connect()
#2 {main}
  thrown in /home/users/mojekonickytk/mojekonicky.tk/web/Db.php on line 50
[11-Apr-2022 08:15:43 Europe/Prague] PHP Fatal error:  Uncaught PDOException: SQLSTATE[HY000] [1045] Access denied for user 'mojekonickytk'@'konik.stable.cz' (using password: YES) in /home/users/mojekonickytk/mojekonicky.tk/web/Db.php:50
Stack trace:
#0 /home/users/mojekonickytk/mojekonicky.tk/web/Db.php(50): PDO->__construct()
#1 /home/users/mojekonickytk/mojekonicky.tk/web/index.php(25): Db::connect()
#2 {main}
  thrown in /home/users/mojekonickytk/mojekonicky.tk/web/Db.php on line 50
[11-Apr-2022 10:46:01 Europe/Prague] PHP Fatal error:  Uncaught PDOException: SQLSTATE[HY000] [1045] Access denied for user 'mojekonickytk'@'konik.stable.cz' (using password: YES) in /home/users/mojekonickytk/mojekonicky.tk/web/Db.php:50
Stack trace:
#0 /home/users/mojekonickytk/mojekonicky.tk/web/Db.php(50): PDO->__construct()
#1 /home/users/mojekonickytk/mojekonicky.tk/web/index.php(25): Db::connect()
#2 {main}
  thrown in /home/users/mojekonickytk/mojekonicky.tk/web/Db.php on line 50
[11-Apr-2022 10:56:33 Europe/Prague] PHP Fatal error:  Uncaught PDOException: SQLSTATE[HY000] [1045] Access denied for user 'mojekonickytk'@'konik.stable.cz' (using password: YES) in /home/users/mojekonickytk/mojekonicky.tk/web/Db.php:50
Stack trace:
#0 /home/users/mojekonickytk/mojekonicky.tk/web/Db.php(50): PDO->__construct()
#1 /home/users/mojekonickytk/mojekonicky.tk/web/index.php(25): Db::connect()
#2 {main}
  thrown in /home/users/mojekonickytk/mojekonicky.tk/web/Db.php on line 50

Kód Db.php :

<?php

/*
 *  _____ _______         _                      _
 * |_   _|__   __|       | |                    | |
 *   | |    | |_ __   ___| |___      _____  _ __| | __  ___ ____
 *   | |    | | '_ \ / _ \ __\ \ /\ / / _ \| '__| |/ / / __|_  /
 *  _| |_   | | | | |  __/ |_ \ V  V / (_) | |  |   < | (__ / /
 * |_____|  |_|_| |_|\___|\__| \_/\_/ \___/|_|  |_|\_(_)___/___|
 *                   ___
 *                  |  _|___ ___ ___
 *                  |  _|  _| -_| -_|  LICENCE
 *                  |_| |_| |___|___|
 *
 * IT ZPRAVODAJSTVÍ  <>  PROGRAMOVÁNÍ  <>  HW A SW  <>  KOMUNITA
 *
 * Tento zdrojový kód pochází z IT sociální sítě WWW.ITNETWORK.CZ
 *
 * Můžete ho upravovat a používat jak chcete, musíte však zmínit
 * odkaz na http://www.itnetwork.cz
 */
class Db
{
        /**
         * @var PDO Databázové spojení
         */
        private static $connection;

        /**
         * @var array Výchozí nastavení ovladače
         */
        private static $options = array(
                PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING,
                PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8",
                PDO::ATTR_EMULATE_PREPARES => false,
        );

        /**
         * Připojí se k databázi pomocí daných údajů
         * @param string $host Název hostitele
         * @param string $database Název databáze
         * @param string $user Uživatelské jméno
         * @param string $password Heslo
         */
        public static function connect($host, $database, $user, $password)
        {
                if (!isset(self::$connection)) {
                        $dsn = "mysql:host=$host;dbname=$database";
                        //$conn = new PDO("mysql:host=$host;dbname=AppDatabase", $username, $password);
                        self::$connection = new PDO($dsn, $user, $password, self::$options);
                }
        }

        /**
         * Spustí dotaz a vrátí PDO statement
         * @param array $params Pole, kde je prvním prvkem dotaz a dalšími jsou parametry
         * @return \PDOStatement PDO statement
         */
        private static function executeStatement($params)
        {
                $query = array_shift($params);
                $statement = self::$connection->prepare($query);
                $statement->execute($params);
                return $statement;
        }

        /**
         * Spustí dotaz a vrátí počet ovlivněných řádků. Dále se předá libovolný počet dalších parametrů.
         * @param string $query Dotaz
         * @return int Počet ovlivněných řádků
         */
        public static function query($query) {
                $statement = self::executeStatement(func_get_args());
                return $statement->rowCount();
        }

        /**
         * Spustí dotaz a vrátí z něj první sloupec prvního řádku. Dále se předá libovolný počet dalších parametrů.
         * @param string $query Dotaz
         * @return mixed Hodnota prvního sloupce z prvního řádku
         */
        public static function querySingle($query) {
                $statement = self::executeStatement(func_get_args());
                $data = $statement->fetch();
                return $data[0];
        }

        /**
         * Spustí dotaz a vrátí z něj první řádek. Dále se předá libovolný počet dalších parametrů.
         * @param string $query Dotaz
         * @return mixed Pole výsledků nebo false při neúspěchu
         */
        public static function queryOne($query) {
                $statement = self::executeStatement(func_get_args());
                return $statement->fetch(PDO::FETCH_ASSOC);
        }

        /**
         * Spustí dotaz a vrátí všechny jeho řádky jako pole asociativních polí. Dále se předá libovolný počet dalších parametrů.
         * @param string $query Dotaz
         * @return mixed Pole řádků enbo false při neúspěchu
         */
        public static function queryAll($query) {
                $statement = self::executeStatement(func_get_args());
                return $statement->fetchAll(PDO::FETCH_ASSOC);
        }

        /**
         * Umožňuje snadné vložení záznamu do databáze pomocí asociativního pole
         * @param string $table Název tabulky
         * @param array $data Asociativní pole, kde jsou klíče sloupce a hodnoty hodnoty
         * @return int Počet ovlivněných řádků
         */
        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();
        }

        /**
         * Umožňuje snadnou modifikaci záznamu v databázi pomocí asociativního pole
         * @param string $table Název tabulky
         * @param array $data Asociativní pole, kde jsou klíče sloupce a hodnoty hodnoty
         * @param string $condition Řetězec s SQL podmínkou (WHERE)
         * @return mixed
         */
        public static function update($table, $data, $condition) {
                $keys = array_keys($data);
                self::checkIdentifiers(array($table) + $keys);
                $query = "
                        UPDATE `$table` SET `".
                        implode('` = ?, `', array_keys($data)) . "` = ?
                        $condition
                ";
                $params = array_merge(array($query), array_values($data), array_slice(func_get_args(), 3));
                $statement = self::executeStatement($params);
                return $statement->rowCount();
        }

        /**
         * Vrátí poslední ID posledního záznamu vloženého pomocí INSERT
         * @return mixed Id posledního záznamu
         */
        public static function getLastId()
        {
                return self::$connection->lastInsertId();
        }

        /**
         * Ošetří string proti SQL injekci
         * @param string $string Řetězec
         * @return mixed Ošetřený řetězec
         */
        public static function quote($string)
        {
                return self::$connection->quote($string);
        }

        /**
         * Zkontroluje, zda identifikátory odpovídají formátu identifikátorů
         * @param array $identifiers Pole identifikátorů
         * @throws \Exception
         */
        private static function checkIdentifiers($identifiers)
        {
                foreach ($identifiers as $identifier)
                {
                        if (!preg_match('/^[a-zA-Z0-9\_\-]+$/u', $identifier))
                                throw new Exception('Dangerous identifier in SQL query');
                }
        }
}

Potřebuji mít do příštího úterý odevzdáno a nemohu to vyřešit. Webovka hlásí na každé podstránce ERROR 500

Zkusil jsem: Znovu nahrát web, znovu zkopírovat Db.php, změnit údaje k databázi

Chci docílit: Aby mi web nehlásil HTTP ERROR 500

Odpovědět
11.4.2022 11:03
Weby jsou budoucnost IT
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:11.4.2022 14:31

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'
        );
 
Nahoru Odpovědět
11.4.2022 14:31
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:11.4.2022 14:33

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.

 
Nahoru Odpovědět
11.4.2022 14:33
Avatar
weverka
Člen
Avatar
Odpovídá na Peter Mlich
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á.

Nahoru Odpovědět
11.4.2022 14:45
Weby jsou budoucnost IT
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:11.4.2022 14:53

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;
                }
 
Nahoru Odpovědět
11.4.2022 14:53
Avatar
weverka
Člen
Avatar
Odpovídá na Peter Mlich
weverka:11.4.2022 15:33

Tak k db už se to připojí teď je problém jiný :D

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();
        }
Nahoru Odpovědět
11.4.2022 15:33
Weby jsou budoucnost IT
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:12.4.2022 7:41

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'    => '[email protected]', //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();
        }
---
 
Nahoru Odpovědět
12.4.2022 7:41
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 7 zpráv z 7.