دوشنبه ۱۴ آذر ۱۴۰۱

Monday, December 5, 2022 GMT +3:30

توابع (Functions) در PHP

php-function

از جمله مباحثی که در اغلب زبان های برنامه نویسی به چشم می خورد مبحث توابع (Functions) است، برنامه نویسان همواره در پی یافتن سریعترین راه حل ها با کمترین کدنویسی و در عین حال رسیدن به مقصودشان به بهینه ترین شکل ممکن هستند و به همین خاطر است که به جای نوشتن چندین و چندباره دستورات، یک بار کدها را به صورت توابع تعریف کرده و بعد از آن در هر بار فراخوانی به تابع ورودی داده و خروجی مد نظرشان را دریافت می کنند، در واقع توابع نقش ماشین های تسهیل کننده را برای برنامه های مختلف بازی می کنند که به کمک آنها می توانیم یک سری از پردازش ها را چندین و چند بار داشته باشیم بدون اینکه بخواهیم برای هر پردازش کدها را جداگانه تعریف کنیم، با این مقدمه کوتاه می پردازیم به ادامه آموزش برنامه نویسی PHP با مبحث توابع (Functions).

تابع (Function) چیست و چه کاربردی دارد؟


در زبان های برنامه نویسی و از جمله در PHP توابع ماشین هایی با ساختار از قبل تعریف شده (بلاکی از کدها) هستند که معمولا با دریافت مقدار یا مقادیری به عنوان ورودی پردازش های مد نظر برنامه نویس را انجام داده و در نهایت حاصل این پردازش ها به عنوان خروجی در ادامه برنامه قابل استفاده است، به این دلیل به تابع "ماشین" می گوییم چون مانند یک دستگاه مواد خام را دریافت کرده و در نهایت محصول تولید می کند و به همین جهت روندهای تکراری با نوشتن یک تابع چندین و چند بار در برنامه قابل انجام است، همچنین به این دلیل گفتیم "معمولا با دریافت مقدار یا مقادیر ورودی" چون در دنیای برنامه نویسی توابع را بدون مقدار ورودی هم می توانیم استفاده کنیم و حتی برخی توابع هیچ مقدار ورودی یا خروجی ندارند و صرفا تغییراتی در متغیرها و آبجکت ها ایجاد می کنند که همه اینها بستگی به نیاز برنامه ما دارد.

انواع مختلف تابع در PHP


در یک تقسیم بندی کلی توابع در PHP به دو صورت زیر قابل تفکیک هستند:
- توابع درونی یا از پیش تعریف شده (Predefined یا Internal (built-in) functions).
- توابع سفارشی یا تعریف شده توسط کاربر (Custom یا User-defined functions).
منظور از توابع درونی مواردی هستند که به صورت ذاتی در مفسر PHP وجود دارند و به کمک آنها می توانیم بدون نوشتن کدهای اضافه با سرعت و سهولت بیشتری روند توسعه برنامه ها را پیش ببریم، به طور مثال تابع str_replace برای جایگزینی مقادیر رشته ای با هم، تابع is_numeric برای بررسی عدد بودن یک مقدار، تابع strtolower برای تبدیل حروف بزرگ انگلیسی به شکل حروف کوچک و موارد فراوانی از این دست که در مفسر PHP از قبل تعریف شده و به همراه هسته برنامه نصب می شوند.
علاوه بر توابع درونی این قابلیت در زبان PHP وجود دارد که تابع سفارشی و شخصی تعریف کنیم، توابع شخصی معمولا با هدف اجرای بلاکی از کدها به دفعات متعدد در قسمت های مختلف برنامه نوشته می شوند و با این کار روندهای مشابه با یک بار کدنویسی چندین و چند بار قابل تکرار هستند، برای نوشتن و استفاده از توابع سفارشی باید قواعد زبان PHP را رعایت کنیم.
در ادامه آموزش ابتدا توابع سفارشی را بررسی و سپس اشاره ای به توابع درونی PHP خواهیم کرد.

شیوه نگارش (Syntax) تعریف تابع در PHP


شیوه نگارش (Syntax) تعریف توابع در PHP شباهت زیادی به دیگر زبان پرکاربرد وب یعنی جاوا اسکریپت دارد، در PHP هم برای تعریف تابع از عبارت function با نمونه فرمت زیر استفاده می کنیم:
<?php
//تعریف تابع
function boldMyText($text){
    $result = '<strong>' . $text . '</strong>';
    return $result;
}
?>
توضیح:
- توابع در PHP با عبارت function و درج نام با شرایطی که در ادامه خواهیم گفت تعریف می شوند، در قسمت () آرگیومنت ها یا همان ورودی های تابع تنظیم می شود و قسمت {} بدنه اصلی و کدهایی که باید تابع اجرا کند را دربر می گیرد، در نهایت نیز معمولا حاصل فرآیند تابع با عبارت دستوری return برگردانده می شود.
- استفاده از آرگیومنت و return در توابع اختیاری است، به عبارتی می توانیم توابعی بدون ورودی یا خروجی داشته باشیم (به فرض تابع صرفا مقدار یک متغیر یا آبجکت را در روند برنامه تغییر دهد).

قواعد نامگذاری توابع در PHP


مانند هر زبان برنامه نویسی PHP نیز از قواعد خاصی برای نامگذاری توابع پیروی می کند، در PHP نام توابعی که تعریف می کنیم می تواند در چارچوب Regex زیر عبارتی دلخواه شامل حروف و اعداد انگلیسی، کاراکتر زیرخط یا Underline "_" یا کاراکترهای non-ASCII (کاراکترهای خارج از استاندارد ASCII) باشد:
^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$
اطلاعات بیشتر در خصوص استاندارد ASCII:
asciitable.com
شروع نامگذاری تابع حتما باید با حروف یا کاراکتر _ باشد، جالب است که با توجه به پشتیبانی از یونیکد UTF-8 (عبارت زیر در دستور باقاعده بالا کاراکترهای non-ASCII را شامل می شود:)
\x80-\xff
استفاده از نام و اعداد فارسی برای تابع در PHP ممکن است، در مجموع توصیه می کنیم برای سازگاری و خواناتر شدن کدها در نامگذاری عموما از کلمات با معنی به صورت تکی یا در ترکیب با سایر کلمات و اعداد انگلیسی استفاده کنیم، به طور مثال چند نام فرضی برای توابع:
clean, changeUser, getNewResult, textType1, textType2, getParam_1, getParam_2
انتخاب نام به صورت صرفا عددی (به فرض 01234) یا دارای کارکترهای خاص (به فرض ^ * #) مجاز نیست و در صورت استفاده خطای مشابه زیر را دریافت خواهیم کرد:
Parse error: syntax error, unexpected '1' (T_LNUMBER), expecting identifier (T_STRING) or '(' in ... .php on line 2

فراخوانی توابع در PHP


برای اینکه توابع در کدها اثرگذار باشند حتما باید آنها را فراخوانی (Call) کنیم، فراخوانی توابع در کدهای PHP معمولا به صورت استفاده مستقیم و بی واسطه است با این حال به فراخور نیاز برنامه ها شیوه های دیگری نیز برای فراخوانی توابع وجود دارد که در ادامه بررسی می کنیم.
- فراخوانی تابع به صورت مستقیم
در این شیوه بسته به هدف یا خروجی که تابع بر می گرداند (رشته، عدد، مقادیر بولین و...) می توانیم از تابع به صورت مستقیم استفاده کنیم، به طور مثال نمونه کد زیر خروجی تابع را که یک رشته متنی است با دستور echo چاپ می کند:
<?php
//تعریف تابع
function boldMyText($text){
    $result = '<strong>' . $text . '</strong>';
    return $result;
}
//متغیر
$text = "این متن را برجسته کن";
//فراخوانی تابع
echo boldMyText($text);
?>
با اجرای این نمونه کد در لوکال هاست یا سرور آنلاین مقادیر متغیر text به صورت برجسته شده با تگ strong در خروجی صفحه چاپ می شود.
مثال دیگر از به کار بردن مستقیم تابع در PHP:
<?php
function checkOddEven($number){
    if($number % 2 == 0){
        return true;  
    }

    return false;
}
if(checkOddEven(2)){
    echo 'عدد زوج است';
} else {
    echo 'عدد فرد است';
}
?>
این تابع زوج یا فرد بودن عدد دریافتی را بررسی و مقادیر true یا false را به عنوان نتیجه برمی گرداند.
- اختصاص تابع به متغیر و فراخوانی با واسطه
در این شیوه ابتدا تابع را به روال متداول تعریف می کنیم و سپس برای فراخوانی نام تابع را به متغیر نسبت داده و در ادامه ی کدها متغیر را با پارامترهای مد نظرمان فراخوانی می کنیم، مثال:
<?php
function myFuncName($arg_1, $arg_2){
    if(!is_numeric($arg_1) || !is_numeric($arg_2)){
        return false;
    }
    
    return $arg_1 + $arg_2;
}
$my_var = "myFuncName";
echo $my_var(2, 4);
?>
خروجی نمونه کد بالا عدد 6 خواهد بود.
- استفاده از تابع درونی call_user_func
شیوه دیگری که PHP برای فراخوانی توابع در اختیارمان قرار می دهد استفاده از متغیر و تابع درونی call_user_func است، به طور مثال:
<?php
function myFuncName($arg_1, $arg_2){
    if(!is_numeric($arg_1) || !is_numeric($arg_2)){
        return false;
    }
    
    return $arg_1 + $arg_2;
}
$var = call_user_func("myFuncName", 2, 4);
echo $var;
?>
خروجی نمونه کد بالا عدد 6 خواهد بود.
- استفاده از تابع eval (توصیه نمی شود)
این امکان در مفسر PHP وجود دارد که یک رشته را به صورت کدهای PHP پردازش و اجرا کنیم، برای این کار تابع درونی eval کاربرد دارد، مثال:
<?php
function myFuncName($arg_1, $arg_2){
    if(!is_numeric($arg_1) || !is_numeric($arg_2)){
        return false;
    }
    
    return $arg_1 + $arg_2;
}
$var = "echo myFuncName(2, 4);";
eval($var);
?>
خروجی نمونه کد بالا عدد 6 خواهد بود.
نکته: استفاده از تابع eval به لحاظ امنیت برنامه ممکن است با خطراتی همراه باشد و بخصوص اگر قرار است که ورودی از سمت کاربر در این تابع اجرا شود باید حتما قبلا رشته ارسالی کاملا اعتبارسنجی و ایمن سازی شود.

آرگیومنت (Argument) تابع


در برنامه نویسی با زبان PHP استفاده از توابع می تواند با و بدون ورودی باشد اما معمولا توابع را با یک یا چند ورودی (جدا شده با علامت کاما ",") تعریف و به این ورودی ها در اصطلاح آرگیومنت (Argument) می گوییم، در هنگام تعریف و فراخوانی تابع بسته به هدف و نوع پردازش های مد نظر آرگیومنت ها می توانند به یکی از صورت های زیر باشند:
- فراخوانی با مقدار (Call by Value)
این حالت شیوه پیش فرض استفاده از آرگیومنت برای توابع در PHP است، در این شیوه پارامتر یا پارامترهای مد نظر به صورت متغیر بین کاراکترهای () تعریف و در هنگام فراخوانی به صورت مستقیم یا به شکل متغیر مقداردهی می شوند، مثال:
<?php
function checkValueExist($value, $array){
    if(in_array($value, $array)){
        return true;
    }
    
    return false;
}

$array = Array('A', 'E', 'G');
$value = 'R';

if(checkValueExist($value, $array)){
    echo 'مقدار ' . $value . ' در آرایه وجود دارد';
} else{
    echo 'مقدار ' . $value . ' در آرایه وجود ندارد';
}
?>
در این نمونه کد تابع فرضی checkValueExist با دو آرگیومنت تعریف شده است که پارامتر اول (value) می تواند یک رشته متنی و پارامتر دوم (array) یک آرایه باشد (در خصوص آرایه ها در مباحث آینده مفصل خواهیم گفت)، تابع مقادیر ورودی را دریافت کرده و وجود پارامتر اول را در آرایه دریافتی بررسی و در نهایت با مقادیر true یا false نتیجه را برمی گرداند و بر این مبنا می توانیم در دستور شرطی if تصمیم بگیریم که کدام قسمت از کدها اجرا شوند.
- فراخوانی با ارجاع (Call by Reference)
در حالت معمول پردازش های صورت گرفته بر مقادیر ورودی در روند تابع روی متغیرهای بیرون از تابع تاثیری ندارند، به طور مثال متغیر فرضی a در نمونه کد زیر همیشه مقدار 5  را چاپ می کند:
<?php
function doIncrement($num){
    return $num++;
}
$a = 5;
doIncrement($a);
echo $a;
?>
اما با استفاده از کاراکتر & می توانیم این حالت را تغییر داده و اثر تابع را بر روی متغیر بیرون از آن داشته باشیم، مثال:
<?php
function doIncrement(&$num){
    return $num++;
}
$a = 5;
doIncrement($a);
echo $a;
?>
خروجی این نمونه کد عدد 6 خواهد بود.
به این شیوه تعریف آرگویمنت ها با استفاده از کاراکتر &، فراخوانی با ارجاع یا Call by Reference می گوییم.
- مقادیر پیش فرض آرگیومنت ها (Default argument values)
شکل دیگر استفاده از آرگیومنت ها برای توابع تعریف آنها با مقادیر پیش فرض است، به این صورت اگر تابع را بدون آرگیومنت فراخوانی کنیم مقادیر پیش فرض جایگزین آرگیومنت می شود، مثال:
<?php
function sayWelcome($user = "Admin"){
    echo "Hi " . $user . ", Welcome to Control Panel!<br>";
}
sayWelcome();
sayWelcome("Manager");
?>
در صورت اجرای نمونه کد بالا در لوکال یا سرور خروجی زیر چاپ خواهد شد:
Hi Admin, Welcome to Control Panel!
Hi Manager, Welcome to Control Panel!
گفتیم توابع را بدون return هم می توانیم استفاده کنیم.
- لیست آرگیومنت ها با طول متغیر (Variable-length argument list)
شیوه جالب دیگر استفاده از آرگیومنت برای توابع که در PHP نسخه 5.6 و مابعد اضافه شده استفاده از عملگر سه نقطه (Splat یا Three dots Operator) و تنظیم ورودی به صورت لیست با طول متغیر است، در این شیوه تعداد آرگیومنت ها از قبل مشخص نیست و بسته به نیاز می تواند میزانی متغیر باشد، به طور مثال (کد صرفا در PHP نسخه 5.6 و مابعد قابل اجرا است):
<?php
function addNumbers(...$number){
    $result = 0;
    
    foreach($number as $key => $value){
        $result += $value;       
    }
    
    return $result;
}

echo addNumbers(1, 5, 6);
?>
خروجی نمونه کد بالا عدد 12 خواهد بود.
همان طور که مشخص است در این شیوه آرگیومنت به همراه کاراکتر سه نقطه تعریف شده و در تابع به شکل آرایه در حلقه foreach از آن استفاده کرده ایم، این شکل از استفاده از سه نقطه جهت دستیابی به مقادیر آرگیومنت را در اصطلح برنامه نویسی شیوه دسترسی به آرگیومنت های متغیر (Accessing Variable Arguments Method) می گوییم.
از سه نقطه در هنگام فراخوانی تابع هم می توانیم برای استخراج (Unpack) آرایه (یا متغیرهای Traversable یا Literal) و اختصاص به مقادیر آرگیومنت ها استفاده کنیم، البته در این حالت باید تعداد پارامترهای تابع مشخص باشد، مثال (کد صرفا در PHP نسخه 5.6 و مابعد قابل اجرا است):
<?php
function addNumbers($a, $b, $c){
    $result = $a + $b + $c;
    
    return $result;
}
$var = [1, 5, 6];
echo addNumbers(...$var);
?>
خروجی این نمونه کد هم مقادیر 12 خواهد بود.
به این شکل استفاده از سه نقطه جهت اختصاص مقادیر آرگیومنت ها را در اصطلاح برنامه نویسی شیوه مقداردهی به آرگیومنت های متغیر (Providing Variable Arguments Method) می گوییم.
نکته: مفاهیم Traversable یا Literal اصطلاحات تخصصی برنامه نویسی هستند که آموزش آنها در مرحله مقدماتی مورد نیاز نیست و در عمل هم شاید صرف این مفاهیم به خودی خود خیلی کاربردی نباشند، در همین حد بدانیم که یکی از کاربردهای کاراکتر سه نقطه می تواند با این نوع متغیرها باشد کافی است.
آخرین شکل استفاده از لیست آرگیومنت ها با طول متغیر شیوه استفاده با اشاره به نوع ورودی (Type hinted Variable Arguments Method) است، در این شیوه نام یک کلاس با فاصله قبل از کاراکتر ... قرار می گیرد و در این صورت ورودی ها الزاما باید نمونه (Instance) ای از آن کلاس باشند و در نهایت می توانیم به آبجکت های public آن کلاس در تابع دسترسی داشته باشیم، مثال:
<?php
class MyClass{
    private $var_1 = 5;
    private $var_2 = 8;
    public $myInt;
    
    function __construct($type){
        switch($type){
            case 'a':
                $this->myInt = $this->var_1;
            break;
            case 'b':
                $this->myInt = $this->var_2;
            break;
        }
    }
}

function addNumbers(MyClass ...$number){
    $result = 0;
    
    foreach($number as $key => $value){
        $result += $value->myInt;
    }
    
    return $result;
}

$a = new MyClass('a');
$b = new MyClass('b');

echo addNumbers($a, $b);
?>
خروجی مثال بالا عدد 13 خواهد بود، همان طور که مشخص است آرگیومنت های تابع از فراخوانی کلاس MyClass با دو پارامتر a و b مقداردهی و در تابع از آبجکت myInt مقادیر دریافت شده اند.
نکته: این شکل استفاده از آرگیومنت های توابع برای برنامه نویسی معمول کاربرد آنچنانی ندارد اما در برنامه نویسی پیشرفته و شی گراء ممکن است کاربردی باشد که جهت آشنایی بیشتر توضیح داده شد.

توابع درونی (Predefined یا Internal (built-in)) در PHP


در اغلب زبان های برنامه نویسی متدها و توابعی به صورت از قبل تعریف شده و آماده وجود دارد که به کمک آنها می توانیم روندهای معمول آن زبان را با سرعت و سهولت بیشتری انجام دهیم، PHP نیز از این قاعده مستثنی نیست و در هسته مفسر آن توابع درونی (Predefined یا Internal (built-in)) به تعداد خیلی زیادی جهت سرعت بخشیدن به روند کار کدنویسی از قبل تعریف شده و توسط برنامه نویسان قابل استفاده است، در لیست زیر سایت مرجع php.net این توابع و متدها را به ترتیب حروف الفبا به همراه توضیحاتی درج کرده است که مرور آنها جهت آشنایی کلی و مراجعات بعدی خالی از لطف نیست:
https://www.php.net/manual/en/indexes.functions.php
برای آشنایی بیشتر در ادامه برخی توابع درونی پرکاربرد زبان PHP را به همراه نمونه کد بررسی می کنیم.
- تابع strlen و mb_strlen
برای به دست آوردن طول رشته (تعداد کاراکتر) از تابع strlen استفاده می کنیم، حالت multi-byte این تابع برای کار با متون یونیکد مانند زبان فارسی (UTF-8) می تواند کاربرد داشته باشد، مثال:
<?php
$str = "text";
echo strlen($str);
?>
خروجی مثال بالا عدد 4 خواهد بود.
<?php
mb_internal_encoding("UTF-8");
$str = "متن";
echo mb_strlen($str);
?>
خروجی مثال بالا عدد 3 خواهد بود.
- تابع str_replace
برای جایگزینی یک مقدار رشته ای با مقادیر دیگر از تابع str_replace استفاده می کنیم، مثال:
<?php
$str = "PHP is so difficult to learn!";
echo str_replace('difficult', 'easy', $str);
?>
خروجی نمونه کد بالا به صورت زیر خواهد بود:
PHP is so easy to learn!
- تابع trim
برای حذف فضای خالی از ابتدا و انتهای رشته از تابع trim استفاده می کنیم، مثال:
<?php
$str = " PHP ";
echo strlen($str);
$str = trim($str);
echo '<br>';
echo strlen($str);
?>
خروجی مثال بالا به صورت زیر خواهد بود:
5
3
- تابع ceil
برای گرد کردن به بالای اعداد اعشاری به نزدیکترین عدد صحیح از تابع ceil استفاده می کنیم، مثال:
<?php
$num = 3.2;
echo ceil($num);
?>
خروجی مثال بالا عدد 4 خواهد بود.
floor و round دو تابع دیگر مشابه با عملکرد متفاوت در این زمینه هستند.
- تابع count
برای شمارش عناصر آرایه یا آبجکت می توانیم از تابع count استفاده کنیم، مثال:
<?php
$array = Array("a", "b");
$count = count($array);
if($count < 2){
    echo "Error!";
} else {
    echo "Ok! count array is: " . $count;
}
?>
خروجی نمونه کد بالا به صورت زیر خواهد بود:
Ok! count array is: 2
تعداد توابع درونی PHP بسیار زیاد است و در اینجا صرفا جهت نمونه و آشنایی بیشتر چند مثال ذکر شد، اما آیا باید همه این توابع را به حافظه بسپاریم؟!
جواب قطعا خیر خواهد بود، هیچ نیازی نیست لیست توابع را حفظ کنیم و چنین کاری عملا هم حداقل به راحتی ممکن نیست، کافی است در هر برنامه ای که می خواهیم بنویسیم توابع مرتبط با فرآیندهای آن برنامه را از طریق جستجو یا مراجعه به نمونه کدها و منابع مرجع پیدا، با کارکردشان آشنا شده و در نهایت در کدهایمان از آنها استفاده کنیم، البته برخی توابع PHP پرکاربرد و متداول هستند که به مرور و به صورت خودکار در ذهنمان حفظ می شوند.
دسته بندی: آموزش مقدماتی » PHP
related مطالب بیشتر:
توابع کار با آرایه در PHP - بخش اول
عملگرها (Operators) در PHP
توابع کار با آرایه در PHP - بخش سوم
حلقه for، foreach و while در PHP
دستورات شرطی (Conditional Statements) در PHP
دیدگاه
more ۷۳ دیدگاه برای این مطلب ارسال شده است.
more دیدگاه جدید بر اساس تاریخ ارسال در انتهای دیدگاه های موجود نمایش داده می شود.
امیرحسین
۱۷:۱۸ ۱۳۹۹/۱۱/۰۲
چرا استاد خیلی فرق داره الان کد زیر را شما در نظر بگیرید
<?php
$x = range(1,99999999);
$total = count($x);

$time = time();
while(list($key,$value) = each($x)){

}
echo time() - $time;
?>
زمان اجرای این کد در لوکال برای من 9 ثانیه طول میکشه و خطای رم نمیده اما اگر برای شما خطا رم داد حلقه را کمتر کنید
ولی کد زیر
<?php
$x = range(1,99999999);

$time = time();
foreach($x as $value){

}
echo time() - $time;
?>
و کد زیر
<?php
$x = range(1,99999999);
$total = count($x);

$time = time();
for($i = 0; $i <= $total; $i++){

}
echo time() - $time;
?>
بین 0 تا 1 ثانیه طول میکشه اجرا شدنش خب شما کدومو پیشنهاد میکنید روش دوم که سرعت بیشتری داره ، رم بیشتری اشغال میکنه ولی سرعت بیشتری داره اما روش قبلی رم کمتری اشغال میکنه و سرعت کمتری داره
بله حق با شما است در تعداد دور خیلی بالا تفاوت دیده می شود (با hrtime یا microtime دقیقتر مشخص است) اما ساختار برنامه نباید طوری نوشته شود که به این حد از پردازش در حلقه نیاز باشد و این گام اولیه و اصلی در بهینه بودن کدها است در تعداد دور معقول این تفاوت ناچیز است، در مجموع باز هم foreach ارجحیت دارد و بین زمان پردازش و میزان فضای رم مدت زمان اهمیت بیشتری دارد، در روش while شاید چون چند دستور دیگر از جمله list درگیر است و مورد به مورد اعضای آرایه جداگانه پردازش می شوند زمان بیشتری طول می کشد.
احمد
۲۱:۴۳ ۱۳۹۹/۱۱/۰۸
با عرض سلام و خسته نباشید ببخشید قبلا یه هاست داشتم اطلاعات سایتم رو از دیتابیس میخوند بعدا پشتیبان هاستم بهم گفتن یکی از هاستها تاریخ انقضاش گذشته و بخاطر اینکه شما دیتابیس رو روی این هاست نصب کردی دیگه اطلاعات رو نمیخونه بعدا مجبور شدم یه دیتابیس جدید روی هاست جدیدم درست کنم ولی هر کار میکنم اطلاعات رو از دیتابیس نمیخونه دلیلش نمیدونم چی هست حتی فایل کانفیگ هم چک کردم تمام اطلاعات درست هست پشتیبان هاستم میگن که مشکلی از سمت هاست نیست نمیدونم کجا مشکل دارم چرا اطلاعات رو نمیخونه از دیتابیس؟ ممنون از زحمات شما تشکر
قاعدتا بدون خطایابی نمی توانیم نظر قطعی ارائه کنیم، ممکن است تنظیمات سرور برای اتصال از طریق شبکه وب یا آدرس IP اتصال به سرور ایرادی داشته باشد یا User درج شده در قسمت کانفیگ مجوزهای کافی برای کار با دیتابیس را نداشته باشد، برای اطمینان باید در پنل مدیریت هاست کاربر را به دیتابیس متصل کرده و مجوزهای لازم اعطا شده باشند، در صورتی که تمام این موارد درست باشند نیاز به خطایابی آنلاین با برنامه TeamViewerخواهد بود.
احمد
۱۴:۵۵ ۱۳۹۹/۱۱/۰۹
با عرض سلام مجدد ببخشید واسه همین مشکل هاستم الان یه موردی را که بررسی کردم عجیب هست وقتی فایل کانفیگم رو اینکلود میکنم بالای صفحه فایلم ، کلا دیگه اطلاعات سایتم بالا نمیان و صفحه سفید نشون داده میشه ولی وقتی دستور اینکلود رو بر میدارم اطلاعات سایت دوباره بالا میاد بی زحمت این مشکل میتونه از چی باشه البته روی لوکال این مشکل نیست روی هاست این مشکل هست ممنون با تشکر
خطایابی را در سایتتان فعال کنید احتمالا خطای (Warning (Fatal در کدها وجود دارد، ممکن است ایراد از Syntax باشد (با برنامه PhpStorm بررسی کنید) یا اینکه به فرض کاراکترهای BOM در فایل وجود داشته باشد (با ++Notepad بررسی کنید) و مواردی از این دست، در هر صورت آدرس سایت را درج نکرده اید و بدون تست نمی توان نظر قطعی داد.
امیرحسین
۲۱:۳۵ ۱۳۹۹/۱۱/۱۸
سلام استاد وقت بخیر
تابع mb_strlen در بعضی هاست ها پشتیبانی نمیشه و من یک کلکی بهش زدم و از تابع زیر استفاده میکنم
function myStrLen($text){
$text = preg_replace('/./u', '1', $text);
$text = strlen($text);
return $text;
}
کل متن رو تبدیل به 1 میکنم هر کاراکترشو بعد با strlen میشمارم
نظرتون چیه ؟
به نظر نمی رسذ کد شما مشکل خاصی داشته باشد، البته باید با رشته های مختلف تست و بررسی کافی کنید، تابع زیر هم روش دیگری است:
<?php
function myStrLen($str){
preg_match_all('/./u', $str, $array);
return count($array[0]);
}
$var = 'سلام';
echo myStrLen($var);
?>
شیدا
۱۴:۲۲ ۱۳۹۹/۱۲/۰۴
با سلام خدمت شما منم یک سوالی داشتم خواستم بدونم این دستورات در php.ini به چه دردی میخورن
ini_set('session.use_only_cookies', 1);
ini_set('session.use_trans_sid', 0);
ini_set('session.cookie_httponly', 1);
ini_set('session.name', 'myPhpSessId');
session_start();
session_regenerate_id();
اولین دستور
session.use_only_cookies
دومین دستور
session.use_trans_sid
این دوتا در اولویت هستن ، اگه بقیه رو هم فرصت داشتید توضیح بدید ممنون
نشست (Session) در PHP مبتنی بر دو قسمت سرور و مرورگر است:
در سرور سشن آی دی با نام پیش فرض PHPSESSID (قابل تغییر با session.name) ایجاد و در یک فایل ذخیره می شود و تا حدود 24 دقیقه معتبر است، همچنین کوکی با این نام در مرورگر با مقادیر آن سشن آی دی ایجاد می شود، با هر بار درخواست کاربر از سرور کوکی ارسال شده و در سرور اعتبار آن یررسی و به روز می شود، در صورتی که پارامتر session.use_only_cookies برابر 1 باشد ارسال مقدار کوکی صرفا از همین طریق ممکن است اما در صورت غیرفعال بودن این پارامتر مقدار کوکی را می توانیم با متدهای دیگر مانند GET، POST و همچنین آدرس URL با سرور رد و بدل کنیم، session.use_trans_sid (مخفف Transparent Session ID) هم برای فعال یا غیرفعال بودن امکان ارسال مقدار کوکی در آدرس URL به صورت قابل روئیت است، به فرض:
http://example.com/index.php?PHPSESSID=vre24qy3ctlb3o2uxg7ir14ri9
پارامتر session.cookie_httponly هم به معنی امکان ارسال کوکی صرفا از درخواست های پروتکل HTTP (یا HTTPS با پارامتر session.cookie_secure) است و سایر پلتفرم ها مانند دسترسی از JavaScript ممکن نیست، در کل این تنظیمات برای امنیت بیشتر نشست ها استفاده می شوند.
اطلاعات بیشتر:
https://www.php.net/manual/en/session.security.ini.php
mahdi
۱۷:۲۷ ۱۴۰۰/۰۲/۱۵
سلام استاد عزیز ، میگن سایت هایی که فانکشنال هستن آدرس هاش بصورت index.php با پسوند هست ؟ کلا در برنامه نویسی فانکشنال سیستم روتینگ نداریم که مثل mvc صفحات رو بدون پسوند فایل در آدرسبار نمایش بدیم ؟
خیلی ممنون استاد عزیز و بزرگوار
معماری MVC یک سبک طراحی ساختار برنامه های وب است و Functional یک سبک کدنویسی (که می توانیم توابع را خارج از کلاس ها مستقیم تعریف و استفاده کنیم) و به نظر عموما در مقابل OOP یا همان برنامه نویسی شی گرا باید قرار گیرد، الزامی وجود ندارد که سیستم Routing در حالت فانکشنال وجود نداشته باشد و به سلیقه یا نیاز برنامه نویس می توانیم چنین سیستمی به فرض مبتنی بر GET، switch و include داشته باشیم منتها قاعدتا دقیقا مشابه MVC نیست و روال خودش را دارد، برای مخفی کردن پارامترها ممکن است در هر دو روش استفاده از دوباره نویسی آدرس ها (URL Rewrite) مورد نیاز باشد که احتمالا منظور سوالتان این قسمت نیست.
فرهاد وطن خواه
۰۸:۱۶ ۱۴۰۱/۰۱/۰۱
با سلام و خسته نباشید
سال نو شما مبارک
ببخشید یه سوال داشتم من مثلا یه مطلبی رو از یه سایت کپی کردم که استایل قالب رو برمیداره و متن رو با استایلش کپی می کنه تگ ها بجز یکی برام مهم نیست تگ هرچی باشه اشکالی نداره ولی وقتی تگ div اضافی درمیان همه قالب منم بهم می ریزن به ازای هر div یه دونه /div وجود دارد ولی اگه این تناسب بهم بخوره و /div بیشتر باشه استایل قالب منم بهم می ریزه می خوام یه طوری باشه که اگه توی متنی که کپی می کنم /div اضافی بود پاک بشه اگه 4 تا div بودن واسه بستن تگ هم باید 4 تا /div باشن
با تشکر از شما
ضمن تبریک سال جدید، برای حذف تگ های غیراستاندارد از خروجی کدها می توانید از نمونه دستورات زیر استفاده کنید:
<?php
$html = '<div>نمونه متن</div> </div> نمونه متن <div>نمونه متن</div>';

function HTMLTidy($html){
libxml_use_internal_errors(true);

$dd = new DOMDocument();
$dd->loadHTML('<?xml encoding="utf-8" ?>' . $html);
$dd->formatOutput = true;
$result = preg_replace('~<(?:!DOCTYPE|/?(?:html|body|head))[^>]*>\s*~i', '', $dd->saveHTML());
$result = str_replace('<?xml encoding="utf-8" ?>', '', $result);

//return
return html_entity_decode($result);
}

echo HTMLTidy($html);
?>
فرهاد وطن خواه
۱۶:۵۸ ۱۴۰۱/۰۱/۰۱
استاد گرامی خیلی عالی بود
فقط واسه متن فارسی کار نمی کنه واسه utf-8 کار نکرد!
تابع ارائه شده در پاسخ قبلی اصلاح و برای حروف فارسی سازگار شد.
فرهاد وطن خواه
۰۵:۲۵ ۱۴۰۱/۰۱/۰۲
با تشکر از شما استاد بزرگوارم
خیلی عالی بود و به درستی کار کرد ببخشید شرمنده یه مشکل دیگه هم دارم که خیلی وقته درگیرش هستم من برای مطالب مجاز می خوام از این تابع استفاده کنم که وقتی عنوانی رو قرار میدم طبق این تابع بررسی کنه و از عناوین نامربوط جلوگیری کنه
<?php
$text = "
اخبار جهان
اخبار ایران
اخبار حوادث
خبر علمی
";

static public function Allow($content='')
{
$str = explode("\n",$text);
$str = array_unique($str);
foreach($str as $k=>$v)
{
$v = trim($v);
if(empty($v))
unset($str[$k]);
}
foreach($str as $check)
{
if(mb_strpos($content, $check))
return false;
}
return true;
}
?>
و برای فراخوانی و اعتبار سنجی
$news = "این یک خبر تست و در اخبار جهان است";
if( ! empty($text) and $this->checkAllow($news))
echo "خبر درست است"
else
echo "خبر درست نیست"
ولی نمی دونم چرا کار نمی کنه در حالیکه قاعدتا باید کار کنه و فقط مطالبی اعتبار سنجی بشن که توی $text موجود هستند؟ اصلا نمی دونم مشکل تابع از کجاست بسیار ممنون می شم راهنمایی کنید واسه جواب قبلی هم ازتون بی نهایت ممنون و سپاسگزارم
با تشکر
تابع شما در چندین بخش دچار اشکال است و باید به شکل نمونه زیر باشد:
<?php
$text = "اخبار جهان
اخبار ایران
اخبار حوادث
خبر علمی";

function checkAllow($text, $content = ''){
$array = explode("\n", $text);
$array = array_unique($array);

foreach($array as $k => $v) {
$v = trim($v);
if(empty($v)){
unset($array[$k]);
} else {
$array[] = $v;
}
}

foreach($array as $check) {
$mb_check = mb_strpos($content, $check);

if($mb_check !== false && $mb_check >= 0){
return true;
}
}

return false;
}

$news = "این یک خبر تست و در اخبار جهان است";
if(!empty($text) && checkAllow($text, $news)) {
echo "خبر درست است";
} else {
echo "خبر درست نیست";
}
?>
همچنین نحوه استفاده از متد استاتیک در کدهایتان اشتباه است، شیوه فراخوانی صحیح متدهای ثابت:
<?php
class ClassName {
public static function functionName(){
return 1;
}
}
echo ClassName::functionName();
?>
فرهاد وطن خواه
۱۶:۰۰ ۱۴۰۱/۰۱/۰۲
با سلام و خسته نباشید
نمی دونم چطوری ازتون تشکر کنم بخدا بی نهایت منو شرمنده خوبی های خودتون کردید مدتها بود درگیر این کدها بودم و هر کاری می کردم درست از آب در نمی اومد خدا بهتون سلامتی و ثروت و خوشبختی عنایت کنه خیلی منو شرمنده کردید آدم مثل شما بزرگ ندیده بودم بدون هیچ منتی مشکلات منو حل کردید از سایتم درآمد ندارم و هرچی هم که براش کدنویسی می کنم واسه اینکه به اینکار علاقه دارم اگه از سایتم درآمد داشتم و وضع مالیم خوب بود هرچیزی می خواستید بهتون میدادم شرمنده دست و بالم تنگه وگرنه کوتاهی نمی کردم خیلی شرمنده ام کردید بخدا شرمنده از اینکه چیزی ندارم جوابگوی محبت های شما باشم من شبا نمی خوابیدم و درگیر مشکلات کدهایی سایت بودم چقدر خوب شد با سایت شما آشنا شدم از صمیم قلبم براتون هم در دنیا و هم در آخرت بهترین ها رو آرزو می کنم خدا به خودتان و تموم عزیزانتون سلامتی و دل خوش بده و خوشبختی
آلهی آمین
شما هم با من الهی آمین بگین
بخدا دنیا دنیا منو شرمنده خودتون کردید
خیلی ممنون از نظر لطف و محبت شما، ما هم خوشحالیم که مشکلتان رفع شد، برای مواردی که در چارچوب خدمات متداول سایت باشند نیازی به پرداخت هیچ گونه مبلغی نیست.
با آرزوی بهترین ها
میثم
۱۶:۱۸ ۱۴۰۱/۰۱/۰۴
سلام و عرض احترام.
من دو تا سوال داشتم.
1- کد اسکرول به بالا و پایین صفحه مثل سایت شما چطوری نوشته شده ؟ چون به محض اسکرول به پایین فلش پایین میاد و به محض اسکرول به بالا فلش بالا میاد و این از نظر اینترفیس خیلی جالبه.
2- فرض کنیم توی SQL یه جدول مثل این داریم.
علی 12 - 10 - 8
حسین 12 - 11 - 10
محمد 10 - 5 - 1
علی 16 - 10 - 6
حالا من قصد دارم که نمرات ستون ها بر اساس اسم با هم جمع بشن و بشه شبیه این
علی 28 - 20 - 14
محمد 10 - 5 - 1
علی 16 - 10 - 6
دستور SQL این میشه چی؟ برای هر ستون باید یه SUM جداگانه بنویسم؟ میشه 3 تا فراخوانی؟
در مورد سوال اول و ایجاد اسکرول به بالا و پائین بر اساس رفتار کاربر مبنای کد به این صورت است که موقعیت اولیه اسکرول بار در متغیر جاوا اسکریپتی نگهداری می شود، به فرض:
var scroll_pos = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;
و با هر اسکرول در رویداد window.onscroll موقعیت فعلی را با موقعیت اولیه مقایسه می کنیم، اگر عدد بزرگتری به دست آمد یعنی کاربر به پائین اسکرول می کند و برعکس، بر همین اساس محاسبات و تغییراتی در دکمه اسکرول اتفاق می افتد که خود یک پروژه کوچک برنامه نویسی است و توضیح کوتاهی ندارد.
در مورد پرس و جو و نمونه خروجی شاید دستور زیر کاربردی باشد:
SELECT `user`, SUM(`number`) FROM tbl GROUP BY `user` UNION SELECT `user`, `number` FROM tbl 
دقیقا مطابق نتیجه مورد نظر نیست اما همان ستون ها و ردیف ها در خروجی وجود دارد که می توانید در PHPMyAdmin تست کنید.
روناک قادری
۱۱:۰۷ ۱۴۰۱/۰۱/۰۷
با سلام و خسته نباشید
ببخشید تورو خدا من از این تابع واسه تکراری بودن عنوان و لینک استفاده می کنم
$_url = Yii::app()->db->createCommand("select url from post where url='{$__}' and rss_id='{$_}'")->queryScalar();
$post_title = Yii::app()->db->createCommand("select title from post where title like '{$_2}' and rss_id='{$_}'")->queryScalar();

if( ! empty($_url))
return;

if( ! empty($post_title))
return;
لینک ها هم بصورت پشت سر هم هر کدام در یک خط وارد می شود.
$str = explode("\n", $this->link);
$str = array_map('trim', $str);

foreach($str as $__){
$content = file_get_contents($__);
لینک ها رو واسه دریافت فیدخوان استفاده می کنم چند تا پشت سر هم آدرس لینک میدم که لینکهارو با هم بذاره الان من یه مشکل دارم وقتی لینک و عنوان تکراریه بجای اینکه رشته رو دنبال کنه همونجا قطع می شه! بعضی وقتها درست کار می کنه ولی یه مدته نمی دونم کجا رو دستکاری کردم که وقتی لینک و یا عنوان تکراری پیدا می کنه بی خیال بقیه لینک ها می شه من می خوام تا آخرین لینکی که بهش دادم رو دنبال کنه اگه لینک تکراری بود بره دنبال لینک بعدی و اگه تکراری نبود تا مرحله ذخیره شدن مطلب بره نمی دونم مشکل کارم کجاست! و لینکه وقتی لینکی رو چک می کنه اگه قبل گذاشته شده باشه میره توی مطالب قبلی می گرده هم عنوان رو چک می کنه و هم لینک ممنون می شم بازم مثل همیشه محبت کنید و بهم کمک کنید
با تشکر فراوان
حل این مشکل نیاز به خطایابی واقعی حین اجرا دارد، متاسفانه از کدهای درج شده نمی شود نظر قطعی داد، ممکن است بخش return ایرادی داشته باشد که باعث خاتمه حلقه می شود، در صورت تمایل می توانید اطلاعات یک اکانت آزمایشی و موقت از سرورتان را ارسال کنید تا بررسی گردد، در غیر اینصورت باید برای بررسی توسط Teamviewer از طریق بخش برنامه نویسی هماهنگی کنید.
مهدی
۰۸:۳۷ ۱۴۰۱/۰۸/۲۸
سلام خسته نباشید
میخواهم تابع ای بنویسم که توان ۲ یک عدد را فراخوانی با ارجاع انجام دهد ؟
میشه بهم بگید ممنون
طبق توضیحات نمونه تابع زیر می تواند برای توان رساندن عدد به صورت call by reference کمک کند:
<?php
function powTwo(&$num){
$num = pow($num, 2);
print("Inside function: " . $num);
}
$num = 10;
powTwo($num);
print("<br>");
print("Outside function: " . $num);
?>
more لطفا پیش از ارسال دیدگاه نکات زیر را مد نظر داشته باشید:
- به سوالات کلی، زمانبر، مبهم و مشکلاتی که تلاشی برای رفع آنها نکرده باشید پاسخ مختصر داده شده یا به بخش برنامه نویسی اختصاصی ارجاع داده می شوند.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین یا به صورت حساب موقت و آزمایشی قرار دهید تا امکان بررسی دقیق مشکل و خطایابی میسر باشد.
- تمام دیدگاه های ارسالی خوانده شده و برای هر کاربر مدت زمان لازم جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.



 refresh
10 × 10
7 × 4
20 × 20
=
آخرین دیدگاه ها
more برای دسترسی سریع به یادداشت مربوطه می توانید از لینک مطلب در کادر زیر استفاده کنید.
میثم
سلام وقت بخیر. من برای نمایش دادن و مخفی کردن div با اسکرول کردن صفحه از کد زیر استفاده می کنم. با...
۱۴۰۱/۰۹/۱۲

پـــــرتو
سلام جناب خسته نباشید شرمنده مزاحم میشم درسته گفتم قالبم درست شده ولی درست نشده یعنی اینک از کد جدیدی دارم استفاده می کنم ولی...
۱۴۰۱/۰۹/۰۸

حسین ناصری
سلام من از نمونه کد برای نمایش قسمتی از سایت دیگه استفاده میکنم مشکلم اینه بعضی از سایت ها برداشت مطلب با این...
۱۴۰۱/۰۸/۳۰

مهدی
سلام خسته نباشید میخواهم تابع ای بنویسم که توان ۲ یک عدد را فراخوانی با ارجاع انجام دهد ؟ میشه بهم بگید...
۱۴۰۱/۰۸/۲۸

اروین
من یک بلاک html رو از یک بخشی از سایت با روش display:none برداشتم. من میخوام این بخشی که برداشتم توی...
۱۴۰۱/۰۸/۲۶

پـــــرتو
سلام جناب خسته نباشید ببخشید جناب هعی مزاحم میشم توی همین قالبی که دارم بردراش صاف و مساوی نمیشه نمی دونم مشکل از منه یا...
۱۴۰۱/۰۸/۲۳

پرتو
عه من کد رو براتون اپلود کردم توی ایمیل خالی اومده؟ مگه میشه؟ خودم اپلودش کردم توی ایمیل...! عجیبه لطفا یه چک بکنید شاید مشکل...
۱۴۰۱/۰۸/۱۹

شبنم
سلام وقت خیر، من برای وب سایتم اسلایدر ایجاد کردم از طریق سایت owl carousel و اوکی هست مشکلی از این بابت ندارم، مشکل اینجاست...
۱۴۰۱/۰۸/۱۸

پــــرتو
سلام جناب خسته نباشید من کد رو براتون ارسال کردم و دیگه اینکه یه سوال کامپیوتری داشتم من هر دفعه که لپتاپ رو خاموش روشن...
۱۴۰۱/۰۸/۱۸

پرتو
باشه فعلا لپتاپم در دسترسم نیست تا آخر هفته میفرستم
۱۴۰۱/۰۸/۰۷

پرتو
سلام خسته نباشید شرمنده مزاحم میشم اوکی ممنونم از جوابتون یه چیز میتونم بگم میخاستم بگم که برای منوی سمت راست اگر یه بردر برای...
۱۴۰۱/۰۸/۰۵

عباس
سلام خوبید جدید یک هفته ای هست تعداد آنلاین ها را فقط عدد یک نشون میده بی زحمت یه بررسی کنید البته سی‌دی‌ان سایت تغییر...
۱۴۰۱/۰۸/۰۱

پرتو
سلام جناب خسته نباشید عه بازم منظورمو متوجه نشدین اینایی که گفتینو میدونم منظورم اینک کدهایی که توی سایت شما هست همون ادرسی که بهم...
۱۴۰۱/۰۷/۲۹

پرتو
اوکی ممنونم از توضیحاتتون فقط در مورد کد یه چیز بگم من منظورم اینک کجا کدها رو قرار بدم منظورم کدوم قسمت یا اینک کدوم...
۱۴۰۱/۰۷/۲۶

sara24
سلام خسته نباشید کدی رو تو جاوا اسکریپت با if else نوشتم که وقتی روی دکمه (like) کلیک شه اون صفحه رو به لیست...
۱۴۰۱/۰۷/۲۳

پرتو
سلام جناب خسته نباشید جناب الان اون لینکی که فرستادین خوندم فقط نفهمیدم باید چیکار کنم دقیقا یعنی متوجه شدم ولی متوجه نشدم باید دقیقا...
۱۴۰۱/۰۷/۲۲

Zeinab
سلام من میخواستم بدونم که چرا توی اکثر سایت ها اول با universal selector (که با * در css انتخاب میشه) میان padding و margin...
۱۴۰۱/۰۷/۲۱

آیدا
در صفت face در تگ font کاری کنیم که فاصله رو بپذیره؟
۱۴۰۱/۰۷/۱۹

سپهر
سلام خسته نباشید من یک وبلاگ داخل بلاگ بیان دارم ،‌ فاو ایکون هم ساختم ولی نمیدونم چه جوری اپلودش کنم هاست هم ندارم خیلی...
۱۴۰۱/۰۷/۱۵

پـــرتو
سلام خسته نباشید شرمنده مزاحم میشم ببخشید اینستاگرام قطعه کلا؟ می دونم قطعه و باید با فیلترشکن رفت منظورم اینک من با فیلترشکن هم نمی...
۱۴۰۱/۰۷/۱۵
  در انتظار بررسی: ۱
 پاسخگویی به سوالات ممکن است تا ۲۴ ساعت زمان ببرد.