Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  PHP5 OOP küsimused märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
mine lehele eelmine  1, 2, 3, 4  järgmine
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
inzinz
HV kasutaja

liitunud: 26.01.2005




sõnum 07.01.2009 22:46:19 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
keevitaja
AM 10 aastat
keevitaja

liitunud: 05.11.2001




sõnum 07.01.2009 22:51:20 vasta tsitaadiga

viitsid selle söödavaks teha? ma ei saa pihta su jutule

php:
  1. <?php
  2. class Sstatic
  3. {
  4.         public static function fun1($entry)
  5.         {
  6.                 $this->entry = $entry .' ja lisa!';
  7.         }
  8.        
  9.         public static function fun2()
  10.         {
  11.                 return strtoupper($this->entry);
  12.         }
  13. }
  14.  
  15. class Klass
  16. {
  17.         public function fun3($entry)
  18.         {
  19.                 Sstatic::fun1($entry);
  20.         }
  21.        
  22.         public function fun4()
  23.         {
  24.                 SStatic::fun2(Sstatic::entry);
  25.         }
  26. }
  27.  
  28. $obj = new Klass();
  29.  
  30. $obj->fun3('See on asi');
  31. $obj->fun4();
  32.  
  33. ?>
icon_confused.gif
Kommentaarid: 51 loe/lisa Kasutajad arvavad:  :: 1 :: 3 :: 40
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
inzinz
HV kasutaja

liitunud: 26.01.2005




sõnum 07.01.2009 22:56:28 vasta tsitaadiga


<?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
vaata kasutaja infot saada privaatsõnum
keevitaja
AM 10 aastat
keevitaja

liitunud: 05.11.2001




sõnum 07.01.2009 22:59:03 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
nene
Kreisi kasutaja
nene

liitunud: 20.03.2004




sõnum 08.01.2009 00:18:36 vasta tsitaadiga

@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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
inzinz
HV kasutaja

liitunud: 26.01.2005




sõnum 08.01.2009 00:24:45 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
keevitaja
AM 10 aastat
keevitaja

liitunud: 05.11.2001




sõnum 08.01.2009 00:37:37 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
inzinz
HV kasutaja

liitunud: 26.01.2005




sõnum 08.01.2009 00:42:08 vasta tsitaadiga

Mitte päris, aga tiba rohkem ettemõtlemist küll, mis tuleb kvaliteedile ainult kasuks icon_wink.gif
_________________
Upload.ee - eestimaine failiupload
Kommentaarid: 4 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 4
tagasi üles
vaata kasutaja infot saada privaatsõnum
keevitaja
AM 10 aastat
keevitaja

liitunud: 05.11.2001




sõnum 08.01.2009 15:28:14 vasta tsitaadiga

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:
  1. $db = new MysqlDB();
  2. $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:
  1. <?php
  2. define(SQL_DB, 'test');
  3. define(SQL_HOST, 'localhost');
  4. define(SQL_USER, 'root');
  5. define(SQL_PASS, 'kala');
  6.  
  7. define(ROOT_PATH, '/xampp/htdocs/cms/');
  8. define(S_TIME, 300);
  9. define(A_TIME, 999999999999);
  10. define(DB_PER, 'dalhf_');
  11. define(COOKIE_NAME, 'dsfsdjfl4j');
  12. define(ACOOKIE_NAME, 'a-'.COOKIE_NAME);
  13.  
  14. define(DB_USER, DB_PER.'user');
  15. define(DB_ADMIN, DB_PER.'admin');
  16. define(DB_GSESS, DB_PER.'gsess');
  17. define(DB_USESS, DB_PER.'usess');
  18. define(DB_AUTOLOGIN, DB_PER.'autologin');
  19. ?>
  20.  


install.php
php:
  1. <?php
  2. require('./conf.php');
  3. require('includes/mysql.class.php');
  4.  
  5. $db = new Mysql;
  6. $db->connect();
  7.  
  8. $cmd[DB_USER] = "
  9.         user_id int primary key not null auto_increment,
  10.         user_name varchar(20),
  11.         user_pass varchar(32),
  12.         user_realname varchar(32),
  13.         user_email varchar(32)
  14.         ";
  15.        
  16. $cmd[DB_ADMIN] = "
  17.         user_id int
  18.         ";
  19.        
  20. $cmd[DB_GSESS] = "
  21.         sess_id int primary key not null auto_increment,
  22.         hash varchar(32),
  23.         ip varchar(15)
  24.         ";
  25.        
  26. $cmd[DB_USESS] = "
  27.         sess_id int,
  28.         time int,
  29.         user_id int
  30.         ";
  31.        
  32. $cmd[DB_AUTOLOGIN] = "
  33.         user_id int,
  34.         hash varchar(32),
  35.         ip varchar(15),
  36.         time int
  37.         ";
  38.  
  39. foreach($cmd as $tbl => $sql_cmd)
  40. {
  41.         if(!$db->num_rows($db->query("SHOW TABLES LIKE '".$tbl."'")))
  42.         {
  43.                 $mysql_cmd = "create table ".$tbl."(".$sql_cmd.")";
  44.                 $db->query($mysql_cmd);
  45.         }
  46. }
  47.  
  48. $db->query("insert into ".DB_USER."(user_name, user_pass) values('admin', '".md5('admin')."')");
  49. ?>


mysql.class.php
php:
  1. <?php
  2. class Mysql
  3. {
  4.         public function connect()
  5.         {
  6.                 return mysql_select_db(SQL_DB, mysql_connect(SQL_HOST, SQL_USER, SQL_PASS));
  7.         }
  8.  
  9.         public function error()
  10.         {
  11.                 return die(mysql_error().' ('.mysql_errno().')');
  12.         }
  13.  
  14.         public function query($query)
  15.         {
  16.                 return mysql_query($query);
  17.         }
  18.        
  19.         public function fetch_assoc($result)
  20.         {
  21.                 return mysql_fetch_assoc($result);
  22.         }
  23.        
  24.         public function num_rows($result)
  25.         {
  26.                 return mysql_num_rows($result);
  27.         }
  28.        
  29.         public function result($query)
  30.         {
  31.                 $sql_query = self::query($query);
  32.                 return self::fetch_assoc($sql_query);
  33.         }
  34.        
  35.         public function insert_id()
  36.         {
  37.                 return mysql_insert_id();
  38.         }
  39. }
  40. ?>


session.class.php
php:
  1. <?php
  2. class Session
  3. {
  4.         public $remote_ip;
  5.         private $db;
  6.  
  7.         public function __construct($db)
  8.         {
  9.                 if (isset($_SERVER['HTTP_X_FORWARDED_FOR']))
  10.                 {
  11.                         $this->remote_ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
  12.                 }
  13.                 else
  14.                 {
  15.                         $this->remote_ip = $_SERVER['REMOTE_ADDR'];
  16.                 }
  17.                
  18.                 $this->db = $db; //sql
  19.         }
  20.        
  21.         public function start()
  22.         {
  23.                 //kontrollime, kas kypsised on lubatud
  24.                 $this->auth_method = (array_key_exists(COOKIE_NAME, $_COOKIE)) ? true : false;
  25.                
  26.                 //session id
  27.                 $this->sid = (strlen($_REQUEST['sid']) == 32) ? $_REQUEST['sid'] : $_COOKIE[COOKIE_NAME];
  28.         }
  29.        
  30.         public function validate()
  31.         {
  32.                 //kontrollime, kas sessioon on kehtiv
  33.                 $session = $this->db->result("select count(sess_id) as c from ".DB_GSESS." where
  34.                         hash='$this->sid' and ip='$this->remote_ip'") or die($this->error());
  35.                        
  36.                 if($session['c'] != 0)
  37.                 {
  38.                         $sess_id = $this->db->result("select sess_id from ".DB_GSESS." where
  39.                                 hash='$this->sid' and ip='$this->remote_ip'") or die($this->error());
  40.                                
  41.                         $this->sess_id = $sess_id['sess_id'];
  42.                                
  43.                         return true;
  44.                 }
  45.                        
  46.                
  47.         }
  48.        
  49.         public function new_gsess()
  50.         {
  51.                 //kui pole sellist sessio olemas, siis sisestame uue
  52.                 $this->sid = md5(time() + microtime());
  53.                
  54.                 setcookie(COOKIE_NAME, $this->sid);
  55.                
  56.                 $this->db->query("insert into ".DB_GSESS."(hash, ip)
  57.                         values('$this->sid', '$this->remote_ip')") or die($this->error());
  58.         }
  59.        
  60.         //kui cookied pole lubatud, siis lisama PHPSESSID urlile
  61.         public function url($url)
  62.         {
  63.                 if(!$this->auth_method)
  64.                         return $url . ((strstr($url, '?')) ? '&' : '?') . 'sid=' . $this->sid;
  65.                 else
  66.                         return $url;
  67.         }
  68.        
  69.         //kontrollime, kas kylastaja on sisse logitud
  70.         public function auth_user()
  71.         {
  72.                 $time = time() - S_TIME;
  73.                
  74.                 $auth = $this->db->result("select user_id from ".DB_USESS." where
  75.                         sess_id='$this->sess_id' and time>='$time'");
  76.                        
  77.                 if(is_numeric($auth['user_id']))
  78.                 {
  79.                         $this->user_id = $auth['user_id'];
  80.                         $time = time();
  81.                        
  82.                         $this->db->query("update ".DB_USESS." set time='$time' where
  83.                                 sess_id='$this->sess_id' and time>='$time'");
  84.                                
  85.                         return true;
  86.                 }
  87.                 elseif($this->auto_logged()) //kontrollime, ega automaatne logimine peal ei ole
  88.                 {
  89.                         $this->login();
  90.                         return(true);
  91.                 }
  92.         }
  93.        
  94.         //logime kasutaja sisse
  95.         public function user_check()
  96.         {
  97.                 $user_name = sql_safe(trim($_POST['user_name']));
  98.                 $user_pass = md5($_POST['user_pass']);
  99.                
  100.                 $auth = $this->db->result("select user_id from ".DB_USER." where
  101.                         user_name='$user_name' and user_pass='$user_pass'");
  102.                        
  103.                 $this->user_id = $auth['user_id'];     
  104.                        
  105.                 if(is_numeric($this->user_id))
  106.                         return true;
  107.         }
  108.        
  109.         //logime kasutaja sisse!
  110.         public function login()
  111.         {
  112.                 $time = time();
  113.                
  114.                 $this->db->query("insert into ".DB_USESS."(sess_id, time, user_id) values(
  115.                         '$this->sess_id', '$time', '$this->user_id')") or die($this->error());
  116.         }
  117.        
  118.         //logime kasutaja v2lja, samuti kustutame k6ik automaatse logimise pirukad
  119.         public function logout($user_id)
  120.         {
  121.                 $this->db->query("delete from ".DB_USESS." where user_id='$user_id'");
  122.                 $this->db->query("delete from ".DB_AUTOLOGIN." where user_id='$user_id'");
  123.                 setcookie(COOKIE_NAME, '', time()-3600);
  124.                 setcookie(ACOOKIE_NAME, '', time()-3600);
  125.                 $this->sid = md5(time() + microtime());
  126.         }
  127.        
  128.         //
  129.         public function auto_check()
  130.         {
  131.                 $time = time();
  132.                
  133.                 $this->db->query("insert into ".DB_AUTOLOGIN."(user_id, hash, ip, time) values(
  134.                         '$this->user_id', '$this->sid', '$this->remote_ip', '$time')");
  135.                        
  136.                 setcookie(ACOOKIE_NAME, $this->sid, time()+3600*24*1000);
  137.         }
  138.        
  139.         public function auto_logged()
  140.         {
  141.                 $hash = $_COOKIE[ACOOKIE_NAME];
  142.                 $time = time() - A_TIME;
  143.  
  144.                 $auto_db = $this->db->result("select user_id from ".DB_AUTOLOGIN." where
  145.                         hash='$hash' and time>='$time'");
  146.                
  147.                 if(is_numeric($auto_db['user_id']))
  148.                 {
  149.                         $this->user_id = $auto_db['user_id'];
  150.                         return(true);
  151.                 }
  152.         }
  153. }


common.php
php:
  1. <?php
  2. require(ROOT_PATH.'includes/mysql.class.php');
  3. require(ROOT_PATH.'includes/session.class.php');
  4. require(ROOT_PATH.'includes/functions.php');
  5.  
  6. //loome mysql objekti ja yhenduse
  7. $db = new Mysql;
  8. if(!$db->connect())
  9.         die('Mingi kamm andmebaasiga...');
  10.  
  11. //alustame sessiooni majandusega
  12. $sess = new Session($db);
  13. $sess->start();
  14.  
  15. if(!$sess->validate())
  16.         $sess->new_gsess();
  17.  
  18. ?>


functions.php
php:
  1. <?php
  2. function sql_safe($orig)
  3. {
  4.         return mysql_real_escape_string(get_magic_quotes_gpc() ? stripslashes($orig) : $orig );
  5. }
  6. ?>


login.php
php:
  1. <?php
  2. require('conf.php');
  3. require(ROOT_PATH.'includes/common.php');
  4.  
  5. if(!$sess->auth_user())
  6. {
  7.         if($_POST['user_name'] && $_POST['user_pass'])
  8.         {
  9.                 if($sess->user_check())
  10.                 {
  11.                         $sess->login();
  12.                        
  13.                         //vaatame, kas kasutaja tahab edaspidi automaatselt sisse logida
  14.                         if($_POST['auto'] == 1)
  15.                                 $sess->auto_check();
  16.                        
  17.                         header('Location: '.$sess->url('kala.php'));
  18.                 }
  19.                 else
  20.                         echo 'Kasutajat ei ole olemas! <a href="'.$sess->url('login.php').'">Uuesti logima >>></a>';
  21.         }
  22.         else
  23.         {
  24. ?>           
  25. <form action="login.php" method="post">
  26. <?php
  27.                         if(!$sess->auth_method)
  28.                         {
  29. ?>
  30.         <input type="hidden" name="sid" value="<?php echo $sess->sid ?>">
  31. <?php
  32.                         }
  33. ?>
  34.         <p>kasutaja <input type="text" name="user_name"></p>
  35.         <p>parool <input type="password" name="user_pass"></p>
  36.         <p>m2leta mind <input type="checkbox" name="auto" value="1"></p>
  37.         <p><input type="submit" value="Login"></p>
  38. </form>
  39.         <p><a href="<?php echo $sess->url('kala.php') ?>">Mine edasi logimata >>></a></p>
  40. <?php
  41.         }
  42. }
  43. else
  44. {
  45.         $sess->logout($sess->user_id);
  46.         echo 'Kasutaja on v2lja logitud! <a href="'.$sess->url('login.php').'">Uuesti logima >>></a>';
  47.  
  48. }
  49. ?>


kala.php
php:
  1. <?php
  2. require('conf.php');
  3. require(ROOT_PATH.'includes/common.php');
  4.  
  5. echo '<a href="' . $sess->url('kala.php') . '">refresh</a><hr>';
  6.  
  7. if($sess->auth_user())
  8. {
  9.         echo '<b>Kasutaja on sisse logitud!</b> <a href="'.$sess->url('login.php').'">Logout</a><br>';
  10.         echo 'sesiooni hash: '.$sess->sid;
  11. }
  12. else
  13.         echo 'Kasutaja ei ole sisse logitud! <a href="'.$sess->url('login.php').'">Login</a>';
  14.  
  15. ?>
  16.  
Kommentaarid: 51 loe/lisa Kasutajad arvavad:  :: 1 :: 3 :: 40
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
mikk36
HV Guru
mikk36

liitunud: 21.02.2004




sõnum 08.01.2009 15:28:27 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
keevitaja
AM 10 aastat
keevitaja

liitunud: 05.11.2001




sõnum 08.01.2009 15:29:27 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
mikk36
HV Guru
mikk36

liitunud: 21.02.2004




sõnum 08.01.2009 15:30:28 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
keevitaja
AM 10 aastat
keevitaja

liitunud: 05.11.2001




sõnum 08.01.2009 15:33:47 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
nene
Kreisi kasutaja
nene

liitunud: 20.03.2004




sõnum 08.01.2009 16:31:10 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
keevitaja
AM 10 aastat
keevitaja

liitunud: 05.11.2001




sõnum 08.01.2009 18:22:41 vasta tsitaadiga

nene, asjalik jutt sul alati thumbs_up.gif
_________________
Hinnavaatlus ei ole koht arvamuse avaldamiseks!
Kommentaarid: 51 loe/lisa Kasutajad arvavad:  :: 1 :: 3 :: 40
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
keevitaja
AM 10 aastat
keevitaja

liitunud: 05.11.2001




sõnum 08.01.2009 18:27:59 vasta tsitaadiga

aga mis moodi ja millal oleks korrektne muutujaid defineerida? kas alati? näiteks:

php:
  1. <?php
  2. class Klass
  3. {
  4.         public $liikuv;
  5.         private $miinus;
  6.        
  7.         public function kala()
  8.         {
  9.                 $this->liikuv = 100;
  10.         }
  11.        
  12.         public function mala($miinus)
  13.         {
  14.                 $this->liikuv = $this->liikuv - $miinus;
  15.         }
  16. }
  17.  
  18. $obj = new Klass;
  19. $obj->kala();
  20. $obj->mala(77);
  21. print $obj->liikuv;
  22. ?>
Kommentaarid: 51 loe/lisa Kasutajad arvavad:  :: 1 :: 3 :: 40
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
keevitaja
AM 10 aastat
keevitaja

liitunud: 05.11.2001




sõnum 08.01.2009 21:46:57 vasta tsitaadiga

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:
  1. <?php
  2. class Session
  3. {
  4.         public $remote_ip;
  5.         private $db;
  6.  
  7.         public function __construct($db)
  8.         {
  9.                 //kasutaja ip tuvastamise kontrolliks
  10.                 $this->remote_ip = isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'];
  11.                
  12.                 //andmebaasi klass
  13.                 $this->db = $db;
  14.                
  15.                 //sessiooni meetod. kontrollib, kas brauseril on kypsised lubatud
  16.                 $this->auth_method = (array_key_exists(COOKIE_NAME, $_COOKIE)) ? true : false;
  17.                
  18.                 //sessiooni hash
  19.                 $this->sid = (strlen($_REQUEST['sid']) == 32) ? $_REQUEST['sid'] : $_COOKIE[COOKIE_NAME];
  20.         }
  21.        
  22.         //kontrollib, kas sessioon on kehtiv
  23.         public function validate_session()
  24.         {
  25.                 //kontrollime, kas sessioon on kehtiv
  26.                 $session = $this->db->result("select count(sess_id) as c from ".DB_GSESS." where
  27.                         hash='$this->sid' and ip='$this->remote_ip'") or die($this->error());
  28.                        
  29.                 if($session['c'] != 0)
  30.                 {
  31.                         $sess_id = $this->db->result("select sess_id from ".DB_GSESS." where
  32.                                 hash='$this->sid' and ip='$this->remote_ip'") or die($this->error());
  33.                                
  34.                         //sessiooni id kasutaja audentimiseks
  35.                         $this->sess_id = $sess_id['sess_id'];
  36.                                
  37.                         return true;
  38.                 }
  39.         }
  40.        
  41.         //loob uue globaalse sessiooni
  42.         public function start_session()
  43.         {
  44.                 $this->sid = md5(time() + microtime());
  45.                
  46.                 setcookie(COOKIE_NAME, $this->sid);
  47.                
  48.                 $this->db->query("insert into ".DB_GSESS."(hash, ip)
  49.                         values('$this->sid', '$this->remote_ip')") or die($this->error());
  50.         }
  51.        
  52.         //kui cookied pole lubatud, siis lisab sessiooni hashi urlile
  53.         public function addsid($url)
  54.         {
  55.                 if(!$this->auth_method)
  56.                         return $url . ((strstr($url, '?')) ? '&' : '?') . 'sid=' . $this->sid;
  57.                 else
  58.                         return $url;
  59.         }
  60.        
  61.         //kontrollime, kas kylastaja on sisse logitud
  62.         public function logged_in()
  63.         {
  64.                 $time = time() - S_TIME;
  65.                
  66.                 $user_id = $this->db->result("select user_id from ".DB_USESS." where
  67.                         sess_id='$this->sess_id' and time>='$time'");
  68.                        
  69.                 if(is_numeric($user_id['user_id']))
  70.                 {
  71.                         //siselogitud kasutaja id
  72.                         $this->user_id = $user_id['user_id'];
  73.                        
  74.                         $time = time();
  75.                        
  76.                         $this->db->query("update ".DB_USESS." set time='$time' where
  77.                                 sess_id='$this->sess_id' and time>='$time'");
  78.                                
  79.                         return true;
  80.                 }
  81.                 //kontrollime, kas on automaatne logimine
  82.                 elseif($user_id = $this->autologged_in())
  83.                 {
  84.                         $this->login_user($user_id);
  85.                         $this->user_id = $user_id;
  86.                         return true;
  87.                 }
  88.                 else
  89.                         return false;
  90.                        
  91.         }
  92.        
  93.         //logime kasutaja sisse
  94.         public function authenticate_user($user_name, $user_pass)
  95.         {
  96.                 $user_name = sql_safe(trim($user_name));
  97.                 $user_pass = md5($user_pass);
  98.                
  99.                 $user_id = $this->db->result("select user_id from ".DB_USER." where
  100.                         user_name='$user_name' and user_pass='$user_pass'");   
  101.                        
  102.                 if(is_numeric($this->user_id))
  103.                         return $user_id['user_id'];
  104.                 else
  105.                         return true;
  106.         }
  107.        
  108.         //logime kasutaja sisse!
  109.         public function login_user($user_id)
  110.         {
  111.                 $time = time();
  112.                
  113.                 $this->db->query("insert into ".DB_USESS."(sess_id, time, user_id) values(
  114.                         '$this->sess_id', '$time', '$user_id')");
  115.         }
  116.        
  117.         //logime kasutaja v2lja, samuti kustutame k6ik automaatse logimise pirukad
  118.         public function logout($user_id)
  119.         {
  120.                 $this->db->query("delete from ".DB_USESS." where user_id='$user_id'");
  121.                 $this->db->query("delete from ".DB_AUTOLOGIN." where user_id='$user_id'");
  122.                 setcookie(COOKIE_NAME, '', time()-3600);
  123.                 setcookie(ACOOKIE_NAME, '', time()-3600);
  124.                 $this->sid = md5(time() + microtime());
  125.         }
  126.        
  127.         //lisab automaatse logimise
  128.         public function add_autologin($user_id)
  129.         {
  130.                 $time = time();
  131.                
  132.                 $this->db->query("insert into ".DB_AUTOLOGIN."(user_id, hash, ip, time) values(
  133.                         '$user_id', '$this->sid', '$this->remote_ip', '$time')");
  134.                        
  135.                 setcookie(ACOOKIE_NAME, $this->sid, time()+3600*24*1000);
  136.         }
  137.        
  138.         //kontrollib, kas aututomaatne logimine on olemas
  139.         public function autologged_in()
  140.         {
  141.                 $hash = $_COOKIE[ACOOKIE_NAME];
  142.                 $time = time() - A_TIME;
  143.  
  144.                 $user_id = $this->db->result("select user_id from ".DB_AUTOLOGIN." where
  145.                         hash='$hash' and ip='$this->remote_ip' and time>='$time'");
  146.                
  147.                 if(is_numeric($user_id['user_id']))
  148.                         return $user_id['user_id'];
  149.                 else
  150.                         return false;
  151.         }
  152. }
Kommentaarid: 51 loe/lisa Kasutajad arvavad:  :: 1 :: 3 :: 40
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
nene
Kreisi kasutaja
nene

liitunud: 20.03.2004




sõnum 08.01.2009 22:35:46 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
keevitaja
AM 10 aastat
keevitaja

liitunud: 05.11.2001




sõnum 06.03.2009 00:50:09 vasta tsitaadiga

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:
  1. <?php
  2. define(SQL_DB, 'test');
  3. define(SQL_HOST, 'localhost');
  4. define(SQL_USER, 'root');
  5. define(SQL_PASS, 'kala');
  6.  
  7. class Proov
  8. {
  9.         private function format($arg_list)
  10.         {
  11.                 $query = $arg_list[0];
  12.                
  13.                 for($i = 1;$i < count($arg_list);$i++)
  14.                         $new_list[] = $arg_list[$i];
  15.                        
  16.                 $string = vsprintf($query, $new_list);
  17.                
  18.                 return $string;
  19.         }
  20.        
  21.         public function connect()
  22.         {
  23.                 return mysql_select_db(SQL_DB, mysql_connect(SQL_HOST, SQL_USER, SQL_PASS));
  24.         }
  25.        
  26.         public function squery()
  27.         {
  28.                 $query = $this->format(func_get_args());
  29.                
  30.                 return mysql_query($query);
  31.         }
  32.        
  33.         public function assoc($sql)
  34.         {
  35.                 return mysql_fetch_assoc($sql);
  36.         }
  37. }
  38.  
  39. $p = new Proov;
  40. $p->connect();
  41.  
  42. define(TBL, 'newauth_gallery');
  43. $page_id = '154';
  44.  
  45. $sql = $p->squery("select img_id from %s where page_id='%s'", TBL, $page_id) or die(mysql_error());
  46.  
  47. while($id = $p->assoc($sql))
  48.         echo $id['img_id'].'<br>';


php:
  1. <?php
  2. define(SQL_DB, 'test');
  3. define(SQL_HOST, 'localhost');
  4. define(SQL_USER, 'root');
  5. define(SQL_PASS, 'kala');
  6.  
  7. class Proov
  8. {
  9.         private function sformat($arg_list)
  10.         {
  11.                 $query = explode('?', $arg_list[0]);
  12.                
  13.                 for($i = 1;$i < count($arg_list);$i++)
  14.                         $new_list[] = $arg_list[$i];
  15.                        
  16.                 for($i = 0;$i < count($query);$i++)
  17.                         $string .= sprintf("%s%s", $query[$i], $new_list[$i]);
  18.                
  19.                 return $string;
  20.         }
  21.        
  22.         public function connect()
  23.         {
  24.                 return mysql_select_db(SQL_DB, mysql_connect(SQL_HOST, SQL_USER, SQL_PASS));
  25.         }
  26.        
  27.         public function squery()
  28.         {
  29.                 $query = $this->sformat(func_get_args());
  30.                
  31.                 return mysql_query($query);
  32.         }
  33.        
  34.         public function assoc($sql)
  35.         {
  36.                 return mysql_fetch_assoc($sql);
  37.         }
  38. }
  39.  
  40. $p = new Proov;
  41. $p->connect();
  42.  
  43. define(TBL, 'newauth_gallery');
  44. $page_id = '154';
  45.  
  46. $sql = $p->squery("select img_id from ? where page_id='?'", TBL, $page_id) or die(mysql_error());
  47.  
  48. while($id = $p->assoc($sql))
  49.         echo $id['img_id'].'<br>';
  50. ?>


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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
keevitaja
AM 10 aastat
keevitaja

liitunud: 05.11.2001




sõnum 15.10.2009 22:20:27 vasta tsitaadiga

kas saab kusagil öelda, et juhul kui $this->text väärtust ei ole antud, siis PrintText funktsiooni väljakutsuda ei saa.

php:
  1. <?php
  2. class Proov
  3. {
  4.         public $text;
  5.        
  6.         function SetText($text)
  7.         {
  8.                 $this->text = $text;
  9.         }
  10.        
  11.         function PrintText()
  12.         {
  13.                 echo $this->text;
  14.         }
  15. }
  16.  
  17. $proov = new Proov;
  18. $proov->SetText('See on mingi tekst');
  19. $proov->PrintText();
  20. ?>

_________________
Hinnavaatlus ei ole koht arvamuse avaldamiseks!
Kommentaarid: 51 loe/lisa Kasutajad arvavad:  :: 1 :: 3 :: 40
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
mikk36
HV Guru
mikk36

liitunud: 21.02.2004




sõnum 15.10.2009 22:21:33 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
keevitaja
AM 10 aastat
keevitaja

liitunud: 05.11.2001




sõnum 15.10.2009 22:27:53 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
mikk36
HV Guru
mikk36

liitunud: 21.02.2004




sõnum 15.10.2009 22:33:09 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
keevitaja
AM 10 aastat
keevitaja

liitunud: 05.11.2001




sõnum 15.10.2009 22:42:44 vasta tsitaadiga

midagi sellist on siis ok?

php:
  1. <?php
  2. class Proov
  3. {
  4.         public $text;
  5.        
  6.         public function SetText($text)
  7.         {
  8.                 $this->text = $text;
  9.         }
  10.        
  11.         private function ValidateText()
  12.         {
  13.                 if(empty($this->text))
  14.                         die('Puudub text!');
  15.         }
  16.        
  17.         public function PrintText()
  18.         {
  19.                 $this->ValidateText();
  20.                
  21.                 echo $this->text;
  22.         }
  23. }
  24.  
  25. $proov = new Proov;
  26. $proov->SetText('See on mingi tekst');
  27. $proov->PrintText();
  28. ?>

_________________
Hinnavaatlus ei ole koht arvamuse avaldamiseks!
Kommentaarid: 51 loe/lisa Kasutajad arvavad:  :: 1 :: 3 :: 40
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
mikk36
HV Guru
mikk36

liitunud: 21.02.2004




sõnum 15.10.2009 22:53:39 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  PHP5 OOP küsimused mine lehele eelmine  1, 2, 3, 4  järgmine
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
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.