Wpis z mikrobloga

class DB{

function db_connect(){
$mysql_host = 'hosy';
$username = 'lol';
$password = 'lol';
$database = lol'';
//to tylko przykładowe, bo już byście hackowali :p

try{
$pdo = new PDO('mysql:host='.$mysql_host.';dbname='.$database.';', $username, $password );
}catch(PDOException $e){
echo 'Połączenie nie mogło zostać utworzone.
';
}
}

};

class Logs{

//log
function log_login($user,$dateNow,$action,$actionResult) {

$db = new DB();
$db->db_connect();

//data i czas teraz
$dateNow = date('Y-m-d H:i:s');

$log = $pdo->prepare("INSERT INTO
log (userlog, datalog,actionlog, title_log) VALUES (?, ?, ?, ?)");
$log->bindValue(1,$user);
$log->bindValue(2,$dateNow);
$log->bindValue(3,$action);
$log->bindValue(4,$actionResult);
$log->execute();

}

};

mam coś takiego, ale wywala mi Call to a member function prepare() on a non-object in

co robię źle? Jak wywołać klasę w innej klasie? Można tak?

#php #webdev
  • 6
@jaskowice1: w klasie Logs odnosisz się do zmiennej $pdo, która nigdzie nie jest zainicjalizowana. a w klasie DB masz tę zmienną, ale ani jej nie zwracasz, ani nie przypisujesz do żadnego pola.

ogólnie trochę źle to wygląda (wszystko w jednej metodzie w DB) i brak jakiegoś pomocnika typu metoda query (dla DB oczywiście) która by sprawdzała połączenie i robiła resztę roboty. innymi słowy: nie korzystasz z możliwości obiektowości. sam miałem tę
@jaskowice1: W tej linii $log = $pdo->prepare() nie masz dostępu do zmiennej $pdo ($pdo jest dostępna tylko w funkcji DB::db_connect. Najprościej zrobić to tak:
1) Zmień $pdo = new PDO(...) na $this->pdo = new PDO(...)
2) Zmień linię $log = $db->pdo->prepare()
3) Zalecam - w klasie DB dodaj zmienną public $pdo; oraz określaj widoczność funkcji i zmiennych (php5)
@jaskowice1:

tu tak na szybko wklejam kod. ofkoz dało by się go podtuningować (odpowiednie rzucanie wyjątków, właściwy odczyt błędów, metodę do zapytań żeby nie bindować tego w innej klasie tylko przekazać tablicę, metody statyczne żeby nie trzeba było tworzyć obiektu itd), ale zaraz do domu lece i nie mam tyle czasu.

class DB{
private $mysqlhost = 'hosy';
private $username = 'lol';
private $password = 'lol';
private $database = lol'';
private