💻 آخرین فرصت یادگیری برنامه‌نویسی با آفر ویژه قبل از افزایش قیمت در ۵ آذر ماه (🎁 به همراه یک هدیه ارزشمند )
۰ ثانیه
۰ دقیقه
۰ ساعت
۲۹ Mehrzad Tajkarimi
جلوگیری از ارسال پارامتر با strtok !
جامعه پی اچ پی ایجاد شده در ۲۴ آذر ۱۴۰۰

سلام

وقتی از تابع استفاده کنیم دیگه پارامتر ? نخواهیم داشت

حالا مثلا برای pagination و جستجو ما مجبور هستیم از این ? پارامتر درواقع استفاده کنیم

برای همچین مواقعی ما توی روترمون چه راهکاری رو در نظر خوایم گرفت

سلام.

متوجه سؤال نشدم. بیشتر توضیح بدید و اگر اشاره به ویدیوی کلاس دارید، دقیقه اش رو مشخص کنید. ?

محسن موحد ۲۴ آذر ۱۴۰۰، ۱۷:۴۴

دقیقه ١ !

نمیدونم بیشتر چطور باید توضیح بدم

کجای سوالم متوجه نشدین !؟

Mehrzad Tajkarimi ۲۴ آذر ۱۴۰۰، ۱۷:۵۱

از دقیقه ۱ تا آخر چند بار ببینین به ج میرسی.

محسن موحد ۲۴ آذر ۱۴۰۰، ۱۸:۰۵

نرسیدم که سوال پرسیدم ...

بعنی میفرمایید از اول تا اخر این ویدیو چواب سوال من بوده !

چطور میشه استفاده کرد

domain.com/?page=1

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

Mehrzad Tajkarimi ۲۷ آذر ۱۴۰۰، ۰۵:۰۹

شما نیاز به ? ندارید.

با توجه به ساختار uri باید پارامتر مورد نظرتو مقدارشو بگیری.

مثلا اگر pagination براساس مقدار page شماره صفحه رو مشخص میکنه، از داخل پارامترها مقدارشو بخونید و بر اساس همین شماره هم میتونید صفحه رو لود کنید و هم url صفحات دیگه رو بسازید.

یک کلاس pagination قبلا نوشتم که این کلاسو توو هر ساختار و پروژه ای میشه استفاده کرد، فقط کافیه ساختار url رو بهش بدید، خودش page رو نمایش میده... میتونید ازین کدها ایده بگیرید:

<?php
/**
 * @author 		Mohsen Movahed @yahoo.com>
 * @copyright	2014 Mohsen Movahed
 * @date		19 May 2014 - 1393/2/28
 * @version		1.0
 * @license		GPL
 * @link        http://www.bithub.ir
 */
class Pagination
{
	private $items;
	private $output;
	/**
	 * construct method
	 */
	public function __construct($params = null)
	{
		$this->items = array(
				'items_per_page' => 5,         // Records per page to display
				'total_records' => 0,          // Total records in database
				'total_pages' => 0,            // Total number of pages
				'url_address' => '',           // For example: http://www.mysite.com/?page=
				'concat_to_url' => '',         // This comes after page value - [optional]
				'current_page' => 1,           // Number of current page
				'page_num_per_section' => 5,   // Total number of pages to display - for example CurrentPage=16 :=> [first][next]...,14,15,[16],17,18,...[prev][last]  
				'mode' => false,               // Mode = true or anything => Display::  1,...,14,15,[16],17,18,...,20
		);
		// set values
		if (isset($params) && count($params) > 0)
		{
			if (is_array($params))
			{
				foreach ($params as $key => $value)
				{
					if (!empty($value))
					{
						$this->$key = $value;
					}
				}
			}
		}
		// run paginate method
		$this->paginate();
	}
	/**
	 * get values
	 * @param  string $key Must be index of items array
	 * @return mixed|boolean if there is $key, returns array value otherwise returns false. 
	 */
	public function __get($key)
	{
		if (isset($this->items[$key]))
		{
			return $this->items[$key];
		}
		return false;
	}
	/**
	 * set values
	 * @param string $key Index of items array
	 * @param mixed $value a value for set
	 */
	public function __set($key, $value)
	{
		if (isset($this->items[$key]))
		{
			$this->items[$key] = $value;
		}
	}
	/**
	 * get total pages
	 * @return integer Return the total pages
	 */
	private function getTotalPages()
	{
		$this->items_per_page = ($this->items_per_page <= 0 ? 1 : $this->items_per_page);
		$total = ceil($this->total_records / $this->items_per_page);
		if ($total <= 0)
		{
			$total = abs($total) + 1;
		}
		return $total;
	}
	/**
	 * this manages to display pagination
	 */
	private function paginate()
	{
		$this->total_pages = $this->getTotalPages(); // set total pages
		$check = $this->checkItems(); // check item values and page number 
		if ($check)
		{
			// start of section
			$start = $this->current_page - floor($this->page_num_per_section / 2);
			// maximum start
			$max = $this->total_pages - floor($this->page_num_per_section / 2);
			if($start <= 0 || $start > $max)
			{
				if ($start > $max)
					$this->current_page = 1;
				$start = 1;
			}
			// end of section
			$end = $start + $this->page_num_per_section - 1;
			if($end > $this->total_pages)
			{
				$end = $this->total_pages;
			}
			$this->output .= '
  • '
. PHP_EOL; // print first page button if ($this->mode == false && $this->current_page != 1) { $this->output .= '$this->url_address . 1 . $this->concat_to_url .'">First' . PHP_EOL; } // print next page button if ($this->current_page < $this->total_pages && $this->mode == false) { $this->output .= '$this->url_address . $this->nextPage() . $this->concat_to_url .'">Next' . PHP_EOL; } // print page number for ($i = $start; $i <= $end ; $i++) { // print dots in right if ($i == $start && $start > 1 && $i != 1) { // print page one if ($this->mode) { $this->output .= '$this->url_address . 1 . $this->concat_to_url .'">1' . PHP_EOL; } $this->output .= '...' . PHP_EOL; } // print pages number $this->output .= '$i == $this->current_page ? 'current-page' : '') .'" href="'. $this->url_address . $i .'">'. $i .'' . PHP_EOL; // print dots in left if ($i <= $this->total_pages && $i == $end && $i != $this->total_pages) { $this->output .= '...' . PHP_EOL; } } // print prev page button if ($this->current_page > 1 && $this->mode == false) { $this->output .= '$this->url_address . $this->prevPage() . $this->concat_to_url .'">Previous' . PHP_EOL; } // print last page number if ($this->mode && $this->total_pages != $this->current_page && $this->total_pages != $end) { $this->output .= '$this->url_address . $this->total_pages . $this->concat_to_url .'">'. $this->total_pages .'' . PHP_EOL; } // print last page button if ($this->mode == false && $this->current_page != $this->total_pages) { $this->output .= '$this->url_address . $this->total_pages . $this->concat_to_url .'">Last' . PHP_EOL; } $this->output .= '
'
. PHP_EOL; } } /** * check item values * @return boolean The result true if item values is not empty, false otherwise */ private function checkItems() { foreach ($this->items as $key => $value) { if (empty($value)) { settype($key, 'string'); switch ($key) { case 'current_page': $this->$key = 1; // not required beacause by default equal to 1 break; case 'concat_to_url': break; case 'mode': break; default: return false; break; } } } if ($this->total_pages == 1) { return false; } $this->checkPageNumber(); return true; } /** * check page number */ private function checkPageNumber() { $this->current_page = intval($this->current_page); if ($this->current_page > $this->total_pages) { $this->current_page = $this->total_pages; } elseif ($this->current_page <= 0) { $abs = abs($this->current_page); $this->current_page = ($this->current_page < 0 ? $abs : $abs + 1); } } /** * previous page * @return integer */ private function prevPage() { return $this->current_page - 1; } /** * next page * @return integer */ private function nextPage() { return $this->current_page + 1; } /** * show part of the records => for example: 1 - 10 of 200 */ public function recordsInfo() { $var = $this->current_page * $this->items_per_page; $sectionEnd = $var; $sectionStart = $sectionEnd - $this->items_per_page + 1; $sectionEnd = ($var > $this->total_records ? $this->total_records : $var); echo 'Showing ' . $sectionStart . ' to ' . $sectionEnd . ' of ' . $this->total_records . ' entries'; } /** * show current page of all pages */ public function pagesInfo() { echo 'Page ' . $this->current_page . ' of ' . $this->total_pages; } /** * get query limit * @return array Return start and end section for query limit */ public function limit() { $start = $this->items_per_page * ($this->current_page - 1); $limit = $this->items_per_page; return array('start' => $start, 'limit' => $limit); } /** * show paging */ public function display() { echo $this->output; } } /* Default style :: .paging { margin: 65px auto; padding: 0; list-style: none; } .paging li { float: right; margin-right: 10px; } .paging li a { display: block; text-decoration: none; color: #717171; font-family: tahoma; font-size: 9pt; text-shadow: 0px 1px white; padding: 5px 8px; -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; -webkit-box-shadow: 0px 1px 3px 0px rgba(0,0,0,0.35); -moz-box-shadow: 0px 1px 3px 0px rgba(0,0,0,0.35); box-shadow: 0px 1px 3px 0px rgba(0,0,0,0.35); background-color: #e5e5e5; background: -webkit-linear-gradient(top, #e5e5e5 0%, #e8e8e8 100%); background: -moz-linear-gradient(top, #e5e5e5 0%, #e8e8e8 100%); background: -o-linear-gradient(top, #e5e5e5 0%, #e8e8e8 100%); background: -ms-linear-gradient(top, #e5e5e5 0%, #e8e8e8 100%); background: linear-gradient(top, #e5e5e5 0%, #e8e8e8 100%); filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#e5e5e5', endColorstr='#e8e8e8',GradientType=0 ); } .paging li a.current-page { color: white; text-shadow: 0px 1px #3f789f; -webkit-box-shadow: 0px 1px 2px 0px rgba(0,0,0,0.8); -moz-box-shadow: 0px 1px 2px 0px rgba(0,0,0,0.8); box-shadow: 0px 1px 2px 0px rgba(0,0,0,0.8); background: #7cb9e5; background: -webkit-linear-gradient(top, #7cb9e5 0%, #57a1d8 100%); background: -moz-linear-gradient(top, #7cb9e5 0%, #57a1d8 100%); background: -o-linear-gradient(top, #7cb9e5 0%, #57a1d8 100%); background: -ms-linear-gradient(top, #7cb9e5 0%, #57a1d8 100%); background: linear-gradient(top, #7cb9e5 0%, #57a1d8 100%); filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#7cb9e5', endColorstr='#57a1d8',GradientType=0 ); } .paging li a:hover { -webkit-box-shadow: 0px 1px 3px 0px rgba(0,0,0,0.55); -moz-box-shadow: 0px 1px 3px 0px rgba(0,0,0,0.55); box-shadow: 0px 1px 3px 0px rgba(0,0,0,0.55); background: #fff; background: -webkit-linear-gradient(top, #fff 0%, #e8e8e8 100%); background: -moz-linear-gradient(top, #fff 0%, #e8e8e8 100%); background: -o-linear-gradient(top, #fff 0%, #e8e8e8 100%); background: -ms-linear-gradient(top, #fff 0%, #e8e8e8 100%); background: linear-gradient(top, #fff 0%, #e8e8e8 100%); filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fff', endColorstr='#e8e8e8',GradientType=0 ); } .paging li a:active, .paging li a.current-page:active { -webkit-box-shadow: inset 0px 1px 3px 0px rgba(0,0,0,0.5), 0px 1px 1px 0px rgba(255,255,255,1) !important; -moz-box-shadow: inset 0px 1px 3px 0px rgba(0,0,0,0.5), 0px 1px 1px 0px rgba(255,255,255,1) !important; box-shadow: inset 0px 1px 3px 0px rgba(0,0,0,0.5), 0px 1px 1px 0px rgba(255,255,255,1) !important; } .paging li a.current-page:hover { -webkit-box-shadow: 0px 1px 2px 0px rgba(0,0,0,0.9); -moz-box-shadow: 0px 1px 2px 0px rgba(0,0,0,0.9); box-shadow: 0px 1px 2px 0px rgba(0,0,0,0.9); background: #99cefc; background: -webkit-linear-gradient(top, #99cefc 0%, #57a1d8 100%); background: -moz-linear-gradient(top, #99cefc 0%, #57a1d8 100%); background: -o-linear-gradient(top, #99cefc 0%, #57a1d8 100%); background: -ms-linear-gradient(top, #99cefc 0%, #57a1d8 100%); background: linear-gradient(top, #99cefc 0%, #57a1d8 100%); filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#99cefc', endColorstr='#57a1d8',GradientType=0 ); }  */ /* ************************* *         USAGE         * ************************* For Example: mysql_connect('localhost', 'root', ''); mysql_select_db('pagination'); mysql_query('set names \\'utf8\\''); $total = mysql_query('select count(*) as `total` from posts'); $result = mysql_fetch_assoc($total); *********************************************************************************** *       $paging = new Pagination(                                                 * *        array(                                                                * *        'items_per_page' => 5,   // Records per page to display           * *        'total_records' => $result['total'],                              * *        'url_address' => 'http://mysite.com/?page=',                      * *        'current_page' => (isset($_GET['page']) ? $_GET['page'] : 1),     * *        )                                                                 * *        );                                                                    * *********************************************************************************** $section = $paging->limit();   $start = $section['start']; $limit = $section['limit']; $result = mysql_query("select * from posts LIMIT $start, $limit"); while($row = mysql_fetch_assoc($result)) { echo '' . $row['title'] . ''; } $paging->display(); //------------------------// $paging->recordsInfo(); //------------------------// $paging->pagesInfo();  */

اما اگر بعد بررسی کدها هنوز هم مشکل در پیاده سازی داشتید، فایل پروژه تون رو بذارید تا فیکسش کنم.

محسن موحد ۲۷ آذر ۱۴۰۰، ۱۰:۲۴

باید مقدار به روتر فرستاده بشود درصورت که بخوام با ساختار الان پارامتر بفرستم

ممکنه چندین پارامتر ارسال بشه جهت جستجو تو این شرایط باید چی کار کرد.

من فکر میکنم درست توضیح ندادم با شما متوجه نشدین

شما دیجی کالا رو در نظر بگیر

زمانی چیزی رو جستجو میکنی مقدار ؟= به url ارسال میشه درسته ؟!

من با این ساختار نمیتونم مقدار بفرستم

وتا الان به داستان دیگر که متوجه شدم ما اسلاگ هم داریم اضافه میکنیم به آخرurlو فارسی هستش .

خود دیجی میره تو یه روت دیگه برای حستجو این رو

ولی من نمیدونم چیکار کنم گیج شدم واقعا

شما در نظر بگیر با این شرایط برای ساختار صفحه بندی هم نیازه مقدار بفرستی

Mehrzad Tajkarimi ۲۸ آذر ۱۴۰۰، ۰۷:۰۶

پست‌های قبلیم در مورد ارسال مقادیر مثل پیج و... در روتر هست. راه حل ساده اس.

قسمتی از کد و ساختارتونو بذارین تا بتونم کمک کنم.

فک میکنم دارید به uri خودتون ? اضافه میکنید. کدرو بزارید.

حتی در اسکریپت کلاسی که گذاشتم یه اتریبیوت بعنوان concat url میگیره. من گفتم هر ساختاری که تصور کنید رو جواب میده اون کلاس. ولی یه جای کارو دارید اشتباه تصور میکنید.

محسن موحد ۲۸ آذر ۱۴۰۰، ۰۷:۱۵

ساختار همون ساختار پروژست

<?php
namespace App\\Core\\Routing;
use App\\Core\\Middleware\\Auth;
use App\\Core\\Middleware\\GlobalMiddleware;
use App\\Core\\Request;
use App\\Core\\Routing\\Route;
class Router
{
    private $request;
    private $routes;
    private $route_current;
    const BASE_CONTROLLER = '\\App\\Controllers\\\\';
    public function __construct()
    {
        $this->request       = new Request;
        $this->routes        = route::routes();
        $this->route_current = $this->fine_route($this->request) ?? null;
        $this->run_middleware();
    }
    public function run()
    {
        if (is_null($this->route_current)) {
            $this->dispatch_404();
        }
        $this->dispatch($this->route_current);
    }
    private function fine_route(Request $request)
    {
        foreach ($this->routes as  $route) {
            if (!in_array($request->method(), $route['method'])) {
                continue;
            }
            if ($this->regex_matched($route)) {
                return $route;
            }
        }
        return null;
    }
    private function regex_matched($route)
    {
        global $request;
        // explode pattern '/^\\/post\\/(?[-%\\w]+)$/'
        $pattern = "/^" . str_replace(['/', '{', '}','?='], ['\\/', '(?<', '>[-%\\w]+)','/([^=]+)\\=([^&]+)/m'], $route['uri']) . "$/";
        // $get_pattern = "/^" . str_replace(['/', '{', '}'], ['\\/', '(?<', '>[-%\\w]+)'], $route['uri']) . "$/";
        $result = preg_match($pattern, $this->req
        آیا این پاسخ مشکل شما را حل کرد؟
        Mehrzad Tajkarimi ۲۸ آذر ۱۴۰۰، ۱۱:۰۵
        ساختار همون ساختار پروژست
        request       = new Request;
                $this->routes        = route::routes();
                $this->route_current = $this->fine_route($this->request) ?? null;
                $this->run_middleware();
            }
            public function run()uest->uri(), $matches);
        if (!$result) {
            return false;
        }
        // send key value use { global $request } from controller
        foreach ($matches as $key => $value) {
            if (!is_int($key)) {
                $request->set_param($key, $value);
            }
        }
        return true;
    }
    private function run_middleware()
    {
        $middles = $this->route_current['middleware'] ?? array();
        foreach ($middles as $middle_class) {
            $middle_object = new $middle_class;
            $middle_object->handle();
        }
        if ($this->request->segment(2) !== 'login') {
            $middle_object = new  Auth;
            $middle_object->handle();
        }
        $middle_object = new  GlobalMiddleware;
        $middle_object->handle();
    }
    private function dispatch_404()
    {
        header("HTTP/1.0 404 Not Found");
        view_flash_message('Error.404');
        die();
    }
    private function dispatch($route)
    {
        $action = $route['action'];
        if (is_null($action) || empty($action)) {
            return;
        }
        if (is_callable($action)) {
            $action();
        }
        if (is_string($action)) {
            $action = explode('@', $action);
        }
        if (is_array($action)) {
            $uri_separator = explode('/', $route['uri']);
            $routing = $uri_separator[1] == 'admin' ? 'Backend\\\\' : 'Frontend\\\\';
            $class_name  = self::BASE_CONTROLLER . $routing . $action[0];
            $method_name = $action[1];
            if (!class_exists($class_name)) {
                throw new \\Exception("class $class_name Not Exists");
            }
            if (!method_exists($class_name, $method_name)) {
                throw new \\Exception("method  $method_name not exist in class $class_name");
            }
            $controller = new $class_name();
            return $controller->{$method_name}();
        }
    }
}
Mehrzad Tajkarimi ۲۸ آذر ۱۴۰۰، ۰۷:۳۵

ساختار همون ساختار پروژست

<?php
namespace App\\Core\\Routing;
use App\\Core\\Middleware\\Auth;
use App\\Core\\Middleware\\GlobalMiddleware;
use App\\Core\\Request;
use App\\Core\\Routing\\Route;
class Router
{
    private $request;
    private $routes;
    private $route_current;
    const BASE_CONTROLLER = '\\App\\Controllers\\\\';
    public function __construct()
    {
        $this->request       = new Request;
        $this->routes        = route::routes();
        $this->route_current = $this->fine_route($this->request) ?? null;
        $this->run_middleware();
    }
    public function run()
    {
        if (is_null($this->route_current)) {
            $this->dispatch_404();
        }
        $this->dispatch($this->route_current);
    }
    private function fine_route(Request $request)
    {
        foreach ($this->routes as  $route) {
            if (!in_array($request->method(), $route['method'])) {
                continue;
            }
            if ($this->regex_matched($route)) {
                return $route;
            }
        }
        return null;
    }
    private function regex_matched($route)
    {
        global $request;
        // explode pattern '/^\\/post\\/(?[-%\\w]+)$/'
        $pattern = "/^" . str_replace(['/', '{', '}','?='], ['\\/', '(?<', '>[-%\\w]+)','/([^=]+)\\=([^&]+)/m'], $route['uri']) . "$/";
        // $get_pattern = "/^" . str_replace(['/', '{', '}'], ['\\/', '(?<', '>[-%\\w]+)'], $route['uri']) . "$/";
        $result = preg_match($pattern, $this->request->uri(), $matches);
        if (!$result) {
            return false;
        }
        // send key value use { global $request } from controller
        foreach ($matches as $key => $value) {
            if (!is_int($key)) {
                $request->set_param($key, $value);
            }
        }
        return true;
    }
    private function run_middleware()
    {
        $middles = $this->route_current['middleware'] ?? array();
        foreach ($middles as $middle_class) {
            $middle_object = new $middle_class;
            $middle_object->handle();
        }
        if ($this->request->segment(2) !== 'login') {
            $middle_object = new  Auth;
            $middle_object->handle();
        }
        $middle_object = new  GlobalMiddleware;
        $middle_object->handle();
    }
    private function dispatch_404()
    {
        header("HTTP/1.0 404 Not Found");
        view_flash_message('Error.404');
        die();
    }
    private function dispatch($route)
    {
        $action = $route['action'];
        if (is_null($action) || empty($action)) {
            return;
        }
        if (is_callable($action)) {
            $action();
        }
        if (is_string($action)) {
            $action = explode('@', $action);
        }
        if (is_array($action)) {
            $uri_separator = explode('/', $route['uri']);
            $routing = $uri_separator[1] == 'admin' ? 'Backend\\\\' : 'Frontend\\\\';
            $class_name  = self::BASE_CONTROLLER . $routing . $action[0];
            $method_name = $action[1];
            if (!class_exists($class_name)) {
                throw new \\Exception("class $class_name Not Exists");
            }
            if (!method_exists($class_name, $method_name)) {
                throw new \\Exception("method  $method_name not exist in class $class_name");
            }
            $controller = new $class_name();
            return $controller->{$method_name}();
        }
    }
}
Mehrzad Tajkarimi ۲۸ آذر ۱۴۰۰، ۰۷:۳۷

کد‌ها چرا اینطور ارسال میشه نصف نمیس

پیوست هم نمیشه زد

Mehrzad Tajkarimi ۲۸ آذر ۱۴۰۰، ۰۷:۳۸

تلگرام بفرستید.

محسن موحد ۲۸ آذر ۱۴۰۰، ۰۷:۴۷

مثلا میتونی این مدلی route بنویسی:

Route::get('/post/{slug}/page/{number}',function(){
    global $request;
    echo $request->get_route_param('number');
    echo $request->get_route_param('slug');
});

آدرس route بالایی به این شکل میشه:

http://php.local/post/salam-test-تست/page/3

یا به این شکل:

Route::get('/post/{slug}/{page}',function(){
    global $request;
    echo $request->get_route_param('page');
});

خلاصه اینکه ما به ؟ کاری نداریم.

چون داخل فایل .htaccess رو اگر نگاه بندازید تنظیم شده که تمامی route هایی که مینویسید بعنوان querystring پارامتر path قرار میگیره:

RewriteRule ^(.*)$ index.php?path=$1 [L,NC,QSA]

برای واضح‌تر شدن موضوع میتونی یه route به این شکل بنویسی:

Route::get('/id-{id}/{page}',function(){
    print_r($_GET);
});

هر فرمتی که مد نظرته میتونی route بنویسی.

محسن موحد ۲۸ آذر ۱۴۰۰، ۰۹:۴۰

آقای موحد عزیز

اگه چند تا پارامتر سرچ بخوام اینجا بفرستم باید به تعداد سرچ بیام اینجا پارامتر تعریف کنم

شدنی نیست این چیزی که شما داری میگی



Mehrzad Tajkarimi ۲۸ آذر ۱۴۰۰، ۱۰:۰۸

دست شما برای هر تغییری بازه.

مثلا یک فرم برای سرچ مینویسم:

Route::get('/search',function(){
    global $request;
    print_r($request->params());
    ?>
    
"/search" method="get">         "text" name="q">         "submit" name="btn" value="submit">         <?php });


محسن موحد ۲۸ آذر ۱۴۰۰، ۱۱:۲۴

تگها حذف شدن توسط خود ادیتور?

محسن موحد ۲۸ آذر ۱۴۰۰، ۱۱:۴۴

این روش شما هم صحیح نیست

تو این ساختار زمانی که شما مقادیر رو ارسال میکنید باید مقدارش رو داخل روتر مشخص کرده باشید

مشکل من هم همینه برادر ...!

من احتمال میدم به خاطر کانفبگ Nginx من باشه

البته شما هم به اشاره ای کردید اون بالا

من خیلی مسلط نیستم برای خوندن این کد ولی احتمال میدم این داستان مشکل ایجاد کرده

دکتر هم با اون کانفیگ احتمالا میتونستن پارامتر (؟) رو بفرستن برای همین لحاظ نکردن

server {
        listen 80;
        root /var/www/cms.me/Public;
        index index.php index.html index.htm index.nginx-debian.html;
        server_name cms.me;
        rewrite ^/(.*)/$ /$1 permanent;
        location ~* \\.(ico|css|js|gif|jpe?g|png)(\\?[0-9]+)?$ {
                expires max;
                log_not_found off;
        }
        location / {
                try_files $uri $uri/ /index.php;
        }
        location ~ \\.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/var/run/php/php8.0-fpm.sock;
        }
        location ~ /\\.ht {
                deny all;
        }
}
Mehrzad Tajkarimi ۲۸ آذر ۱۴۰۰، ۱۲:۱۹

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

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

تعجبم بعد این همه زمانیکه برای رفع ایراد گذاشتم تازه احتمالات یادتون اومد!! و وب سرورو میگید اپاچی نیست.

کل uri داره در ابتدا از طریق وب سرور هندل میشه... 

محسن موحد ۲۸ آذر ۱۴۰۰، ۱۳:۱۲

عزیزم بهت بر نخوره...

شما اگه ساختار پروژه که آقای اوند رو میدونستی ومرور میکردی این پیشنهاد‌ها رو نمیدادی

من مطمئنم شما اشتباه راهنمایی میدادی

اون فلا قد کد که میفرستید که بدرد من نمیخوره

من نمیخواستم بدونم سطح علمی شما چیه تو نت پره امسال کد شما ...

شما خواستی کدی که مشکل داره رو بفرست من همون قسمت مرتبط و فرستادم

یعنچی بعد از کاری که کردی من احتمالات به ذهنم رسید چه ربطی داره

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

شما اگه با این اطمینان میدونستین این داستان url و وب سرور رو بهتر نبود ابتدا این سوال رو میپرسیدین

مگه حتما همه باید از وب سرو شما استفاده کنند .

بعد اگر من این احتمال رو در نظر میگرفتم دیگه به کمک شما نیاز نداشتم سریع‌تر متوجه میشدم داستان چیه

بعد شما الان به عنوان منتور دوره وقتی متوجه شدید مشکل من از کجاست چرا چک نکردین و توضیح ندادین مشکل کانفییگ من حل بشه

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

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


Mehrzad Tajkarimi ۲۸ آذر ۱۴۰۰، ۱۵:۳۳

حق با شماست.

من سواد پاسخگویی به سوالات شمارو ندارم.

سوالتون رو مجدد تاپیک بزنید تا منتور‌های دیگه بررسی کنن. Php سه تا منتور داره.

منتور‌ها در سیستم سون لرن یک فعالیت دوستانه اس نه وظیفه که کسی بخواد از سر وا کنه...

موفق باشید.

محسن موحد ۲۸ آذر ۱۴۰۰، ۱۶:۵۵

سلام و احترام

وقتی میتونید key رو به عنوان مثال page و value رو که میشه شماره صفحه رو داشته باشید دیگه چه نیازی به ? دارید؟

اگه امکانش هست بیشتر توضیح بدید

امیر صالحی ۲۹ آذر ۱۴۰۰، ۱۹:۱۵

سلام آقای صالحی عزیز

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

الان این قابلیت وجود نداره تو این ساختار و این به نظرم یه ایراد هستش

حتی تو فریورک‌ها هم این امکان وجود داره

Mehrzad Tajkarimi ۲۹ آذر ۱۴۰۰، ۱۹:۲۲

سلام مهرزادجان

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

لطفا زمانی که سوال می‌پرسی این موارد رو در نظر بگیر که زودتر جواب بگیری:

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

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

ممنونم

لقمان آوند ۲۹ آذر ۱۴۰۰، ۱۹:۲۳

در مورد رپلای آخرت هم بگم که چرا حتما می‌خوای این پارامترهای فیلترینگ رو به صورت پارامترهای روت بفرستی.

چیزی که اکثر جاها عرف هست به صورت کوئری پارامتر میفرستی اینها رو و اونور می‌گیریشون.

لقمان آوند ۲۹ آذر ۱۴۰۰، ۱۹:۲۶

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

در خصوص سوال

به این چالش رسیدم چرا که کار فرما میگه زمان هست که مثلا جستجو یا فیلتر یا شماره صفحه بصورت لینک ارسال بشه

اونوقته که نیاز به url هستش..

Mehrzad Tajkarimi ۲۹ آذر ۱۴۰۰، ۱۹:۳۱

خوب لینکی که حاوی کوئری پارامتر هست رو هم می‌تونی داشته باشی و کارفرما ازش استفاده کنه.

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

/products/{filters}

و فیلتر‌ها رو اینطور کار کن:

/products/category:10,tag:mobile

ولی خوب نیاز به کارای استرینگی داری که کلید و مقدار‌ها رو بسازی و در بیاری مجدد.


لقمان آوند ۲۹ آذر ۱۴۰۰، ۱۹:۴۳

ممنون امیدوارم بودم راه منطقی و اصلاحی تو ساختار پروژه رو پیشنهاد میدادین

متاسفانه خیلی از این روش خوشم نیومد ...

چرا ما ساختار طوری طراحی نکردیم که مجبور نشیم اینشکلی پارامتر ارسال کنیم !!

Mehrzad Tajkarimi ۲۹ آذر ۱۴۰۰، ۱۹:۵۹

دو سه نکته مهم رو بگم مهرزاد

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

اگر در طول سرفصل این ویدیوها رو دیدی و به این توصیه‌ها عمل نکردی که طبیعتا مسیر رو اشتباه رفتی. اگر هم ویدیوها رو به صورت کامل ندیدی که حتما ببین و در اولین فرصت پروژه ای که از کارفررما گرفتی رو منتقل کن روی یه فریمورکی مثل لارول ...

لقمان آوند ۲۹ آذر ۱۴۰۰، ۲۰:۱۲

دکتر من متوجه هستم طلب هم ندارم که چرا چنین و چنان قبلش هم تشکر کردم بابت همه چیز ،

ویدیو‌ها وتوضیحات شما رو در این خصوص کاملا اشراف دارم حتی اول دوره حضوری هم شما تاکید رو این موضوع داشتید خاطرم هست من به خواسته خودم این کار رو انجام دادم،

در رابطه با این سوال هم صرفاً راهنمایی میخواستم کسی رو مسئول چیزی ندونستم شما بارها به این مسئله اشاره کرده بودین ،بنده توقعی هم ندارم تا همینجا هم متشکرم و کاملا رضایت دارم ،،

امیدوارم برداشت بد نکرده باشید ،

اگر عدم رضایتم رو از راهنمایی شما اعلام کردم بخاطر این بود که فکر میکردم شما انتقاد پذیرهستید و میتونم نظرم رو بگم یادمه گفته بودین از انتقاد بیشتر تمجید استقبال میکنید ،

نکته هایی که شما میفرمایید کاملا درسته در خصوص استفاده از فریم ورک ولی پروژه من یه فروشگاه سادست درصورتی که همونجایی که کار میکنم پروژه خیلی پیچیده‌تر رو با php فاگشنال نوشتن و خیلی هم از سرعتش راضی هستن فقط یه مشکل بزرگ داره اونم عدم توسعه پذیریه

ولی این cms به نظر من کمی از فریم ورک نداره برای کارهای ابتدایی ولی وقتی من دارم خودم توسعه میدم بده که نتونم یه مسأله به این سادگی رو حل کنم ،،

من هم با لاراول کار کردم هم با کدایگناتر ولی چیزی که تو لاراول اذیتم میکرد این وابستگی و ابزار بود که بدون اینکه نیاز باشه بدونی چه اتفاقی پشت صحنه افتاده ازش استفاده میکردم ،

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

میبخشید فکر میکنم اینجا جای این صحبت‌ها نبود عذرخواهی میکنم بابت اینکه از صورت سوال فاصله گرفتم ،،


Mehrzad Tajkarimi ۲۹ آذر ۱۴۰۰، ۲۱:۲۹

سلام مجدد

نه اصلا ناراحتی نداره. من صرفا این موارد رو بهت گفتم که تصمیم درست رو بگیری.

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

با توجه به اینکه دو سه ساله که می‌دونم داری کار می‌کنی بهتره از ابزارهایی که پایدارتر هستند، نگهداری بهتری دارند و سرعت توسعه ات رو افزایش میدن استفاده کنی.

اگر لاراول رو سنگین می‌دونی لومن استفاده کن، slim استفاده کن. کدایگنایتر یا ...

فردا تو از رو این پروژه رفتی دولوپر بعدی این فریمورک رو نمی‌شناسه و هزینه توسعه بالا میره ولی اگر فریمورک مطرحی باشه هزینه‌های توسعه و نگهداری رو پایین میاری ...

موفق باشی

بهترین پاسخ
لقمان آوند ۲۹ آذر ۱۴۰۰، ۲۱:۳۵