2012-10-18 6 views
9

का उपयोग कर php के साथ एसक्यूएल तालिका के डेटा को खींचकर मैं सत्र की आईडी के लिए अनन्य php के साथ अपनी एसक्यूएल तालिका से डेटा खींचने की कोशिश कर रहा हूं, हालांकि मुझे केवल उस स्थिति को प्राप्त होता है जब उपयोगकर्ता कुछ भी गूंजता है!सत्र

<?php 
include 'core/init.php'; 
$user_info = $_SESSION['user_id']; 
?> 
<html>.... 
<h1><?php echo $user_info['firstname'];?>&nbsp<?php echo $user_info['firstname'];?> </h1> 

प्रदर्शित करता है के रूप में:

अगर मैं डेटाबेस में पांचवें स्थान के साथ प्रवेश करें!

+0

आप $ _SESSION में डेटा कहां जोड़ते हैं। मुझे लगता है कि आप याद कर रहे हैं वह हिस्सा –

+0

$ session_user_id लाइन पर खाली हो सकता है $ user_data = user_data ($ session_user_id, 'user_id', 'उपयोगकर्ता नाम', 'first_name', 'last_name', 'ई-मेल'); –

+1

डाटाबेस तस्वीर मृत लिंक है – SomeKittens

उत्तर

3

कारण है कि आप 5 हो रही है इस कोड के लिए है:

<?php echo $user_info['firstname'];?> 

यह है कि $ _SESSION ['user_id'] का मान 5 है। इसलिए असाइनमेंट के बाद $ user_info का मान 5 है। अब क्योंकि $ _SESSION ['user_id'] आपके इरादे के रूप में सरणी पर सेट नहीं है होने के लिए। नतीजा यह है कि $ user_info को एक स्ट्रिंग के रूप में लिया जाता है और ['firstname'] का मूल्यांकन [0] होता है। यदि आप चाहें, तो आप आईडी 5 से 54, आदि अपडेट कर सकते हैं। आपको हमेशा अपनी आईडी का पहला अक्षर मिल जाएगा।

$data = mysql_fetch_assoc(mysql_query("SELECT $fields FROM `users` WHERE `user_id` = $user_id")); 
$data = array_merge(array($user_id), $data); 
return $data; 

if (logged_in() === true) { 
    $user_data = user_data($_SESSION['user_id'], 'username', 'first_name', 'last_name',  'email'); 
    $user_data = user_data($session_user_id, 'user_id', 'username', 'first_name', 'last_name', 'email'); 
} 

लिए:

इसे ठीक करने के लिए, करने के लिए अपने user_data समारोह में वापसी से पहले पिछले 2 लाइनों को बदलने की कोशिश

if (logged_in() === true) { 
    $user_data = user_data($_SESSION['user_id'], 'username', 'first_name', 'last_name', 'email'); 
    $_SESSION['user_id'] = $user_data; 
} 
2
if (logged_in === true) { 

होना चाहिए

if (logged_in()) { 
+0

मैंने इसे बदल दिया है हालांकि उपयोगकर्ता का डेटा अभी भी गूंज नहीं करता है! – thedullmistro

0

मेरे लिए यह लगता है कि आप की तरह सत्र में डेटा अद्यतन करने के लिए भूल गया था।

if (logged_in() === true) { 
    $user_data = user_data($_SESSION['user_id'], 'username', 'first_name', 'last_name', 'email'); 
    $user_data = user_data($session_user_id, 'user_id', 'username', 'first_name', 'last_name', 'email'); 

    $_SESSION = array_merge($_SESSION, $user_data); 
} 

आशा है कि यह आप अपनी समस्याओं को हल करने में मदद करता है: यहाँ कहना सुविधा देता है।

+0

इस errror मिला "चेतावनी: array_merge() [function.array-मर्ज]: तर्क # 2 लाइन पर /home/emusauce/public_html/classm8.net/test/core/init.php में एक सरणी नहीं है 12 " – thedullmistro

+0

ठीक। क्या आप कृपया 'user_data' फ़ंक्शन का नतीजा दिखा सकते हैं? – chmeliuk

0

मैं क्या देखते हैं कि आपके इस पंक्ति में

<h1><?php echo $user_info['firstname'];?>&nbsp<?php echo $user_info['firstname'];?> </h1> 

आप, "firstname" का उपयोग कर रहे हैं, जबकि डेटाबेस में यह "first_name" के रूप में नामित किया गया है, अंडरस्कोर देख

<h1><?php echo $user_info['first_name'];?>&nbsp<?php echo $user_info['first_name'];?> </h1> 

मुझे अगर जानते हैं इस को हल करती है या नहीं के रूप में मैं भी अपने जवाब जानना चाहते हैं

+0

समस्या अलग-अलग प्रतीत होती है क्योंकि वह आउटपुट ** '5' ** प्राप्त करता है जब भी वह $ user_info ['firstname'] के रूप में उपयोग करता है। मुझे लगता है कि यह इंगित करता है कि वह सत्र मूल्यों को गलत तरीके से पॉप्युलेट कर रहा है। –

+0

हाँ, तो लगता है, मैं यदि संभव हो तो तो मैं सटीक समस्या –

+0

यकीन है कि रवि ट्रेस कर सकते हैं, अपने कोड और डाटाबेस देना खुश करने के लिए आपसे अनुरोध करते हैं, जहां एक अच्छी जगह मुझे मेरे कोड डाल करने के लिए है? – thedullmistro

0

आप अपने कोड में कुछ बदलाव करने में मदद कर सकते हैं

function user_data($user_id) { 
    $data = array(); 
    $user_id = (int)$user_id; 

    $func_num_args = func_num_args(); 
    $func_get_args = func_get_args(); 

    if ($func_num_args > 1) { 
     unset($func_get_args[0]); 

     $fields = '`'. implode('`, `', $func_get_args). '`'; 
     echo '<br>'. 
     $que = "SELECT $fields FROM `users` WHERE `id` = $user_id"; 
     $data = mysql_fetch_assoc(mysql_query($que)); 
     print_r ($data); 
     return $data; 
     } 
} 

function logged_in() { 
    return (isset($_SESSION['id'])) ? true : false; 
} 

if (logged_in() === true) { 
    $user_data = user_data($_SESSION['user_id'], 'username', 'firstname', 'email'); 
    //$user_data = user_data($session_user_id, 'user_id', 'username', 'firstname', 'email'); 
    print_r($user_data); 
} 
echo 
$user_info = $user_data;//$_SESSION['user_id']; 
?> 
<h1><?php echo $user_info['firstname'];?>&nbsp<?php echo $user_info['firstname'];?> </h1> 
0
function user_data($data=array(),$whereData=array()) { 
    $str=''; 
    if(isset($whereData) && is_array($whereData)) 
    { 
     foreach($whereData as $key=>$val) 
    { 
     if($val!='') 
     if($str=='') 
      $str  = $key." = '".$val."'"; 
     else 
      $str .= " AND ".$key." = '".$val."'"; 
    } 
    } 
     $condition = 
     $fields = implode(',' , $data); 
     if($str!=''){ 
     $data = mysql_fetch_assoc(mysql_query("SELECT $fields FROM `users` WHERE $str")); 
     } 
     else 
      { 
       $data = mysql_fetch_assoc(mysql_query("SELECT $fields FROM `users`)); 
      } 
     return $data; 
     print_r ($data); 
     } 
} 

ए nd

if (logged_in() === true) { 
    $data = array('username', 'first_name', 'last_name', 'email'); 
    $where=array('user_id'=>$_SESSION['user_id']) 
    $_SESSION['data'] = user_data($data, $where); 

} 

और

<?php 
include 'core/init.php'; 
$user_info = $_SESSION['data']; 
?> 
<html>.... 
<h1><?php echo $user_info['firstname'];?>&nbsp<?php echo $user_info['firstname'];?> </h1> 
0

PHP में बड़ी कोड ठिकानों बनाने और जब आप आवेदन आप पाएंगे विस्तार आप सभी उपयोगकर्ताओं मेज से जगह अधिक से अधिक डेटा का उपयोग कर रहे हैं के अनुभव से। साथ ही, तालिका में केवल वास्तव में सबसे महत्वपूर्ण डेटा होना चाहिए जो कि आम तौर पर उपयोग किया जाता है और आप प्रति पृष्ठ हिट के लिए उपयोगकर्ता तालिका में 1 या 2 से अधिक प्रश्न भेजना नहीं चाहते हैं क्योंकि यह जल्द ही एक बोतल गर्दन बन सकता है।इस कारण से आप सभी डेटा डेटा को बेहतर तरीके से संग्रहीत कर रहे हैं (बड़े फ़ील्ड को किसी अन्य तालिका या फ़ील्ड को शायद ही कभी इस्तेमाल किया जाता है)। फिर पूरे उपयोगकर्ता रिकॉर्ड को एक सत्र में संग्रहीत करें जिसका अर्थ है कि कोई भी फ़ंक्शन, क्लास इत्यादि इसका उपयोग कर सकता है क्योंकि यह एक सुपरग्लोबल बन जाता है और आप उपयोगकर्ताओं को बार-बार उपयोगकर्ता तालिका को दोबारा पूछने के बिना पूरे एप्लिकेशन में इसका उपयोग करने के लिए पर्याप्त भरोसा कर सकते हैं।

मैं एक काम उदाहरण लिखा (अपने db तालिका संरचना मुकदमा) और समझा क्यों मैं इसे जिस तरह से मेरे पास है और कुछ अंक आप विचार करना चाह सकते किया है भर में यह सब टिप्पणी की है।

//change from user_data() to get_user_data() so we know we are "getting" it, makes it a little clearer 
function get_user_data($user_id) { 

    //protect agains sql injections 
    $user_id = mysql_real_escape_string($user_id); 

    //you should also be using mysqli or PDO, not the outdated mysql library - just check the php documentation if you don't believe me ;) 
    $result = mysql_query("SELECT * FROM `users` WHERE `id` = '{$user_id}' LIMIT 1"); 

    //only if the previous query returned a result do we want to fetch an array from it 
    if ($result) { 
     return mysql_fetch_assoc($result); 
    } 

    //query didn't work (syntax error for example) so return blank array 
    return array(); 

} 

//start and restore the session 
session_start(); 

//if first page hit, set the user details element 
if (isset($_SESSION['user_details']) == false) { 
    $_SESSION['user_details'] = array(); 
} 

//if already logged in, refresh their user details incase there were any changes 
if (isset($_SESSION['user_details']->user_id)) { 
    //refresh the user data 
    $_SESSION['user_details'] = get_user_data($_SESSION['user_details']->user_id); 
} 

//login 
if (empty($_POST['id']) == false) { 
    $_POST['id'] = trim($_POST['id']); 
    if (is_numeric($_POST['id'])) { 
     $_SESSION['user_details'] = get_user_data($_POST['id']); 
    } 
} 

//logout 
if (isset($_GET['logout'])) { 
    if ($_GET['logout'] == session_id()) { 
     $_SESSION['user_details'] = array(); 
    } 
} 

//see if logged in so we know what to display 
if (empty($_SESSION['user_details'])) { 
    //not logged in 
    print "<form method='post' action=''><label>User ID</label><input type='text' name='id' value='5' /><input type='submit' value='Login' /></form>"; 
    } else { 
    //is logged in 
    print "<a href='?logout=" . rawurlencode(session_id()) . "'>logout</a>"; 
} 

//proof that it works 
print '<pre>'; 
print_r($_SESSION['user_details']); 
print '</pre>'; 

पी.एस. इसके अलावा आप उपरोक्त क्वेरी में LIMIT 1 के रूप में अपने SQL क्वेरी में LIMIT का उपयोग शुरू करना चाह सकते हैं, mysql को बताता है कि यह 1 परिणाम प्राप्त करने के बाद खोज बंद कर सकता है - और आपके पास उस कॉलम पर एक अनुक्रमणिका होनी चाहिए (अधिमानतः प्राथमिक अनुक्रमणिका या अद्वितीय अनुक्रमणिका) इसे तेजी से हल्का रखने के लिए (या कम से कम शुरुआत में> <)।