مشکل با حوزه متغیرها در توابع

i-php-i

Active Member
من توابع زیر رو برای بررسی مقدار یه عدد نوشتم، توی هردو تابع باید متغیر ها نمایش داده بشن، اما موقع اجرای توابع، هیچ مقداری در خورجی نمایش داده نمی شه.

لطفا بگید که مشکل کجاست؟

PHP:
    global $mynum;
$num='abcdef';
$mynum=strlen($num);
function num_test()
{
    global $mynum;
    if($mynum)
    {
        echo "$mynum";
        return $mynum;
    }
    else
    {
        return false;
    }
}
function num_read()
{
    global $mynum;
    if ($mynum>5)
    {
        echo "$mynum";
    }
}
 
آخرین ویرایش:

Masoud1365

مدیر انجمن
شما ورودی ها رو به آرگومان به توابع ارسال کنید ! از نظر امنیتی هم بهتره !
 

i-php-i

Active Member
شما ورودی ها رو به آرگومان به توابع ارسال کنید ! از نظر امنیتی هم بهتره !

من تابعی که مد نظرم هست رو تغییر دادم. من دارم روی تابع session_set_save_handler کار می کنم. یه پست در این مورد ایجاد کردم ولی چون کسی جواب نداد، سوالم رو عوض کردم.

توی تابع session_set_save_handler نمی شه مقادیر ارسالی به توابع رو تغییر داد.

الان توابعی که نوشتم مشکلی ندارن، تنها عیبشون اینه که متغیر $cxn که اتصال به دیتابیس رو توی خودش ذخیره کرده رو شناسایی نمی کنن و باید توی هر شش تابه یه اتصال با پایگاه داده برقرار کنم.

در این مورد چه نظری دارید؟

PHP:
    global $cxn;
    $cxn=mysqli_connect($host,$uesr,$pass,$db);
function ses_open($cxn,$r)
{
    global $cxn;
    if($cxn)
    {
        return $cxn;
    }
    else
    {
        return false;
    }
}
 
function ses_close()
{
    global $cxn;
    return mysqli_close($cxn);
}

session_set_save_handler('ses_open','ses_close','ses_read','ses_write','ses_destroy','ses_clean');
 

Masoud1365

مدیر انجمن
این دوتا لینک رو ببینید :
کد:
http://www.php.net/manual/en/language.variables.scope.php
http://www.php.net/manual/en/reserved.variables.globals.php
 

i-php-i

Active Member
این دوتا لینک رو ببینید :
کد:
http://www.php.net/manual/en/language.variables.scope.php
http://www.php.net/manual/en/reserved.variables.globals.php

من همه این مسائل رو رعایت کردم و توی همه توابعی که استفاده می کنم به همین صورت کار می کنم اما در مورد توابع مربوط به مشکل دارم.


PHP:
Warning:  mysqli_close() expects parameter 1 to be mysqli, null given in C:\xampp\htdocs\admin\index.php on line 27

اتصال با تابع ses_open باز می شه اما موقع بستن اتصال به کمک تابع ses_close، هشدار زیر نمایش داده می شه. می شه. بنظرتون مشکل کجاست؟

PHP:
global $cxn;
$cxn=mysqli_connect("$host","$user","$pass","$db");
function ses_open($cxn)
{
    if($cxn)
    {
        return $cxn;
    }
    else
    {
        return false;
    }
}
 
function ses_close()
{
    return mysqli_close($cxn);
}

function ses_read($id)
{
    $sql = "SELECT data FROM sessions WHERE id = '$id'";
    if ($result = mysql_query($sql))
    {
        if (mysqli_num_rows($result))
        {
            $record = mysqli_fetch_assoc($result);
            return $record['data'];
        }
}

function ses_write($id, $data)
{
    $access = time(); 
    $sql="INSERT INTO sessions (id,data,access) VALUES ('$id','$data','$access')
    ON DUPLICATE KEY UPDATE  id='$id', data='$data', access='$access'";
    return mysql_query($sql);
}
function ses_destroy($id)
{
    $id = mysql_real_escape_string($id);
    $sql = "DELETE FROM sessions WHERE id = '$id'";
    return mysqli_query($cxn,$sql);
}

function ses_clean($max)
{ 
    $old = time() - $max;
    $sql = "DELETE FROM sessions WHERE access < '$old'"; 
    return mysqli_query($cxn,$sql);
}
session_set_save_handler('ses_open','ses_close','ses_read','ses_write','ses_destroy','ses_clean');
 

i-php-i

Active Member
مشکل توی متغیر cxn هست که به صورت نال شناسایی میشه !
شما درست می گید اما مشکل اینجاست که فقط توی این شش تابع این مشکل پیش می یاد.

من تست کردم، دیدم که فقط وقتی که از این شش تابع استفاده می کنم، متغیر cxn بصورت نمل در می یاد.

اگر از توابعی غیر از این شش تابع استفاده کنم،اتصال برقرار می شه و با این مشکلروبرو نمی شم.

چه راهی به ذهنتون می رسه؟
 

Masoud1365

مدیر انجمن
خب مثلا شما باید در تابع ses_close متغیر cxn رو به صورت آرگومان به این تابع بدید !
 

i-php-i

Active Member
خب مثلا شما باید در تابع ses_close متغیر cxn رو به صورت آرگومان به این تابع بدید !

برای توابع مربوط به خواندن و نوشتن سسشن ها نمی شه اتصال رو بصورت آرگومان به تابع داد و این کار باعث نمایش هشدار می شه.
 

Masoud1365

مدیر انجمن
نوع کدنویسیتون اصولی نیست که این اتفاق ها می افته !
فعلا چیزی به ذهنم نمیرسه !
شی گرا هم که کار نکردید ؟ درسته ؟
 

i-php-i

Active Member
نوع کدنویسیتون اصولی نیست که این اتفاق ها می افته !
فعلا چیزی به ذهنم نمیرسه !
شی گرا هم که کار نکردید ؟ درسته ؟

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

PHP:
if(!$cxn)
{
 $cxn=mysqli_connect('myhost','myuser','mypass','mydb');
}
تازه شروع کردم به یادگیری شی گرایی.

کدهای توابع رو کوتاه تر کردم و در ادامه قرار دادم. اگه وقت دارید یه نگاهی بندازید.

PHP:
global $cxn;
$cxn=mysqli_connect('myhost','myuser','mypass','mydb');
function ses_open($cxn)
{
    if($cxn)
    {
        return $cxn;
    }
    else
    {
        return false;
    }
}
 
function ses_close()
{
    return mysqli_close($cxn);
}

function ses_read($id)
{
    $sql = "SELECT data FROM sessions WHERE id = '$id'";
    if ($result = mysql_query($sql))
    {
        if (mysqli_num_rows($result))
        {
            $record = mysqli_fetch_assoc($result);
            return $record['data'];
        }
}

function ses_write($id, $data)
{
    $access = time();
    $sql="INSERT INTO sessions (id,data,access) VALUES ('$id','$data','$access')
    ON DUPLICATE KEY UPDATE  id='$id', data='$data', access='$access'";
    return mysql_query($sql);
}
function ses_destroy($id)
{
    $id = mysql_real_escape_string($id);
    $sql = "DELETE FROM sessions WHERE id = '$id'";
    return mysqli_query($cxn,$sql);
}

function ses_clean($max)
{
    $old = time() - $max;
    $sql = "DELETE FROM sessions WHERE access < '$old'";
    return mysqli_query($cxn,$sql);
}
session_set_save_handler('ses_open','ses_close','ses_read','ses_write','ses_destroy','ses_clean');
 

جدیدترین ارسال ها

بالا