praegune kellaaeg 25.11.2025 18:30:35
|
|
Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
| autor |
|
inzinz
HV kasutaja
liitunud: 26.01.2005
|
07.01.2009 22:46:19
|
|
|
static klassi sees saad static kontekstile ligi self:: abil
Muutujaid saad kätte self::$muutujanimi kasutades ja funktsioonid self::funktsiooninimi();
Lisaks soovitan tekitada Sstatic klassi siis ka vastava muutuja
private static $entry; (samamoodi peaks deklareerima muutuja $entry ka tavalise klassi puhul ainult et ilma static võtmesõnata)
EDIT:
static funktsioon ei tähenda siiski päris eraldiseisvat funktsiooni mida saad mujale tõsta, sa saad static kontekstis olevaid funktsioone ja muutujaid vabalt alati kasutada ülalpooltoodud süntaksiga
_________________ Upload.ee - eestimaine failiupload |
|
| Kommentaarid: 4 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
4 |
|
| tagasi üles |
|
 |
keevitaja
AM 10 aastat

liitunud: 05.11.2001
|
07.01.2009 22:51:20
|
|
|
viitsid selle söödavaks teha? ma ei saa pihta su jutule
| php:
|
<?php class Sstatic { public static function fun1 ($entry) { $this->entry = $entry .' ja lisa!'; } { } } class Klass { public function fun3($entry) { Sstatic::fun1($entry); } public function fun4() { SStatic::fun2(Sstatic::entry); } } $obj = new Klass(); $obj->fun3('See on asi'); $obj->fun4(); ?>
|
|
|
| Kommentaarid: 51 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
3 :: |
40 |
|
| tagasi üles |
|
 |
inzinz
HV kasutaja
liitunud: 26.01.2005
|
07.01.2009 22:56:28
|
|
|
<?php
class Sstatic
{
private static $entry;
public static function fun1($entry)
{
self::$entry = $entry .' ja lisa!';
}
public static function fun2()
{
return strtoupper(self::$entry);
}
}
class Klass
{
public function fun3($entry)
{
Sstatic::fun1($entry);
}
public function fun4()
{
echo SStatic::fun2(Sstatic::$entry);
}
}
$obj = new Klass();
$obj->fun3('See on asi');
$obj->fun4();
?>
|
peaks töötama ilusti
_________________ Upload.ee - eestimaine failiupload |
|
| Kommentaarid: 4 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
4 |
|
| tagasi üles |
|
 |
keevitaja
AM 10 aastat

liitunud: 05.11.2001
|
07.01.2009 22:59:03
|
|
|
ok. tnx. nii vist ikkagi ei ole mõttekas teha...
aga milleks interfaced head on? et saaksid lihtsalt kasutatavad functionid ja muutujad ära deklareerida ja siis hiljem oleks kontroll peal, et kõiki neid kindlalt kasutada?
_________________ Hinnavaatlus ei ole koht arvamuse avaldamiseks! |
|
| Kommentaarid: 51 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
3 :: |
40 |
|
| tagasi üles |
|
 |
nene
Kreisi kasutaja

liitunud: 20.03.2004
|
08.01.2009 00:18:36
|
|
|
@inzinz: Võibolla, et ma olen lihtsalt näinud liiga palju koodi, mis on läbi põimunud kõiksugustest staatilistest meetoditest. Kus andmebaasiklass on seotud pea iga klassiga süsteemis. Kus ühtki juppi süsteemist ei saa rasket vaeva nägemata välja vahetada, sest kõik on omavahel nii tihedalt kokku aheldatud. Ja kus unit-testimise peale ei tasu mitte mõeldagi, sest see on võimatu.
Just testimise koha pealt on staatilised meetodid eriline piin, sest sa ei saa asendada reaalset andmebaasiklassi testimise ajaks dublandiga, mis päriselt andmebaasi poole ei pöörduks.
Noh, samas olen ma ka jõudnud järeldusele, et PHP-s polegi võimalik normaalselt unit-testimist rakendada.
@keevitaja: Interfeissid (liidesed) annavad koos type hintidega võimaluse teha Java stiilis tüübikontrolli. Näiteks võid deklareerida, et funktsiooni suurenda() parameetriks saab anda vaid objekti, mis implementeerib liidest Suurendatav, kus siis omakorda on kirjas, et sel objektil peab olema meetod liida_juurde() - funktsioon suurenda() saab siis olla kindel, et ta võib talle antud objektil liida_juurde() meetodit välja kutsuda. Java puhul on sel oluline mõte, sest ilma liidesteta ei laseks Java sul mõningaid asju teha, kuid PHP puhul on liidesed IMHO suht kasutud asjad.
_________________ Mõistus otsas? Pane pinusse... |
|
| Kommentaarid: 24 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
23 |
|
| tagasi üles |
|
 |
inzinz
HV kasutaja
liitunud: 26.01.2005
|
08.01.2009 00:24:45
|
|
|
Just nii, ja kui interface'i kasutav klass neid funktsioone ei sisalda annab php kohe errori vastavasisulise
Hoiab parasjagu peavalu kokku, kuna php muidu kontrollib alles funktsiooni välja kutsumise ajal kas funktsioon on olemas, ja siis võib ootamatutest kohtades vigasid visata kui sul on ununenud miski funktsioon kirjutada.
Interface kontrolliga teostatakse kontroll klassi sisselugemise ajal juba ja annab koheselt errori.
@nene
No, kui nüüd natuke kavalam olla, siis saab teha static klassi nii, et see on wrapperiks sisemisele private static mysql klassile.
public static function Query($sql) {
return self::$mysql->Query($sql);
}
|
Seda stiili ma ise kusjuures kasutangi, on eraldi DynMysql klass mille funktsioone static Mysql klass välja kutsub, võimaldades samaaeglselt mugavat Mysql::Query(); stiili kui vajadusel ka $db = new DynMysql(); $db->Query(); stiili.
Aga andmebaasi klassi välja vahetamise suhtes ma ei teagi, mis olukorras peale testimise seda üldse vaja peaks olema. Enamus rakendusi töötavad sama andmebaasitüübiga ja üldiselt ka andmebaasiklassiga oma eluea lõpuni. Ja kui juba pead üleüldse välja vahetama ühe baasitüübi teise vastu (mysql -> postgresql või muud kombinatsioonid) siis palju tööd on nii või teisiti: päringute ümber tegemine, teise klassi rakendamine jne.
Ja samas saab ilusti vahetada ikkagi testimise jaoks, teed samanimelise klassi, samad funktsioonid, teises failis, testimise ajal included õige faili asemel teise ja ongi korras.
_________________ Upload.ee - eestimaine failiupload
viimati muutis inzinz 08.01.2009 00:41:22, muudetud 1 kord |
|
| Kommentaarid: 4 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
4 |
|
| tagasi üles |
|
 |
keevitaja
AM 10 aastat

liitunud: 05.11.2001
|
08.01.2009 00:37:37
|
|
|
see vist eeldaks siis täielikku programmi eelmodeleerimist
EDIT: see jutt interface kohta!
viimati muutis keevitaja 08.01.2009 00:48:20, muudetud 1 kord |
|
| Kommentaarid: 51 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
3 :: |
40 |
|
| tagasi üles |
|
 |
inzinz
HV kasutaja
liitunud: 26.01.2005
|
|
| Kommentaarid: 4 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
4 |
|
| tagasi üles |
|
 |
keevitaja
AM 10 aastat

liitunud: 05.11.2001
|
08.01.2009 15:28:14
|
|
|
teen siis väikse kokkuvõtte. otsustasin kasutada sql klassi etteandmisega, kun siis saan ma ka vajadusel kohe seda klassi ka ilma teise klassita kasutada.
| php:
|
$db = new MysqlDB(); $sess = new Session($db);
|
mysql_real_escape_string kasutan hetkel ainult siis selles logimises. muus kohas, nagu ma aru sain, seda vaja ei ole.
lisasin veel automaatse logimise, kuid pole jällegi kindel, kas tegin õigesti. ehk keegi viitsib kommneerida jälle (session.class.php failis, auth_user funtsioonis auto_logged kontrollib ja login.php failis auto_check lisab)
conf.php
| php:
|
<?php define(SQL_HOST, 'localhost'); define(ROOT_PATH, '/xampp/htdocs/cms/'); define(COOKIE_NAME, 'dsfsdjfl4j'); define(ACOOKIE_NAME, 'a-'.COOKIE_NAME ); define(DB_USER, DB_PER. 'user'); define(DB_ADMIN, DB_PER. 'admin'); define(DB_GSESS, DB_PER. 'gsess'); define(DB_USESS, DB_PER. 'usess'); define(DB_AUTOLOGIN, DB_PER. 'autologin'); ?>
|
install.php
| php:
|
<?php require('./conf.php'); require('includes/mysql.class.php'); $db->connect(); $cmd[DB_USER] = " user_id int primary key not null auto_increment, user_name varchar(20), user_pass varchar(32), user_realname varchar(32), user_email varchar(32) "; $cmd[DB_ADMIN] = " user_id int "; $cmd[DB_GSESS] = " sess_id int primary key not null auto_increment, hash varchar(32), ip varchar(15) "; $cmd[DB_USESS] = " sess_id int, time int, user_id int "; $cmd[DB_AUTOLOGIN] = " user_id int, hash varchar(32), ip varchar(15), time int "; foreach($cmd as $tbl => $sql_cmd) { if(!$db->num_rows($db->query("SHOW TABLES LIKE '".$tbl."'"))) { $mysql_cmd = "create table ".$tbl."(".$sql_cmd.")"; $db->query($mysql_cmd); } } $db-> query("insert into ".DB_USER. "(user_name, user_pass) values('admin', '". md5('admin'). "')"); ?>
|
mysql.class.php
| php:
|
<?php { public function connect() { } public function error() { } public function query($query) { } public function fetch_assoc($result) { } public function num_rows($result) { } public function result($query) { $sql_query = self::query($query); return self::fetch_assoc($sql_query); } public function insert_id() { } } ?>
|
session.class.php
| php:
|
<?php class Session { public $remote_ip; private $db; public function __construct($db) { if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $this->remote_ip = $_SERVER['HTTP_X_FORWARDED_FOR']; } else { $this->remote_ip = $_SERVER['REMOTE_ADDR']; } $this->db = $db; //sql } public function start() { //kontrollime, kas kypsised on lubatud //session id $this-> sid = (strlen($_REQUEST['sid']) == 32) ? $_REQUEST['sid'] : $_COOKIE[COOKIE_NAME ]; } public function validate() { //kontrollime, kas sessioon on kehtiv $session = $this->db->result("select count(sess_id) as c from ".DB_GSESS." where hash='$this->sid' and ip='$this->remote_ip'") or die($this-> error()); if($session['c'] != 0) { $sess_id = $this->db->result("select sess_id from ".DB_GSESS." where hash='$this->sid' and ip='$this->remote_ip'") or die($this-> error()); $this->sess_id = $sess_id['sess_id']; return true; } } public function new_gsess() { //kui pole sellist sessio olemas, siis sisestame uue $this->db->query("insert into ".DB_GSESS."(hash, ip) values('$this->sid', '$this->remote_ip')") or die($this-> error()); } //kui cookied pole lubatud, siis lisama PHPSESSID urlile public function url($url) { if(!$this->auth_method) return $url . ((strstr($url, '?')) ? '&' : '?') . 'sid=' . $this-> sid; else return $url; } //kontrollime, kas kylastaja on sisse logitud public function auth_user() { $auth = $this->db->result("select user_id from ".DB_USESS." where sess_id='$this->sess_id' and time>='$time'"); { $this->user_id = $auth['user_id']; $this->db->query("update ".DB_USESS." set time='$time' where sess_id='$this->sess_id' and time>='$time'"); return true; } elseif($this->auto_logged()) //kontrollime, ega automaatne logimine peal ei ole { $this->login(); return(true); } } //logime kasutaja sisse public function user_check() { $user_name = sql_safe (trim($_POST['user_name'])); $user_pass = md5($_POST['user_pass']); $auth = $this->db->result("select user_id from ".DB_USER." where user_name='$user_name' and user_pass='$user_pass'"); $this->user_id = $auth['user_id']; return true; } //logime kasutaja sisse! public function login() { $this->db->query("insert into ".DB_USESS."(sess_id, time, user_id) values( '$this->sess_id', '$time', '$this->user_id')") or die($this-> error()); } //logime kasutaja v2lja, samuti kustutame k6ik automaatse logimise pirukad public function logout($user_id) { $this->db->query("delete from ".DB_USESS." where user_id='$user_id'"); $this->db->query("delete from ".DB_AUTOLOGIN." where user_id='$user_id'"); } // public function auto_check() { $this->db->query("insert into ".DB_AUTOLOGIN."(user_id, hash, ip, time) values( '$this->user_id', '$this->sid', '$this->remote_ip', '$time')"); } public function auto_logged() { $hash = $_COOKIE[ACOOKIE_NAME]; $auto_db = $this->db->result("select user_id from ".DB_AUTOLOGIN." where hash='$hash' and time>='$time'"); { $this->user_id = $auto_db['user_id']; return(true); } } }
|
common.php
| php:
|
<?php require(ROOT_PATH.'includes/mysql.class.php'); require(ROOT_PATH.'includes/session.class.php'); require(ROOT_PATH.'includes/functions.php'); //loome mysql objekti ja yhenduse if(!$db->connect()) die('Mingi kamm andmebaasiga...'); //alustame sessiooni majandusega $sess = new Session($db); $sess->start(); if(!$sess->validate()) $sess->new_gsess(); ?>
|
functions.php
| php:
|
<?php function sql_safe($orig) { } ?>
|
login.php
| php:
|
<?php require('conf.php'); require(ROOT_PATH.'includes/common.php'); if(!$sess->auth_user()) { if($_POST['user_name'] && $_POST['user_pass']) { if($sess->user_check()) { $sess->login(); //vaatame, kas kasutaja tahab edaspidi automaatselt sisse logida if($_POST['auto'] == 1) $sess->auto_check(); header('Location: '. $sess-> url('kala.php')); } else echo 'Kasutajat ei ole olemas! <a href="'. $sess-> url('login.php'). '">Uuesti logima >>></a>'; } else { ?> <form action="login.php" method="post"> <?php if(!$sess->auth_method) { ?> <input type="hidden" name="sid" value="<?php echo $sess->sid ?>"> <?php } ?> <p>kasutaja <input type="text" name="user_name"></p> <p>parool <input type="password" name="user_pass"></p> <p>m2leta mind <input type="checkbox" name="auto" value="1"></p> <p><input type="submit" value="Login"></p> </form> <p><a href="<?php echo $sess->url('kala.php') ?>">Mine edasi logimata >>></a></p> <?php } } else { $sess->logout($sess->user_id); echo 'Kasutaja on v2lja logitud! <a href="'. $sess-> url('login.php'). '">Uuesti logima >>></a>'; } ?>
|
kala.php
| php:
|
<?php require('conf.php'); require(ROOT_PATH.'includes/common.php'); echo '<a href="' . $sess-> url('kala.php') . '">refresh</a><hr>'; if($sess->auth_user()) { echo '<b>Kasutaja on sisse logitud!</b> <a href="'. $sess-> url('login.php'). '">Logout</a><br>'; echo 'sesiooni hash: '. $sess-> sid; } else echo 'Kasutaja ei ole sisse logitud! <a href="'. $sess-> url('login.php'). '">Login</a>'; ?>
|
|
|
| Kommentaarid: 51 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
3 :: |
40 |
|
| tagasi üles |
|
 |
mikk36
HV Guru

liitunud: 21.02.2004
|
08.01.2009 15:28:27
|
|
|
| mysql_real_escape_stringi on vaja igalpool, kus sa võtad kasutajalt puhast sisendit (ehk siis ei võta sisendist näiteks intval jne funktsioonidega väärtusi)
|
|
| Kommentaarid: 85 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
2 :: |
78 |
|
| tagasi üles |
|
 |
keevitaja
AM 10 aastat

liitunud: 05.11.2001
|
08.01.2009 15:29:27
|
|
|
| mikk36 kirjutas: |
| mysql_real_escape_stringi on vaja igalpool, kus sa võtad kasutajalt puhast sisendit (ehk siis ei võta sisendist näiteks intval jne funktsioonidega väärtusi) |
jep. sain aru. mul seal lihtsalt rohkem kasutaja poolt sisestatavaid andmeid pole!
|
|
| Kommentaarid: 51 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
3 :: |
40 |
|
| tagasi üles |
|
 |
mikk36
HV Guru

liitunud: 21.02.2004
|
08.01.2009 15:30:28
|
|
|
| Samuti on soovitav sisendist üle käia htmlentities funktsiooniga, et kasutaja ei saaks html'i sisestada.
|
|
| Kommentaarid: 85 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
2 :: |
78 |
|
| tagasi üles |
|
 |
keevitaja
AM 10 aastat

liitunud: 05.11.2001
|
08.01.2009 15:33:47
|
|
|
| las ta sisestab mida tahab, hiljem väljastamisel chekin seda asja! sisestamisel teen addslashes
|
|
| Kommentaarid: 51 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
3 :: |
40 |
|
| tagasi üles |
|
 |
nene
Kreisi kasutaja

liitunud: 20.03.2004
|
08.01.2009 16:31:10
|
|
|
| mikk36 kirjutas: |
| Samuti on soovitav sisendist üle käia htmlentities funktsiooniga, et kasutaja ei saaks html'i sisestada. |
Pigem tuleks seda teha ikka väljundi puhul. Ning htmlentities on liiast htmlspecialchars-ist piisab täiesti. Aga antud juhul ei leidnud ma ses koodis ühtegi kohta, kus kasutaja sisestatud andmeid lehe peal näidatakse.
@keevitaja: Katsu vältida globaalsete muutujate kasutamist. Näiteks funktsioon user_check() kasutab hetkel globaalseid muutujaid $_POST["user_name"] ja $_POST["user_pass"]. Selle asemel võiks ta saada need väärtused parameetritena: user_check($user, $pass).
Proovi panna funktsioonidele paremad nimed. Näiteks on sul auth_user() - võiks arvata, et see on lühendatud authenticate_user() ehk kasutaja autentimine, ehk siis kasutajanime ja parooli kontrollimine, kuid ei, see funktsioon ütleb hoopis kas kasutaja on sisse logitud või mitte. Miks mitte panna talle siis nimeks logged_in().
Eriti arusaamatu lugu on funktsioonidega user_check() ja login() - kummagi juures on kommentaar mis ütleb: "logime kasutaja sisse". Tegelikult toimub üsna kummaline lugu: user_check() kontrollib kas kasutajanimi ja parool klapivad ning lisaks jätab meelde kasutaja ID, login() alustab siis selle meeldejäetud ID alusel uue sessiooni.
user_check() võiks siiski piirduda vaid ühe rolliga - kontrollimine, kas kasutajanimi ja parool klapivad. Kui klapivad, siis võiks ta tagastada kasutaja ID, vastasel juhul false. Ühtlasi võiks tal olla nimi, mis kirjeldab seda, mida ta teeb. Näiteks get_user_id($user, $pass).
login() võiks siis võtta selle kasutaja ID parameetrina ning alustada vastavat sessiooni. Nimi võiks jällegi olla vastav: start_session($user_id).
Üldse sellel Session klassil on liiga palju vastutust. Ühelt poolt tegeleb ta kasutaja autentimisega ja teise poole pealt sessioonide haldamisega. Soovitaksin selle autentimise poole sealt Sessiooni klassist eraldada ja luua eraldi autentimisega tegeleva klassi. Ühtlasi saaks viimasesse lisada ka tubli portsu seda funkstionaalsust, mis sul hetkel login.php-s istub.
_________________ Mõistus otsas? Pane pinusse... |
|
| Kommentaarid: 24 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
23 |
|
| tagasi üles |
|
 |
keevitaja
AM 10 aastat

liitunud: 05.11.2001
|
08.01.2009 18:22:41
|
|
|
nene, asjalik jutt sul alati
_________________ Hinnavaatlus ei ole koht arvamuse avaldamiseks! |
|
| Kommentaarid: 51 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
3 :: |
40 |
|
| tagasi üles |
|
 |
keevitaja
AM 10 aastat

liitunud: 05.11.2001
|
08.01.2009 18:27:59
|
|
|
aga mis moodi ja millal oleks korrektne muutujaid defineerida? kas alati? näiteks:
| php:
|
<?php class Klass { public $liikuv; private $miinus; public function kala() { $this->liikuv = 100; } public function mala($miinus) { $this->liikuv = $this->liikuv - $miinus; } } $obj = new Klass; $obj->kala(); $obj->mala(77); ?>
|
|
|
| Kommentaarid: 51 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
3 :: |
40 |
|
| tagasi üles |
|
 |
keevitaja
AM 10 aastat

liitunud: 05.11.2001
|
08.01.2009 21:46:57
|
|
|
ma nüüd natukene kohendasin seda sessioonide klassi, kuid tükeldada nagu ikka ei tahaks. ainult mõned funtsioonid on seal, mis ei vaja klassi üldiseid muutujaid. või milliseid sa täpselt silmas pidasid? kas kõiki, mis kasutaja autentimisega seotud on?
| php:
|
<?php class Session { public $remote_ip; private $db; public function __construct($db) { //kasutaja ip tuvastamise kontrolliks $this-> remote_ip = isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR']; //andmebaasi klass $this->db = $db; //sessiooni meetod. kontrollib, kas brauseril on kypsised lubatud //sessiooni hash $this-> sid = (strlen($_REQUEST['sid']) == 32) ? $_REQUEST['sid'] : $_COOKIE[COOKIE_NAME ]; } //kontrollib, kas sessioon on kehtiv public function validate_session() { //kontrollime, kas sessioon on kehtiv $session = $this->db->result("select count(sess_id) as c from ".DB_GSESS." where hash='$this->sid' and ip='$this->remote_ip'") or die($this-> error()); if($session['c'] != 0) { $sess_id = $this->db->result("select sess_id from ".DB_GSESS." where hash='$this->sid' and ip='$this->remote_ip'") or die($this-> error()); //sessiooni id kasutaja audentimiseks $this->sess_id = $sess_id['sess_id']; return true; } } //loob uue globaalse sessiooni public function start_session() { $this->db->query("insert into ".DB_GSESS."(hash, ip) values('$this->sid', '$this->remote_ip')") or die($this-> error()); } //kui cookied pole lubatud, siis lisab sessiooni hashi urlile public function addsid($url) { if(!$this->auth_method) return $url . ((strstr($url, '?')) ? '&' : '?') . 'sid=' . $this-> sid; else return $url; } //kontrollime, kas kylastaja on sisse logitud public function logged_in() { $user_id = $this->db->result("select user_id from ".DB_USESS." where sess_id='$this->sess_id' and time>='$time'"); { //siselogitud kasutaja id $this->user_id = $user_id['user_id']; $this->db->query("update ".DB_USESS." set time='$time' where sess_id='$this->sess_id' and time>='$time'"); return true; } //kontrollime, kas on automaatne logimine elseif($user_id = $this->autologged_in()) { $this->login_user($user_id); $this->user_id = $user_id; return true; } else return false; } //logime kasutaja sisse public function authenticate_user($user_name, $user_pass) { $user_name = sql_safe (trim($user_name)); $user_pass = md5($user_pass); $user_id = $this->db->result("select user_id from ".DB_USER." where user_name='$user_name' and user_pass='$user_pass'"); return $user_id['user_id']; else return true; } //logime kasutaja sisse! public function login_user($user_id) { $this->db->query("insert into ".DB_USESS."(sess_id, time, user_id) values( '$this->sess_id', '$time', '$user_id')"); } //logime kasutaja v2lja, samuti kustutame k6ik automaatse logimise pirukad public function logout($user_id) { $this->db->query("delete from ".DB_USESS." where user_id='$user_id'"); $this->db->query("delete from ".DB_AUTOLOGIN." where user_id='$user_id'"); } //lisab automaatse logimise public function add_autologin($user_id) { $this->db->query("insert into ".DB_AUTOLOGIN."(user_id, hash, ip, time) values( '$user_id', '$this->sid', '$this->remote_ip', '$time')"); } //kontrollib, kas aututomaatne logimine on olemas public function autologged_in() { $hash = $_COOKIE[ACOOKIE_NAME]; $user_id = $this->db->result("select user_id from ".DB_AUTOLOGIN." where hash='$hash' and ip='$this->remote_ip' and time>='$time'"); return $user_id['user_id']; else return false; } }
|
|
|
| Kommentaarid: 51 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
3 :: |
40 |
|
| tagasi üles |
|
 |
nene
Kreisi kasutaja

liitunud: 20.03.2004
|
08.01.2009 22:35:46
|
|
|
| keevitaja kirjutas: |
| aga mis moodi ja millal oleks korrektne muutujaid defineerida? kas alati? |
See private $miinus; deklareerimine ei anna sulle midagi, kuna sa ju kusagil ei kasuta muutujat $this->miinus. Sul on küll meetod mala() argumendiga $miinus, aga sellel pole mingit seost muutujaga $this->miinus.
PHP-s toimub muutujate deklareerimine läbi neile väärtuse omistamise. Muutujat saab kasutada ka ilma sellele eelnevalt midagi omistamata, kuid see on halb stiil ning PHP annab sellise asja peale ka hoiatuse. Ainsad muutujad mida deklareeritakse on objektide väljad (näiteks public $liikuv;).
Tegelikult ma arven, et sa peaksid selle klassi isegi rohkemateks tükkideks lõhkuma, sest praegu koondab see päris mitmeid asju:
* Sessioonid
* Autentimine
* Sisse-välja logimine
* Automaatne sisselogimine
Kas just päris neljaks tükiks lõhkuda, aga kogu see värk ühes klassis on liiast.
Ja tegelikult ei saa ma endiselt aru, miks sa PHP enda sessioone ei kasuta - milleks leiutada jalgratast?
Ja veel sellised märkused:
authenticate_user on sul tiba imelik: see tagastab õnnestumisel kasutaja ID ning ebaõnnestumisel true. Miks mitte false?
Sa ei saa Session klassis kasutada $this->error(), peaks olema $this->db->error().
_________________ Mõistus otsas? Pane pinusse... |
|
| Kommentaarid: 24 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
23 |
|
| tagasi üles |
|
 |
keevitaja
AM 10 aastat

liitunud: 05.11.2001
|
06.03.2009 00:50:09
|
|
|
| keevitaja kirjutas: |
| kuidas too funktsioon välja näeks? |
| nene kirjutas: |
| $db->query("SELECT * FROM users WHERE name=? and pass=?", $name, $pass); |
|
ise küsin, ise vastan:
| php:
|
<?php define(SQL_HOST, 'localhost'); class Proov { private function format($arg_list) { $query = $arg_list[0]; for($i = 1; $i < count($arg_list); $i++ ) $new_list[] = $arg_list[$i]; return $string; } public function connect() { } public function squery() { } public function assoc($sql) { } } $p = new Proov; $p->connect(); define(TBL, 'newauth_gallery'); $page_id = '154'; $sql = $p-> squery("select img_id from %s where page_id='%s'", TBL, $page_id) or die(mysql_error()); while($id = $p->assoc($sql)) echo $id['img_id']. '<br>';
|
| php:
|
<?php define(SQL_HOST, 'localhost'); class Proov { private function sformat($arg_list) { $query = explode('?', $arg_list[0]); for($i = 1; $i < count($arg_list); $i++ ) $new_list[] = $arg_list[$i]; for($i = 0; $i < count($query); $i++ ) $string .= sprintf("%s%s", $query[$i], $new_list[$i]); return $string; } public function connect() { } public function squery() { } public function assoc($sql) { } } $p = new Proov; $p->connect(); define(TBL, 'newauth_gallery'); $page_id = '154'; $sql = $p-> squery("select img_id from ? where page_id='?'", TBL, $page_id) or die(mysql_error()); while($id = $p->assoc($sql)) echo $id['img_id']. '<br>'; ?>
|
see viimane variant, nii nagu nene mõtles, on vist parem...
edit: siiski esimine variant on söödavam, kuna siis saab ka protsendi märki vajadusel päringusse sisestada... pole kindel, kuid ma arvan, et ? on ka mysql syntaksis sees. kas on?
_________________ Hinnavaatlus ei ole koht arvamuse avaldamiseks! |
|
| Kommentaarid: 51 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
3 :: |
40 |
|
| tagasi üles |
|
 |
keevitaja
AM 10 aastat

liitunud: 05.11.2001
|
15.10.2009 22:20:27
|
|
|
kas saab kusagil öelda, et juhul kui $this->text väärtust ei ole antud, siis PrintText funktsiooni väljakutsuda ei saa.
| php:
|
<?php class Proov { public $text; function SetText($text) { $this->text = $text; } function PrintText() { } } $proov = new Proov; $proov->SetText('See on mingi tekst'); $proov->PrintText(); ?>
|
_________________ Hinnavaatlus ei ole koht arvamuse avaldamiseks! |
|
| Kommentaarid: 51 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
3 :: |
40 |
|
| tagasi üles |
|
 |
mikk36
HV Guru

liitunud: 21.02.2004
|
15.10.2009 22:21:33
|
|
|
| Välja saab ikka kutsuda PrintText meetodit enne, kuid $proov->text ei oma lihtsalt ühtegi väärtust. Milleks üldse public, kui kasutad eraldi set ja get funktsioone?
|
|
| Kommentaarid: 85 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
2 :: |
78 |
|
| tagasi üles |
|
 |
keevitaja
AM 10 aastat

liitunud: 05.11.2001
|
15.10.2009 22:27:53
|
|
|
ehk siis ma tahan, et on ka võimalus anda $this->text väärtus väliselt käsitsi.
$proov = new Proov;
$proov->text = 'See on tekst';
$proov->PrintText(); |
aga vaja olla kindel, et $this->text omab väärtust. võid muidugi teha kah PrintText() sees
if(empty($this->text))
die('error!'); |
kuid see tundu õige
_________________ Hinnavaatlus ei ole koht arvamuse avaldamiseks!
viimati muutis keevitaja 15.10.2009 22:35:23, muudetud 1 kord |
|
| Kommentaarid: 51 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
3 :: |
40 |
|
| tagasi üles |
|
 |
mikk36
HV Guru

liitunud: 21.02.2004
|
15.10.2009 22:33:09
|
|
|
Miks õige ei tundu? Getter funktsioon selle jaoks ongi, et seal sees selliseid kontrolle teha.
Kui ei ole täidetud, siis väljastad näiteks exceptioni, teises otsas võid püüda seda soovi korral kenasti.
|
|
| Kommentaarid: 85 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
2 :: |
78 |
|
| tagasi üles |
|
 |
keevitaja
AM 10 aastat

liitunud: 05.11.2001
|
15.10.2009 22:42:44
|
|
|
midagi sellist on siis ok?
| php:
|
<?php class Proov { public $text; public function SetText($text) { $this->text = $text; } private function ValidateText() { } public function PrintText() { $this->ValidateText(); } } $proov = new Proov; $proov->SetText('See on mingi tekst'); $proov->PrintText(); ?>
|
_________________ Hinnavaatlus ei ole koht arvamuse avaldamiseks! |
|
| Kommentaarid: 51 loe/lisa |
Kasutajad arvavad: |
   |
:: |
1 :: |
3 :: |
40 |
|
| tagasi üles |
|
 |
mikk36
HV Guru

liitunud: 21.02.2004
|
15.10.2009 22:53:39
|
|
|
Jah.
See, et kas soovid juba koheselt maha suretada terve scripti või kinni püütava exceptioni anda on juba edasine otsus sul.
|
|
| Kommentaarid: 85 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
2 :: |
78 |
|
| tagasi üles |
|
 |
|
| lisa lemmikuks |
|
|
sa ei või postitada uusi teemasid siia foorumisse sa ei või vastata selle foorumi teemadele sa ei või muuta oma postitusi selles foorumis sa ei või kustutada oma postitusi selles foorumis sa ei või vastata küsitlustele selles foorumis sa ei saa lisada manuseid selles foorumis sa võid manuseid alla laadida selles foorumis
|
|
Hinnavaatlus ei vastuta foorumis tehtud postituste eest.
|