| Autor | Zpráva | ||
|---|---|---|---|
| JSvabik Profil |
#1 · Zasláno: 4. 4. 2016, 16:42:19
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 * |
#2 · Zasláno: 4. 4. 2016, 16:56:58
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 |
#3 · Zasláno: 4. 4. 2016, 17:05:59
Děkuji moc, vyřeším
|
||
|
Časová prodleva: 10 let
|
|||
0