Autor Zpráva
qwert
Profil *
Dobrý večer, dělám si skript který bude ukládat a vypisovat z databáze.
Mám třídu Database a v ní funkci Connection, která připojuje k databázi a pak funkci Query přes kterou půjdu všechny dotazy, zatím to není hotové, ale chtěl jsem vyzkoušet jestli funkce Query funguje, tak jsem si vytvořil instanci a vkládal funkční sql dotaz a hlásí mi to tyto chyby:

Warning: mysql_query() [function.mysql-query]: Access denied for user 'a2952702'@'localhost' (using password: NO) in * on line 30

Free Web Hosting

PHP Error Message

Warning: mysql_query() [function.mysql-query]: A link to the server could not be established in * on line 30

Takto vypadají ty dvě metody:
public function Connection()
    {
      if(!$this->connection){
            @$this->connection = mysql_connect(SERVER_NAME,SERVER_USER,SERVER_PASS);
            @mysql_select_db(SERVER_DB,$this->connection) or die('Databaze neexistuje');           
      return $this->connection;   
      }
    } 
    public function Query($sql)
    {
       if (is_string($sql) and !empty($sql)) 
        {
           $this->result->connection = mysql_query($sql);
            return $this->result;
        }else
            throw new Exception("Chyba MySQL dotazu".$sql.": chybny zapis");
    }
řádek 30 je $this->result->connection = mysql_query($sql);
děkuji moc za radu
qwert
Profil *
Věděl by někdo v čem je problém OOP se teprve učím a fakt netuším kde je chyba
Děkuju za radu
Joker
Profil
Ehm, špatné heslo k databázi?
edit: Respektive se nepošle žádné heslo
qwert
Profil *
Nene v tom problém není, udělal jsem to trochu jinak, tochu víc blbě a divně a fungovalo to... heslo je správné
Joker
Profil
qwert:
Access denied for user 'a2952702'@'localhost' (using password: NO)“ znamená, že danému uživateli (a2952702) byl odepřen přístup, přičemž se připojoval bez použití hesla.

Čili pokud tam má být heslo, tak se neposílá.
qwert
Profil *
No jo, ale proč se neposílá? heslo tam mám, včera jsem změnil query a fungovalo to, jenomže to byla úplná nehezká a pro OOP strašná ptákovina :)

Není problém s tím this->result->connection?
Joker
Profil
qwert:
Není problém s tím this->result->connection?
To je docela možné. A to @ tam potlačí chybové hlášky, takže se to tváří, jako by nic (potlačovat chybové hlášky není dobrý nápad).
qwert
Profil *
Takže co s tím tedka udělat?
Joker
Profil
Smazat @ a zkusit to znovu?
edit: Případně si rovnou ověřit obsah SERVER_NAME,SERVER_USER, SERVER_PASS a SERVER_DB
qwert
Profil *
smazal jsem všechny @, zkusil jsem si vypsat ty konstanty, vše bez problému, vsadil bych se že je problém s tím voláním ale nevím jak to upravit


Tak jsem zkusil pár pokusů a tohle funguje:
    public function Connection($sql)
    {
      if(!$this->connection){
            $this->connection = mysql_connect(SERVER_NAME,SERVER_USER,SERVER_PASS);
            mysql_select_db(SERVER_DB,$this->connection) or die('Databaze neexistuje');  
             mysql_query($sql);
      return $this->connection;   
      }
    }

Což znamená že připojení k db je Ok, ale tohle nechci, chci mít zvlášt metodu query na zápis a pak bude metoda fetch a ta bude vracet výpis. Takže tohle je mi k ničemu, ale aspon víme že chyba je v Query()


Celé to vypadá takto
include "../constant.php";
class Database 
{
   /*
    * Trida pro pripojeni k databasi, zapis a vypis z db
    * 
    * Nejnižší vrstva, pracuje s SQL příkazy, vstupni hodnoty jsou SQL dotazy, ne pole
    * 
    */
    private $connection = null;
    //Promena, ktera vytvori pripojeni k databazi
    private $result = null;
    /*
     * Navratova hodnota
     */
    public function __construct()
    {
    }
    
    public function Connection($sql)
    {
      if(!$this->connection){
            $this->connection = mysql_connect(SERVER_NAME,SERVER_USER,SERVER_PASS);
            mysql_select_db(SERVER_DB,$this->connection) or die('Databaze neexistuje');  
      return $this->connection;   
      }
    } 
    public function Query($sql)
    {
       if (is_string($sql) and !empty($sql)) //kontrola jestli je retezec a neni prazdny
        {
           $this->result->connection = mysql_query($sql);
           return $this->result;
        }else
            throw new Exception("Chyba MySQL dotazu".$sql.": chybny zapis");
    }
}
//vytvoření instance:
include "Database.php";
$db = new Database();
$sql = "INSERT INTO user(Jmeno,Prijmeni)VALUES('Karel','Karel')";
$db->Query($sql);
qwert
Profil *
Takže jsem se v tom trochu vrtal a už to funguje, akorát to hlásí chybu, ale do db ukládá:
    public function Query($sql)
    {
       if (is_string($sql) and !empty($sql)) 
        {
    $this->Connection()->result = mysql_query($sql);
    return $this->result;
        }else
          throw new Exception("Chyba MySQL dotazu".$sql.": chybny zapis");
    }
A hlásí to:
Fatal error: Can't use method return value in write context in /home/a2952702/public_html/DBL/Database.php on line 33
Co je to za chybu? 33 je opět ten řádek $this->Connection()->result = mysql_query($sql);
Bertram
Profil
qwert:
Uvědom si že návratová hodnota metody connection() není objekt s vlastností result do které chceš přidat hodnotu vrácenou z mysql_query.
qwert
Profil *
Aha no a jak to teda udělat? Rád bych potom vracel výsledek toho uložení, abych mohl kontrolovat jestli se uložilo nebo ne..
Tak jak to má teda vypadat? :)
Bertram
Profil
qwert:
Tak jak to má teda vypadat?
Upozorňuji, že to je jen ukázka toho, aby to vůbec fungovalo, nikoli správný návrh.
<?php
class Database {

    private $host;
    private $userName;
    private $pass;
    private $dbName;
    protected static $connection;

    public function __construct($host, $userName, $pass, $dbName) {
        $this->host = $host;
        $this->userName = $userName;
        $this->pass = $pass;
        $this->dbName = $dbName;
    }

    public function getConnection() {
        if (!self::$connection) {
            self::$connection = mysqli_connect($this->host, $this->userName, $this->pass, $this->dbName);
        }
        return self::$connection;
    }

    public function Query($sql) {
        return mysqli_query($this->getConnection(), $sql);
    }

}

$db = new Database("localhost", "root", "heslo", "databaze");
$sql = "SELECT * FROM user WHERE id = 1";
var_dump(mysqli_fetch_assoc($db->Query($sql)));
qwert
Profil *
Děkuji, je to zajímavé, jenom dotaz, je to použitelné i s mysql?


Ne jenom s mysqli
Bertram
Profil
qwert:
Tvá třída pro práci s databází bude použitelná tak jak si ji napíšeš.
Kvalitní OO knihovny pro práci s databází jsou napsány pro více databázových systémů a je na tobě, který budeš používat.
Nebudu tu takovou knihovnu raději uvádět, protože jsou tu jedinci, kteří by to nemusely ukočírovat :)
qwert
Profil *
No já si právě chci něco podobného naprogramovat sám, stáhl jsem si několik podobných systémů, koukám jak to dělali jiní a chci se tím že si taky něco takovýho naprogramuju naučit OOP, no ale zatím jenom tak trochu tápu

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: