| Autor | Zpráva | ||
|---|---|---|---|
| tipin Profil * |
#1 · Zasláno: 2. 8. 2010, 01:24:29
Ahoj. Učím se programovat objektově (-> moc tomu ještě nerozumím). Zkusil jsem si vytvořit login uživatelů (viz dole). Při pokusu zjistit atribut objektu User (př. $uzivatel->getName()) mi stránka vypíše:
Fatal error: main() [<a href='function.main'>function.main</a>]: The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "User" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition in C:\dev\www\pokus\test.php on line 14 Moje první otázka je proč můj kúd nefunguje. Druhá otázka, má toto řešení přihlašování alespoň trochu hlavu a patu, nebo jsem úplně mimo. (Popřípadně, jak byste to řešili vy.) Dějkuji za odpověď. <?php
class Login {
private static function getConnection() {
static $db;
// připojení je už vytvořeno
if(isset($db)) {
return $db;
}
// připojení zatím nebylo vytvořeno
require_once ('db_info.php');
$db = mysql_connect(HOST, USER, PASSWORD)
or die("Připojování k DB selhalo.");
mysql_select_db(DB_NAME, $db) or die("Vybírání DB selhalo.");
mysql_query('SET CHARACTER SET utf8') or die(mysql_error($db));
return $db;
}
public static function logUserIn($email, $password) {
$sql = 'SELECT * FROM user WHERE
email = "'. $email. '" AND
password = PASSWORD("'. $password. '")';
$res = mysql_query($sql, self::getConnection())
or die(mysql_error(self::getConnection()));
if(mysql_num_rows($res)) {
$user = new User(mysql_fetch_assoc($res));
session_start();
$_SESSION['user'] = $user;
}
}
public static function logUserOut() {
session_start();
session_unset();
session_destroy();
}
}
class User {
private $id;
private $first_name;
private $last_name;
private $email;
private $access_lvl;
function __construct($row) {
$this->id = $row["id"];
$this->first_name = $row["first_name"];
$this->last_name = $row["last_name"];
$this->email = $row["email"];
$this->access_lvl = $row["access_lvl"];
}
public function getName() {
return $this->first_name;
}
}
?> |
||
| Alphard Profil |
#2 · Zasláno: 2. 8. 2010, 01:58:49 · Upravil/a: Alphard
Proč to nefunguje s jistotou nevím, tuhle chybu vidím poprvé. Asi nejlepší vysvětlení, které jsem našel, sice napovídá mnohé, ale radši napište, který řádek je u vás 14.
A k tomu kódu: 1. O získání připojení k databázi se nemůže starat třída Login. Nemá s tím nic společného. 2. V OOP radši než die() házejte výjimky. 3. session_start() (s ním zřejmě souvisí nefunkčnost) není dobré volat takto. Už teď je ve dvou metodách, za chvíli byste se v tom ztratil. 4. Neošetřujete vstupy proti sql injection (nesouvisí s OOP, ale když už se učíte něco nového) Asi by šly najít další drobnosti, ale časem je uvidíte sám. |
||
| tipin Profil * |
#3 · Zasláno: 2. 8. 2010, 02:49:06
Zbytek kódu vypadá takto:
transactUser.php: <?php
require_once('user.php');
$action = $_GET['action'];
switch($action) {
case 'login':
Login::logUserIn("mail@test.cz", "heslo");
header('Location: test.php');
break;
case 'logout':
Login::logUserOut();
header('Location: test.php');
break;
}
?>test.php: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>pokus</title>
</head>
<body>
<?php
session_start();
if(isset($_SESSION['user'])) {
$user = $_SESSION['user'];
echo "<a href=\"transactUser.php?action=logout\">Odhlásit uživatele</a> ".
$user->getName();
} else {
echo "<a href=\"transactUser.php?action=login\">Přihlásit</a>";
}
?>
</body>
</html>Jinak děkuji za koment. Mám jen ještě pár otázek: 1. Takže to připojení k DB mám řešit přes další třídu? 2. OK 3. Jak mám tedy volat session_start()? 4. OK |
||
| tiso Profil |
#4 · Zasláno: 2. 8. 2010, 09:00:53
tipin: riadok 12:
$user = $_SESSION['user']; $user = new User($_SESSION['user']); |
||
| tipin Profil * |
#5 · Zasláno: 2. 8. 2010, 10:34:17
tiso:
Ahoj. Tomu teď moc nerozumím. To mám vytvořit nový oběkt z objetu v session? Ani mi to moc nefunguje - konstruktor User vyžaduje přece jiné parametry, a nebo jsem zase vedle? |
||
| tiso Profil |
#6 · Zasláno: 2. 8. 2010, 11:23:56
tipin: tak inak: nemôžeš volať nestatickú metódu triedy (
$user->getName();) bez toho, aby si mal vytvorený objekt ($user = new User($params);). Takže si ho musíš vytvoriť… Neviem čo máš v $_SESSION['user'], predpokladal som, že tam máš obsah riadku z tabuľky user z DB.
|
||
| tipin Profil * |
#7 · Zasláno: 2. 8. 2010, 11:44:04
tiso:
v $_SESSION['user'] mám právě vytvořenou instanci třídy User... nebo je to hloupost a do session objekty nepatří? (jak jsem psal výše jsem ještě začátečník a ve spoustě věcí nemám jasno) |
||
| AM_ Profil |
#8 · Zasláno: 2. 8. 2010, 12:11:38
tipin:
„nebo je to hloupost a do session objekty nepatří?“ Asi ti úplně přesně neumím říct proč, ale do session bych raději ukládal jen ID uživatele a objekt při každém načtení stránky znovu vytvořil - je to takové pružnější a elegantnější. |
||
| tiso Profil |
#9 · Zasláno: 2. 8. 2010, 12:39:28 · Upravil/a: tiso
tipin: „v $_SESSION['user'] mám právě vytvořenou instanci třídy User“
Si si istý? Čo ti vypíše var_dump($_SESSION['user']);
|
||
| tipin Profil * |
#10 · Zasláno: 2. 8. 2010, 12:52:53
tiso:
object(__PHP_Incomplete_Class)#1 (6) { ["__PHP_Incomplete_Class_Name"]=> string(4) "User" ["id:private"]=> string(1) "1" ["first_name:private"]=> string(5) "jmeno" ["last_name:private"]=> string(8) "prijmeni" ["email:private"]=> string(12) "mail@test.cz" ["access_lvl:private"]=> string(1) "2" } |
||
| tiso Profil |
#11 · Zasláno: 2. 8. 2010, 13:39:24
|
||
| tipin Profil * |
#12 · Zasláno: 2. 8. 2010, 14:02:45
tiso:
Aha, díky. Už tomu začínám rozumnět. Takže jak to přihlašování dělám já, tak to asi nepůjde, že? Jestli je uživatel přihlášený ověřuji pomocí if(isset($_SESSION['user'])) Jinak bude asi nejlepší, když si zagooglím a podívám se jak to řeší jiní. Chtěl jsem něco vymyslet sám, ale jdu na to zřejmě špatně. |
||
| Nox Profil |
#13 · Zasláno: 2. 8. 2010, 14:07:39
session_start() můžeš a nejspíš máš volat předtím... prostě uchováváš jen ID v session a to pak třeba dáš konstruktoru uživatele a podle něj se vytvoří
|
||
|
Časová prodleva: 16 let
|
|||
0