PDA

View Full Version : مشکل ذخیره نشدن اطلاعات تو سشن



lordofphp
شنبه 05 خرداد 1397, 21:36 عصر
سلام
من دارم یه سبد خرید مینویسم اینم کدام:
کد کنترلر:


<?php
namespace Controller;
session_start();
class Cart
{
public static $counter=0;
// private $customerid;
//private $amount;
private $choosenProduct;
//private $counterOfAddItem=0;

public function __construct()
{
Cart::$counter++;
echo Cart::$counter;
// $this->customerid=$customerid;
// $this->amount=$amount;
$this->choosenProduct=array();//tabdil be araye ba castam mishod?
//$_SESSION['Cart']=array();
}
public function addItem($choosenItem)
{

array_push($this->choosenProduct,$choosenItem);
$_SESSION['Cart']=$this->choosenProduct;
var_dump($_SESSION['Cart']);
/* echo $choosenItem;
array_push($this->choosenProduct,$choosenItem,3);//yek onsor(arayei) be choosenProduct ezafeKardim
var_dump($this->choosenProduct);
$_SESSION['Cart']=$this->choosenProduct;
//har sefaresh kharid ye araye ke har ozv araye arayei az ettelat sefareshe
*/
}

}



اینم کد ویو:


<?php
require_once('C:\wamp64\www\MWS\Santa\classes\Cont roller\Cart.php');
@$submit=$_POST['submit'];
$cartObj=new \Controller\Cart();
if(isset($submit)){
// echo '<form method=post><input type=text name=amount >enter amount of order <br><input type=submit name=submit>submit</form>';

$amount=$_POST['amount'];
$customerid=$_POST['customerid'];
$productid=$_POST['productid'];
$choosenItem=array('productid'=>$productid,'customerid'=>$customerid,'amount'=>$amount);
$cartObj->addItem($choosenItem);

}
if(!isset($submit))
{
var_dump($_SESSION['Cart']);
foreach($_SESSION['Cart'] as $product)
{
foreach($product as $value)
echo $value;
}
}


?>



حالا مشکلی ک دارم اینه ک اطلاعاتو توی سشن ذخیره نمیکنه ینی بعد سند کردن تعداد یبار میره تو سشن وقتی ک صفحه رو دوباره لود میکنم میپره و اینکه نمیشه بیشتر از یبار بش اطلاعات داد

plague
یک شنبه 06 خرداد 1397, 18:47 عصر
session_start باید اولین خط باشه
کلا ساخارت مشکل داره نباید session_Start رو توی فایل کلاس بزاری

lordofphp
دوشنبه 07 خرداد 1397, 00:10 صبح
اره مشکل از اون بوده ولی سشن تو ویو اجرا کردم حالا نمیدونم کار درستیه یا نه ؟ الان اینطوری کردم کدمو:
کنترلر:


<?phpnamespace Controller;session_start();require_once('C:\wamp64 \www\MWS\Santa\classes\Model\Cart.php');class Cart{ public static $counter=0; // private $customerid; //private $amount; private $choosenProduct=array(); private $cartModel; //private $counterOfAddItem=0; public function __construct() { $this->cartModel=new \Cart(); // $this->customerid=$customerid; // $this->amount=$amount; } public function addItem($choosenItem) { array_push($_SESSION['Cart'],$choosenItem); var_dump($_SESSION['Cart']); /* echo $choosenItem; array_push($this->choosenProduct,$choosenItem,3);//yek onsor(arayei) be choosenProduct ezafeKardim var_dump($this->choosenProduct); $_SESSION['Cart']=$this->choosenProduct; //har sefaresh kharid ye araye ke har ozv araye arayei az ettelat sefareshe */ } }

ویو:


<?php
//$_SESSION['Cart']=array();require_once('C:\wamp64\www\MWS\Santa\cla sses\Controller\Cart.php');@$submit=$_POST['submit'];$cartObj=new \Controller\Cart();if($_SESSION['Cart']==null) $_SESSION['Cart']=array();if(isset($submit)&&!empty($submit)){ $amount=$_POST['amount']; $customerusername=$_SESSION['registeredUser']; $productid=$_POST['productid']; $cost=$_POST['cost']; $choosenItem=array('productid'=>$productid,'amount'=>$amount,'cost'=>$cost); $cartObj->addItem($choosenItem); // array_push($_SESSION['Cart'],$choosenItem); } if(!isset($submit)) { var_dump($_SESSION['Cart']); $totalcost=0; foreach($_SESSION['Cart'] as $product) { foreach($product as $value) echo $value; @$_SESSION['totalcost']+=$product['cost']*$product['amount']; //ye araye darim be esm session ke chanta meghdar dare ke harmeghdaresh ye arayas //pas vaghti baravval mishkanim be araye miresim } echo 'totalCost is '.$_SESSION['totalcost']; echo '<a href=Order.php>For Set Order Click Here</a>'; //session_unset(); }
?>

نمیدونم از لحاظ برنامه نویسی کار درستیه یا نه؟

plague
دوشنبه 07 خرداد 1397, 01:42 صبح
متوجه نمیشم این کدی که گزاشتی چیه چون سشن بازم توی کنترلر به نظر میاد باشه
سشن رو بزار تو اولین اسکریپتی که لود میشه که ظاهرا تو سیستم شما ویو هستش ... یعنی وقتی آدرسی فراخانی میشه ویوی اون آدرس لود میشه و کنترلر ها توی اون ویو اینکلود شدن
در کل این روش کد نویسی اسپاگتی زیاد تعریفی نداره و بعدا تو رفع اشکال و نگهداری سیستم دردسر زیاد داری

یا همه ویو ها رو از یک فایل مثلا index.php لود کن یعنی در خواست به Index.php بره و اون تشخیص بده کدوم ویو باید لود بشه
یا اینکه اگه با همین ساختار فعلی میخای بری یه فایل مثلا config.php بساز و توی همه ویو هات اینکلود کن و سشن رو تو او نبزار اینجوری پسفردا اگه نیاز به تغییر بود یا کدی نیاز بود تو همه ویو ها باشه کافیه یجارو تغییر بدی نه همه ویو هات رو
سعی کن یه فریم ورک یاد بگیری که نخای کلی وقت بزاری رو ساختار کد ها
همچنین require_once رو اینجوری آدرس دهی نکن پس فردا بردیش رو سرور همه آدرس های ویندوزی خراب میشن

lordofphp
دوشنبه 07 خرداد 1397, 12:24 عصر
مرسی از توضیحت اما اونو فعلا بذاریم کنار میشه ببینی این کدی که برای ثبت نام و لوگین نوشتم (خارج بحث امنیت) از لحاظ اصول ام وی سی درسته یا نه ؟ ببخش زحمت میدم .
خب این فایل مدلمه :

148284

اینم فایل کنترلر:

148285
اینم دوتا فایل لوگین ثبت نام:
148286
148287
و اینکه منظورت از برنامه نویسی اسپاگتی چیه؟

plague
دوشنبه 07 خرداد 1397, 17:09 عصر
بد نیست روشت مثلا میخای ساختار mvc رو پیاده کنی ولی خب یه مشکلاتی اصولی داری
تو ساختار mvc اول کنترلر اجرا میشه و بعد کاست نترلر مدل ها رو فراخانی میکنه در صورت نیاز و در نهایت کنترلر ویو رو فراخانی میکنه و دیگه توی ویو هیچ کد منطق برنامه نویسی وجود نداره و فقط نمایش داده هستش

کد اسپاگتی یعنی همونی که بالا گفتم .... یعنی اینکه کد های منطق برنامه نویسی رو با کد های ویو قاطی نکنی و هرکدوم مجزا باشن که تو این روش کد نویسی شما چون اول ویو فراخانی میشه یه جورایی این اتفاق میفته

مشکل اصلی کدت به نظر من اینه که حجم کد هاست خیلی بالاست تکرار کد خیلی زیاده
مثلا
توی ویوی ثبت نام کلی کد نوشته که از $_REQUEST بخونه داده ها رو و بریزه توی متغیر
بعد کلی پارامتر فرستدی به کنترلر
کنترلر دوباره همشون رو پاس داده به مد
مدل دوباره همه پارامتر ها رو مثل ویو escape کرده

شما میتونیستی آرگومان ها رو به صورت آرایه بفرستی از ویو به مدل یعنی همون $_REQUEST رو بفرستی
و توی مدلت شما نیاز داری به یه تابع ولیدیشن که تک تک خونه های آرایه رو escape کنه و نتیجه رو برگردونه و این تابع رو برای همه مدل هات استفاده کنی بجای اینکه بخای توی هرتابع بشینی تک تک آرگومان ها رو escape کنی
و البته یه ولیدیشن واقعی هم نیاز داری که برای تک تک پارامتر های ارسالی به مدل قانون تعریف کنی مثلا فلان پرامتر باید عددی باشه یا فلان پارامتر باید ایمیل باشه

نمونش رو اینجا میتونی ببینی
https://github.com/rakit/validation

lordofphp
دوشنبه 07 خرداد 1397, 20:57 عصر
خب یه تغییراتی دادم حالا بببینن چطور شده:
یه فایل ایندکس نوشتم اطلاعات بش پست کردم
این فایل ایندکس
148289
اینم فایل مدل:
148290
اینم فایل کنترلر:
148291
148292
اینم فایلای ویوم لوگین و رجیستر
148293

148294
بنظرتون کار درستی کردم ک تو ایندکس با $_GET ادرسو گرفتم بعد متغیررا با ویو پست کردم به خود ادرس مثلا
index.php?address=login
درکل نوع آدرس دهی و تنظیم اینکه کنترلر و ویوو چطوری ارتباط بگیرن درسته بنظرتون؟

plague
سه شنبه 08 خرداد 1397, 01:34 صبح
بهتر شده
همه فریم ورک ها mvc آدرس رو با GET میفرستن و میگیرن یه چیزی شبیه به این

site.com/index.php?address=controller/function


ولی البته با htaccess آدرس ها رو جوری بازنویسی میکنن که به ای نشکل دیده بشه
site.com/controller/function

تو فریم ورک ها یک کلاس هست به اسم route.php که توی اون همه آدرس ها رو تعریف میکنی و مشخص میکنی که هر آدرس به کدوم کنترلر باید بره و کدوم متد یا تابع کنترلر رو باید اجرا کنه
بعد توی ویو یا توی Index.php با اون میخونی آدرس ها رو
مثلا


class Route{

public $address ;
public $name ;
public $controller ;
public $method ;
static $stack = [] ;

static function save($address , $controller_method , $name )
{
list($controller , $method ) = explode('@' , $controller_method);
$route= new Route();
$route->address = $address ;
$route->controller = $controller ;
$route->method = $method ;
$route->name = $name ;
self::$stack[] = $route ;
return $route ;
}

static function name($name){

foreach(self::$stack as $route )
if($route->name == $name)
return $route->address ;
}

static function address( $address ){

foreach(self::$stack as $route )
if($route->address == $address)
return $route ;
}


}

Route::save('/login' , 'UserController@login' , 'login_route');
Route::save('/register' , 'UserController@register' , 'register_route');


بعد توی ویوهات وقتی مخای آدرس بدی بجای اینکه خود آدرس رو بنویسی اینجوری با کلاس چاپشون میکنی

echo Route::name('login_route');


مزیتش اینه که پسفردا اگه آدرس هات تغییر کرد دیگه نمیخاد بری توی تک تک ویو هات تغییر بدی

توی index.php هم وقتی میخای ببینی این آدرسی که کاربر زده باید چه کنترلر و ویویی رو لود کنه
Route::address
رو اجرا میکنی و اون بهت یه شی رو برمیگردونه که حاوی نام کنترلر و متدشه
اگه همه فایل های ویوت از index.php لود میشن دیگه نیاز نداری توی ویو ها config.php رو اینکلود کنی تو ایندکس بزارش

lordofphp
پنج شنبه 10 خرداد 1397, 23:00 عصر
واقعا مرسی از کمکت ولی یه سوالی ک برام پیش اومده تو کنترلرا وقتی فرم میذاریم اکشن فرم چی بذاریم من اینطوری کردم
مثلا میخوام اطلاعات بره به کنترلر شو ال ارتیکل بعد تو شو آرتیکل با $_POST گرفتمشون کاردرستیه؟
action=index.php?address=showallarticle

plague
جمعه 11 خرداد 1397, 11:04 صبح
درسته مشکل نداره

charcharkh
جمعه 11 خرداد 1397, 18:08 عصر
پیشنهاد میدم که حتما یه فریمورک رو یاد بگیرید ci | yii2 | laravel