PDA

View Full Version : سوال: آیا کد من از نظر شی گرایی درست است؟



amin7x
شنبه 05 اسفند 1391, 15:45 عصر
سلام دوستان

میخواستم ببینم توی کد من اصول شی گرایی درست رعایت شده یا نه؟



<?php
/*
UserLogin Class File
Coded By Amin7x
*/

class UserLogin{

protected $username;
protected $password;
private $connect;

public function __construct($dbhost,$dbusername,$dbpassword,$dbnam e){

$this->connect = mysql_connect($dbhost,$dbusername,$dbpassword) or die("Can't Connect To DataBase"."<br />".mysql_error());
mysql_select_db($dbname,$this->connect);
}

private function SelectUser($user,$pass){

$result=mysql_query("SELECT * FROM `users` WHERE `user_login`='$user' and `user_pass`='$pass'",$this->connect);
$count=mysql_num_rows($result);
if($count==1){
echo "شما با موفقیت وارد شدید";
}
else{
echo "لطفا نام کاربری و رمزعبور را درست وارد کنید";
}
}

public function Login($username,$password){

$this->username = $username;
$this->password = $password;
$this->SelectUser($this->username,$this->password);
}
}
?>


این هم برای اجراش :



$objul = new UserLogin($dbhost,$dbusername,$dbpassword,$dbname) ;
$objul->Login($_POST['user'],$_POST['pass']);

Tarragon
شنبه 05 اسفند 1391, 16:08 عصر
سلام
هم می شه گفت اره هم می شه گفت نه !
اره چون نوشته class UserLogin و نه چون شما باید برای کار با sql تون از یه کلاس دیگه که کار با sql رو به عهده داره استفاده کنید
این کلاس (http://barnamenevis.org/showthread.php?377968) ، کلاس خوبیه .
من این کلاس استفاده می کنم

amin7x
شنبه 05 اسفند 1391, 17:59 عصر
سلام
هم می شه گفت اره هم می شه گفت نه !
اره چون نوشته class UserLogin و نه چون شما باید برای کار با sql تون از یه کلاس دیگه که کار با sql رو به عهده داره استفاده کنید
این کلاس (http://barnamenevis.org/showthread.php?377968) ، کلاس خوبیه .
من این کلاس استفاده می کنم

اینجا وراثت میخواست که من بلد نبودم :لبخندساده:

Tarragon
شنبه 05 اسفند 1391, 21:12 عصر
سلام
بنظرم ربطی به وراثت نداره آخه شما باید یه متغیر رو به اون کلاس مثلا :
<?php
class sign {
protected $db;
public $errno = false,$error = null;
public function __construct(){
global $config;
$this->db = new mysql($config['db']['host'],$config['db']['user'],$config['db']['pass'],$config['db']['name']);
$this->temp = $this->db->Select('school', array($name => $code))->fetch();
return ($this->temp->NumRows == 1 ? true : false);
}
}
سریع نوشتم دیگه ببخشید صرفا جهت نمونه است.

imanitc
یک شنبه 06 اسفند 1391, 11:33 صبح
به نظر من وقتی شی گرا می نویسی همه چی باید شئ باشه مثالا نباید دیگه پارامتر بفرستی به تابعت باید متغییر یا پرو پرتیهات قبلا ست بکنی فقط تابع صدا بزنی مثلا


$objul->user = 'root';
$objul->Login();

plague
دوشنبه 07 اسفند 1391, 01:12 صبح
شما در متد login وقتی نوشته

$this->username = $username;
دیگه لازم نیست به متد SelectUser بفرستی این پارامتر ها رو

SELECT * FROM `users` WHERE `user_login`='$this->username'

------

اگه میخای کاملا از شی گرایی استفاده ببری کاری کن که بعد از لاگین یه شی به یوزر برگشت داده بشه
مثلا


$objul = new UserLogin($dbhost,$dbusername,$dbpassword,$dbname) ;
$user = $objul->Login($_POST['user'],$_POST['pass']);

if(!$user)
{
echo 'يافت نشد';
}
else
echo 'خوش آمديد'; echo $user->username;

نه اینکه توی کلاس اکو کنی یافت نشد !

imanitc
دوشنبه 07 اسفند 1391, 11:10 صبح
ببينيد يه کم مطالعه بيشتر بد نيست کلا در تعريف کلاس بايد استاندارد هايي رعابت بشه که از مهمترين اجزا يک کلاس متد ها و پرو پرتيها مي باشند که منظور از متد ها همون توابع کلاس و پروپرتيها متغيير ها مي باشند پس بنابراين شما نباشد هيچ پارامتري خارج از کلاس به توابع يا متد ها پا س بدي در پست قبلي مثالش زدم بيشتر مطالعه کني خودت کامل متوجه ميشي منظورم چيه

amin7x
شنبه 26 اسفند 1391, 15:59 عصر
سلام دوباره به دوستان این دفه یک کلاس جدید نوشتم :



<?php
include_once('dataBase.class.php');

class userLogin{
private $username;
private $password;

function __construct(){

if(isset($_POST['login'])){
$this->username = $_POST['username'];
$this->password = $_POST['password'];
$this->Login();
}
}

private function Login(){

if(!isset($this->username)||!isset($this->password)){
die("Username & Password Is Not Valid");
}
$this->username = strtolower($this->username);
$this->password = md5(sha1($this->password));
$mysql = new Mysql('localhost', 'root', '', 'test', true);
$query = $mysql->query("SELECT * FROM `user` WHERE `user`= '$this->username' AND `pass`= '$this->password' LIMIT 1");
if ($query->num_rows() == 1) {
echo "Success";
}
else{
echo "Failed";
}
}
}
?>


از این کلاس (http://barnamenevis.org/showthread.php?377968) برای ارتباط با دیتابیس کمک گرفتم.
باتشکر از آقا مصطفی (MostafaEs3 (http://barnamenevis.org/member.php?240106-MostafaEs3)) که درمورد کلاسشون به من راهنمایی های کاملی رو اراعه کردند.

دوستان اگه میشه نظرتون رو بگید.

و یک سوال چرا توی کلاس نباید اکو کنم "ورود با موفقیت انجام شد" یا ... مشکلی پیش میاره؟

Tarragon
شنبه 26 اسفند 1391, 17:24 عصر
سلام
آفرین این دفعه خیلی بهتر شد اما موضوع زیر مشکل داره :
شما باید قسمت
$mysql = new Mysql('localhost', 'root', '', 'test', true); رو در قسمت شروع شی قرار بدید.چون ممکنه چند بار نیاز داشته باشید با SQL ارتباط برقرار کنید.
چواب سوال شما اینه که شما باید جوری کار کنی که اگر ورود با موفقیت انجام شد دستور صحیح وارد شدن رو برگردونی کدش می شه
return true; و در غیر این صورت خطا در ورود رو برگردونی
return false; چون ممکنه بخوای از این متد در چند جا استفاده کنی و نتونی کلمه "ورود با موفقیت انجام شد" رو اکو کنی . یه دستور شرطی می نویسی اگر ورود با موفقیت انجام شد بنویسه ... .
امیدوارم کمکی کرده باشم.

amin7x
شنبه 26 اسفند 1391, 18:36 عصر
سلام ممنون از کمکتون.
ببخشید منظور شما این است؟ :



<?php
include_once('dataBase.class.php');

class userLogin{
private $username;
private $password;

function __construct(){
if(isset($_POST['login'])){
$this->username = $_POST['username'];
$this->password = $_POST['password'];
$this->Login();
}
}

private function Login(){
$mysql = new Mysql('localhost', 'root', '', 'test', true);
if(!isset($this->username)||!isset($this->password)){
die("Username & Password Is Not Valid");
}
$this->username = strtolower($this->username);
$this->password = md5(sha1($this->password));
$query = $mysql->query("SELECT * FROM `user` WHERE `user`= '$this->username' AND `pass`= '$this->password' LIMIT 1");
if ($query->num_rows() == 1) {
return true;
}
else{
return false;
}
}
}
?>


این طوری که دیگه پیغامی نمایش داده نمیشه ، کاربر از کجا بفهمه لاگین میشه یا نه؟

بازم ممنون

T.R.G.T
شنبه 26 اسفند 1391, 19:00 عصر
بنظرم بجای استفاده از یک کلاس صرفا برای لاگین بهتره از یک کلاس برای مدیریت دسترسی ها استفاده کنی و داخل اون کلاس از یک تابع بعنوان مقدار دهی داده های خارجی استفاده کنی(کوکی جلسه یا...)

amin7x
یک شنبه 27 اسفند 1391, 15:25 عصر
بنظرم بجای استفاده از یک کلاس صرفا برای لاگین بهتره از یک کلاس برای مدیریت دسترسی ها استفاده کنی و داخل اون کلاس از یک تابع بعنوان مقدار دهی داده های خارجی استفاده کنی(کوکی جلسه یا...)

میشه منظورتون رو مبتدی تر بگید؟

و اگه میشه جواب سوال بالا رو هم بگید.

ممنون

Tarragon
یک شنبه 27 اسفند 1391, 15:30 عصر
منظورشون رو تقريبا به زبان ساده مي شه گفت كه :
شما بايد يه كلاس به نام sign بسازيد و توش سه متد ثبت نام ، ورود و خروج رو معرفي كنيد.
اميد وارم هم درست فهميده باشم هم درست گفته باشم.

amin7x
یک شنبه 27 اسفند 1391, 15:35 عصر
منظورشون رو تقريبا به زبان ساده مي شه گفت كه :
شما بايد يه كلاس به نام sign بسازيد و توش سه متد ثبت نام ، ورود و خروج رو معرفي كنيد.
اميد وارم هم درست فهميده باشم هم درست گفته باشم.
ممنون
من این کلاس رو تکمیل تر میکنم. (به زودی...)

اگه میشه جواب این پایین هم بدید :


سلام ممنون از کمکتون.
ببخشید منظور شما این است؟ :



<?php
include_once('dataBase.class.php');

class userLogin{
private $username;
private $password;

function __construct(){
if(isset($_POST['login'])){
$this->username = $_POST['username'];
$this->password = $_POST['password'];
$this->Login();
}
}

private function Login(){
$mysql = new Mysql('localhost', 'root', '', 'test', true);
if(!isset($this->username)||!isset($this->password)){
die("Username & Password Is Not Valid");
}
$this->username = strtolower($this->username);
$this->password = md5(sha1($this->password));
$query = $mysql->query("SELECT * FROM `user` WHERE `user`= '$this->username' AND `pass`= '$this->password' LIMIT 1");
if ($query->num_rows() == 1) {
return true;
}
else{
return false;
}
}
}
?>


این طوری که دیگه پیغامی نمایش داده نمیشه ، کاربر از کجا بفهمه لاگین میشه یا نه؟

بازم ممنون

T.R.G.T
یک شنبه 27 اسفند 1391, 16:09 عصر
میدونی بهترین رستوران ها یا بهترین کتاب ها یا بهترین آموزش ها چه آموزش هایی هستند اونایی که علاوه بر کیفیت توشون جزئیات رعایت شده باشه بهشون توجه شده باشه

بهترین کلاس هم کلاسیه که بشه راحت مدیریتش کرد قابل انعطاف باشه داده ها رو در حالات مختلف بگیره در حالات مختلف پردازش کنه و در حالات مختلف خروجی بده بشه جزئیات رو ازش خوند تغییر داد و... هروقت کلاست به همچین امکانی دست پیدا کرد بدون که قطعا کلاس خوبیه
منظور من اینه که یک کلاس بنویس که بتونه
کل دسترسی های یک کاربر رو بخونه
محدودیت هاش رو بخونه
بتونه اجازه دسترسی یا عدم دسترسی یک کاربر به یک نقطه رو مشخص کنه
بتونه خودش بر اساس موقعیت های مختلف محدودیت ها یا... به کاربر اعمال کنه و...
برای اینکار هم باید کلاس های مختلفی داشته باشی
1 کلاس کاربران
2 کلاس گروه های کاربری(اگه گروه کاربری نداشته باشی نیاز نیست)
3 کلاس بانک اطلاعاتی
4 کلاس مدیریت صفحات(برای دسترسی به اولویت صفحه درخواستی و..)
و.....
داخل این کلاس میتونی توابع مختلفی داشته باشی مثلا
تابع تایید کاربر(مثلا یوزر و پسورد کاربر رو تطبیق بدی در صورت درست بودن کاربر رو تایید کنی)
تابع مشخص کردن دسترسی کاربر به یک صفحه
تابع ثبت داده های خارجی و..........

فایده ی این کلاس چیه؟
با یک کلاس لاگین عملا چنتا داده از پیش تایین شده رو میگیری پردازش میکنی و یک داده از پیش تایین شده دیگه برمیگردونی که اگه بخوای دوباره استفادش کنی توی یک سیستم دیگه باید نیم ساعت بشینی تغییرش بدی ولی با همچین کلاسی میتونی بدون مشکل سرعت کارت رو چند برابر کنی
یکی دیگه از فواید این کلاس توی سیستم های مدیریت محتوای قابل گسترش که مثلا یک پلاگین داری که اطلاعات کاربر رو که درخواست داده باید بگیره در صورت درست بودن و دسترسی داشتن کاربر داده ای رو برگردونه حالا توی یک سیستم معمولی این پلاگین باید نیم ساعت بره دیتابیس و کاربر رو بخونه بعد تایید کنه بعد دسترسی رو بخونه و..................... ولی با همچین کلاسی کافیه کلاس رو فراخوانی کنه اطلاعات کاربر و صفحه درخواستی رو به کلاس بده بعد هم نتیجه رو دریافت کنه کل این کار 2 خط هم نمیشه ولی در حالت معمولی باید حد اقل 200 خط برنامه نویسی بکنی تا به جواب برسی

Tarragon
یک شنبه 27 اسفند 1391, 16:39 عصر
ممنون
من این کلاس رو تکمیل تر میکنم. (به زودی...)

اگه میشه جواب این پایین هم بدید :
من هم در كلاس شما تغيير دادم و هم يه مثال توپ زدم :لبخند:

<?php
// your class
include_once('dataBase.class.php');

class userLogin{
private $username;
private $password;
private $mysql;

function __construct(){
$mysql = new Mysql('localhost', 'root', '', 'test', true);
}
}

private function Login($username,$password){
$this->username = $username;
$this->password = $password;
if(!isset($this->username)||!isset($this->password)){
die("Username & Password Is Not Valid");
}
$this->username = strtolower($this->username);
$this->password = md5(sha1($this->password));
$query = $this->mysql->query("SELECT * FROM `user` WHERE `user`= '$this->username' AND `pass`= '$this->password' LIMIT 1");
if ($query->num_rows() == 1) {
return true;
}
else{
return false;
}
}
}
// example :
$new = new userLogin();
if($new->Login("username","password")){echo "ورود با موفقيت انجام شد!";}else{echo "خطا در ورود";}
?>

amin7x
چهارشنبه 30 اسفند 1391, 17:41 عصر
داشتم پست های بالا رو میخوندم که فهمیدم با ساختار سه شرطی میشه دستور if و else آخر رو برداشت :

کد قبلی :


if ($query->num_rows() == 1) {
return true;
}
else{
return false;
}


کد جدید :


return ($query->num_rows() == 1 ? true : false)

amin7x
چهارشنبه 30 اسفند 1391, 17:46 عصر
به نظر من وقتی شی گرا می نویسی همه چی باید شئ باشه مثالا نباید دیگه پارامتر بفرستی به تابعت باید متغییر یا پرو پرتیهات قبلا ست بکنی فقط تابع صدا بزنی مثلا


$objul->user = 'root';
$objul->Login();


فکر کنم توی کد جدید شما (amin0256 (http://barnamenevis.org/member.php?235166-amin0256)) این توضیحات بالا رعایت نشده :



$new = new userLogin();if($new->Login("username","password")){echo "ورود با موفقيت انجام شد!";}else{echo "خطا در ورود";}

amin7x
چهارشنبه 30 اسفند 1391, 23:59 عصر
<?php
include_once('dataBase.class.php');

class userLogin{
private $username;
private $password;
private $mysql;

public function __construct(){
$mysql = new Mysql('localhost', 'root', '', 'test', true);
}

private function Login($username,$password){
$this->username = $username;
$this->password = $password;
if(!isset($this->username)||!isset($this->password)){
die("Username & Password Is Not Valid");
}
$this->username = strtolower($this->username);
$this->password = md5(sha1($this->password));
$query = $this->mysql->query("SELECT * FROM `user` WHERE `user`= '$this->username' AND `pass`= '$this->password' LIMIT 1");
return ($query->num_rows() == 1 ? true : false);
}
}
?>


این ارور رو میده :


Fatal error: Call to private method userLogin::Login() from context

SadeghPro19
پنج شنبه 01 فروردین 1392, 11:44 صبح
این خط رو

private function Login($username,$password){
به این تبدیل کنید:


public function Login($username,$password){

amin7x
پنج شنبه 01 فروردین 1392, 12:12 عصر
این خط رو

private function Login($username,$password){
به این تبدیل کنید:


public function Login($username,$password){

مشکلی پیش نمیاره؟ (از نظر امنیتی)

engmmrj
پنج شنبه 01 فروردین 1392, 12:33 عصر
هیچ مشکل امنیتی پیش نمی یاد
این خط رو به خاطر sql injection and xss تغییر بده

$this->username = mysql_escape_string(htmlspecialchars($username));