• 1 رای - 5 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
مشکل در session
#1
سلام به همه دوستان
بازم منه تازه کار به مشکل خوردم
دوتا سوال
بپُرســـــــــــــــــــــــــــــــــم؟!؟!؟!؟!؟Big Grin

اولی اینکه session ایجاد کردم توی قسمت header سایتم(کلا یه بار header رو کد نوشتم و توی هر جا خواستم ضمیمه اش کردم) واسه همینم که فرم لاگین سایتم توی header هست session رو همونجا ایجاد کردم و از هر صفحه به صفحه دیگه میرم مشکلی توش نیست اما وقتی روی آدرسش کلیک میکنم و اینتر میزنم کلا session میپرهSad
آخه چرا؟؟؟؟؟؟
توی سایتای درست و حسابی که اینطور نیست
دوم اینکه وقتی کاربر لاگین میکنه هیچی نشون نمیده و وقتی صفحه رو رفرش میکنم اسمش میاد
چرا؟؟؟؟؟
[عکس: ngt_sfsbfnhgmhj.jpg]
  پاسخ
تشکر شده توسط :
#2
میشه یکم بیشتر توضیح بدی یا یه کدی چیزی بگذاری که بشه بهتر فهمید ؟
  پاسخ
تشکر شده توسط : alidf1372
#3
عهههههRolleyes

سلام دوست عزیزHeart
معلومه که میشه

فایل courses.php یکی از صفحات سایتمه که فایل header‌بهش ضمیمه شده(فایل header توی همه صفحاتم ضمیمه هست و واسه همین session رو توش نوشتم)

یه نگاه به header و form بندازی همه چی دستت میاد که چه دسته گلی به آب دادم که این دوتا مشکل رو دارمBig Grin
مررررررررسیHeart



http://yekupload.ir/Yh3/session.rar
[عکس: ngt_sfsbfnhgmhj.jpg]
  پاسخ
تشکر شده توسط :
#4
خوب من کدت رو دیدم ... اولا من متوجه منظور شما نشدم این قسمت رو :

نقل قول:از هر صفحه به صفحه دیگه میرم مشکلی توش نیست اما وقتی روی آدرسش کلیک میکنم و اینتر میزنم کلا session میپره

تو صفحه header اولا چرا همش داری session و start میکنی ؟؟؟

اینجوری بهتر نیست کار کنی (البته این فقط یک مثال که بهتر موضوع رو بفهمی )

کد پی‌اچ‌پی:
<?php
if(empty($_SESSION['header']))
{
    
session_start();
    
$_SESSION['header']='Ok';
}
?>
با این روش که کلا از استارت کردن سشن تو هر بار رفرش جلو گیری میکنیم ...

تو قسمت form هم دوباره یه بررسی بکن ببین اصلا session استارت شده یا نه اگه شده کارا رو ادامه بده :
کد پی‌اچ‌پی:
if ($b mysqli_fetch_array($a))
    {
        if(empty(
$_SESSION['header']))
        {
            
session_start();
            
$_SESSION['header']='Ok';
            
$_SESSION['login-name']=$b['name'];
        }
        else
        {
            
$_SESSION['login-name']=$b['name'];
        }

       
$x=0;
    
    }
    else
    { 
و اینکه کار اصولی انجام نمیدی برای مدیریت session هات ... اگه خواستی بگو یه سری نکته ها رو برات بگم تا کار با session ها برات هم راحت بشه هم مدیریتش بهتر ...
  پاسخ
تشکر شده توسط : Reza
#5
بازم طبق معمول عالی بود توضیحات و خیلی ازت ممنونم


خب گلی به جمالت منکه یه تازه کارمSmile
اگه میشه بهم یه چیزایی یاد بده
ایشالا بتونم و کاری ازم بر بیاد جبران میکنم این لطفت روHeart

شرمنده یه سوال دیگهHuh

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

حالا کدش رو اینطوری نوشتم که اگه session وجود داشت که پنل رو براش نمایش بده اگه نه خودکار هدایت شه به صفحه login
برای شرطش هم تو قسمت select گفتم اون اطلاعاتی رو از جدول بخون که مقدار user برابر با $_SESSION["login-name"] باشه

کد:
<?php

    include("connect db.php");

    $sql = mysqli_query($conn,"SELECT * FROM users WHERE user='".$_SESSION["login-name"]."'");


        $result = $conn->query($sql);

        if ($result->num_rows > 0) {

            echo "<table><tr colspan='2'><td>نام و نام خانوادگی :".$result["name"]."</td></tr><tr><td>تاریخ تولد :"
            .$result["date"]."</td><td>کد ملی : ".$result["code"]."</td></tr><tr><td>نام کاربری : "
            .$result["user"]."</td><td>پست الکترونیکی : ".$result["email"]."</td></tr><tr><td>شماره همراه : "
            .$result["mobile"]."</td><td>تلفن ثابت : ".$result["tel"]."</td></tr><tr colspan='2'><td>آدرس محل سکونت :"
            .$result["address"]."</td></tr></table>";
            }
    ?>
ولی دوتا خطا داره
Warning: mysqli::query() expects parameter 1 to be string, object given in C:\wamp\www\zafar\panel.php on line 71

Notice: Trying to get property of non-object in C:\wamp\www\zafar\panel.php on line 73

به نظرت این کد select رو باید چجوری مینوشتم ؟
[عکس: ngt_sfsbfnhgmhj.jpg]
  پاسخ
تشکر شده توسط :
#6
من اگه یکم آسون توضیح میدم برا اینه که بهتر متوجه بشی ... (اساتید ایراد نگیرن Big GrinBig Grin)

اول کدت رو اینجوری بنویس :
کد پی‌اچ‌پی:
$com ="SELECT * FROM users WHERE user = '".$_SESSION['login-name']."'";
    
$sql mysqli_query($conn,$com); 
ببین خطا میده ... اگه داد $com رو یه Echo بکن ببین چی داری توش اصلا ... به احتمال زیاد تو این مرحله مشکل رو خودت متوجه میشی اگه نشدی باز بگو اینجا ...
و اینکه یه لطف کن کد های فایل "connect db.php رو هم بگذار که ببینیم ..

چون بعضی وقت ها دیدم افراد با mysql_connect به بانک وصل میشن و با mysqli_query(); میخوان query بگیرن که همین خطای مشابه رو میده.

برای توضیح در مورد Session ها و چجوری کار کردن باهاشون و مدیریت کردن اونها هم بعد از گرفتن جواب سوالای قبلیتون همینجا یه توضیح کوچیکی میدم ...
  پاسخ
تشکر شده توسط : alidf1372
#7
این کد connect db.php
کد پی‌اچ‌پی:
<?php

$servername 
"localhost";
$username "root";
$password "";
$dbname "zafar";



$conn = new mysqli($servername$username$password$dbname);

if (
$conn->connect_error) {
    die(
"Connection failed: " $conn->connect_error);
}

?>

خط 71 که داره خطا میگیره اینه:
$result = $conn->query($sql);
و خط 73:
if ($result->num_rows > 0) {

با این تغییر کدی هم که شما گفتین بازم درست نشد ارباب
[عکس: ngt_sfsbfnhgmhj.jpg]
  پاسخ
تشکر شده توسط :
#8
خوب بیا حالا قدم به قدم شروع بکنیم هم یه چیز جدید باهم یاد بگیریم و هم کدت رو درست کنیم ...
به نظر من روشت رو برای وصل شدن به بانک تغییر بده و با PDO وصل شو که الان برات توضیح میدم چون هر زمان و به هر دلیلی بخوای بانکت رو عوض بکنی با PDO با تغییر 1 خط این اتفاق برات انجام شدنی هست.

طبق روال همیشه اول کد رو مینویسم بعد روش توضیح میدم برات :
کد پی‌اچ‌پی:
<?php
$dsn
="mysql:host=localhost;dbname=zafar;";
try
{
$obj=new PDO($dsn,'root','');
}
catch(
PDOException $e)
{
  echo 
$e;
}
$sql="SELECT * FROM users WHERE user=?";
$result=$obj->prepare($sql);
$result->bindValue(1,$_SESSION['login-name']);
$result->execute();
foreach (
$result as $row) {
     echo 
"<table><tr colspan='2'><td>نام و نام خانوادگی :".$row["name"]."</td></tr><tr><td>تاریخ تولد :"
      
.$row["date"]."</td><td>کد ملی : ".$row["code"]."</td></tr><tr><td>نام کاربری : "
      
.$row["user"]."</td><td>پست الکترونیکی : ".$row["email"]."</td></tr><tr><td>شماره همراه : "
      
.$row["mobile"]."</td><td>تلفن ثابت : ".$row["tel"]."</td></tr><tr colspan='2'><td>آدرس محل سکونت :"
      
.$row["address"]."</td></tr></table>";
    
?>

خوب خط اول یه متغیر داریم که داخلش یه رشته هستش ... تو روش وصل شدن به بانک با PDO ما احتیاج به یه DSN داریم مثل بالا که اول بهش میگیم Driver مون چی هست که در اینجا Mysql هستش بعد میگیم Host چی هست که باز اینجا Localhost هستش و در آخر هم مشخص میکنیم که به چه نام بانکی میخواهیم وصل بشیم ... (مثلا پارامتر Charset هم میشه داد بهش برای معرفی کردن UTF8 )

تو خط دوم یه دستور شرطی داریم Try که میگیم این شرط رو تا زمانی که میتونی انجام بده اگه نشد catch میکنه و خطا رو نشون بده حالا دستور چی هست :
ما یه متغیر داریم که تو اون از کلاس PDO میایم و New میکنیم (امیدوارم یه کم از کلاس ها بدونید)و 3 تا پارامتر هم باید بهش بدیم اول DSN مون رو بعد user و Pass بانک رو...

با همین چند خط به بانک وصل شدی(ساده تر نبود ؟؟ )
بعد میایم دستورات Sql رو مینویسیم ... چرا حالا از ؟ استفاده کردیم چون میخوایم با روش BindValue کار کنیم .. که خیلی خیلی بهتر هستش و همچنین از حملات Mysql hack injection هم خیلی زیاد در امانی. ...
تو خط بعد از اون اومدیم Prepare کردیم از Sql مون ... خیلی ساده بود به نظرم ...
تو خط بعد اومدیم گفتیم BindValue بکن رو کارکتر اولی که ؟ هست و مقدار Session رو بهش بده ... تو دستور sql ت هر چند تا از ؟ داشتی باید یه خط اینجا بنویسی و بگی مثلا 1 این باشه 2 این باشه مقدارش و .....
و در نهایت هم اومدیم execute کردیم کارمون رو و داخل یه حلقه foreach انداختیم و خروجی گرفتیم ...

امیدوارم کامل بوده باشه توضیحات
  پاسخ
تشکر شده توسط : alidf1372
#9
سلام دوست عزیز
واقعا ممنونم ازت
این خیلی راحت تره و جالب اینه که راجبش که تحقیق کردم امنیتش هم بهتره
توی این روش و متد PDO چندتا چیز جدید بود که مثلا اونطور که من فهمیدم گفته بود dsn امنیت کانکشن رو تامین میکنه و ....
فقط یه چیزی هنوز ذهنم رو به خودش درگیر داره و گیجم کرد روش BindValue بود که گفتی

مخصوصا که گفتی
نقل قول:تو دستور sql ت هر چند تا از ؟ داشتی باید یه خط اینجا بنویسی و بگی مثلا 1 این باشه 2 این باشه مقدارش و .....
یعنی چی اگه تو دستور sql چندتا ؟ داشتیم بهش تک تک مقدار نسبت میدیم،خب این مقادیر چی میتونن باشن یا بهتر بگم ما توی sql یعنی چی چندتا ؟ داشته باشیم؟؟؟
[عکس: ngt_sfsbfnhgmhj.jpg]
  پاسخ
تشکر شده توسط :
#10
كد لاگين شدن به يك صفحه را در نظر بگير، تو دستور sqlش، بايد دو تا مقدار را چك بكني، يعني نام كاربري و پسورد درست باشه. بنابرين به دستور sql بايد دو تا مقدار بدي، يكي براي نام كاربري و يكي براي پسورد، كه مقدار هركدوم را اگر ؟ بزاري، و وقتي بخواي ازBindValue استفاده كني مثل كد بالا، بايد بگي اولي مقدارش چي باشه و دومي مقدارش چي باشه.
مثل كد بالا كه چون فقط يك ؟ داشتيم در BindValue اولين ؟ را بهش مقدار داديم.
کد پی‌اچ‌پی:
$result->bindValue(1,$_SESSION['username']);
$result->bindValue(2,$_SESSION['password']); 
همين
  پاسخ
تشکر شده توسط :


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان