Autor Zpráva
JSvabik
Profil
Dobré odpoledne :),

v PHPku mám třídu, přes niž vykonávám SQL příkazy... A když mám jinou třídu a v ní určité metody, spousta metod začíná

$db = new Database;

a pak např.

$db->select("SELECT * FROM blabla WHERE username = '".$db->mysql_escape_mimic($_POST["usr"])."';");

Nezatěžuje neustálé $db = new Database; zbytečně databázi, resp. databázový server? Poradíte prosím, jak to ošetřit?

Třída Database vypadá následovně:

<?php
  class Database {    
    public function select($query) { 
      $dsn = 'mysql:dbname=' . SQL_DBNAME . ';host=' . SQL_HOST . '';
      $user = SQL_USERNAME;
      $password = SQL_PASSWORD;

      try {
        $db = new PDO($dsn, $user, $password);
        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $statement = $db->prepare($query); 
        $statement->execute();
        while($row=$statement->fetch()) {
          return $row;
        }
      } 
      catch (PDOException $e) {
        die('Connection failed: ' . $e->getMessage());
      }
    }
    
    public function selectall($query) {     
      $dsn = 'mysql:dbname=' . SQL_DBNAME . ';host=' . SQL_HOST . '';
      $user = SQL_USERNAME;
      $password = SQL_PASSWORD;
      

      try {
        $db = new PDO($dsn, $user, $password);
        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $statement = $db->prepare($query); 
        $statement->execute();
        $result = $statement->fetchAll();
        return $result;
      } 
      catch (PDOException $e) {
        die('Connection failed: ' . $e->getMessage());
      }
    }
    
    public function command($query) {     
      $dsn = 'mysql:dbname=' . SQL_DBNAME . ';host=' . SQL_HOST . '';
      $user = SQL_USERNAME;
      $password = SQL_PASSWORD;

      try {
        $pdo = new PDO($dsn, $user, $password);
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $pdo->exec($query);
      } 
      catch (PDOException $e) {
        die('Connection failed: ' . $e->getMessage());
      }
    }

    public function mysql_escape_mimic($inp) { 
      if(is_array($inp)) 
        return array_map(__METHOD__, $inp); 

      if(!empty($inp) && is_string($inp)) { 
        return str_replace(array('\\', "\0", "\n", "\r", "'", '"', "\x1a"), array('\\\\', '\\0', '\\n', '\\r', "\\'", '\\"', '\\Z'), $inp); 
      } 

      return $inp; 
    } 
  }
Martin2
Profil *
JSvabik:
Třídu Database je třeba vzít a smazat. Je v ní špatně úplně všechno. Od připojování k databázi při každém dotazu až po escapování.

Až to uděláš, tak si stáhni dibi nebo případně nette/database.
Správný postup je pak třídu připojenou k databázi nevytvářet několikrát, ale už existující jen injektovat do dalších tříd, které s databází chtějí pracovat.
JSvabik
Profil
Děkuji moc, vyřeším

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: