2012-10-18 8 views
9

Tôi đang cố gắng lấy dữ liệu ra khỏi bảng sql của mình bằng php duy nhất cho ID của phiên, tuy nhiên tôi chỉ nhận được vị trí mà người dùng ở trong khi tôi lặp lại bất kỳ điều gì!Kéo dữ liệu ra khỏi bảng sql bằng php sử dụng phiên

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

hiển thị như:

nếu tôi đăng nhập với vị trí thứ năm trong cơ sở dữ liệu!

+0

Nơi bạn thêm dữ liệu vào $ _SESSION. Tôi nghĩ rằng bạn đang thiếu một phần –

+0

$ session_user_id có thể trống tại dòng $ user_data = user_data ($ session_user_id, 'user_id', 'username', 'first_name', 'last_name', 'email'); –

+1

Hình ảnh cơ sở dữ liệu là liên kết chết – SomeKittens

Trả lời

3

Lý do bạn nhận được 5 là cho mã này:

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

là giá trị $ _SESSION ['user_id'] là 5. Vì vậy, sau khi gán $ user_info giá trị là 5. Bây giờ vì $ _SESSION ['user_id'] không được đặt thành một mảng như ý định của bạn có vẻ được. Kết quả là $ user_info được lấy dưới dạng một chuỗi và ['firstname'] ước lượng thành [0]. Nếu muốn, bạn có thể cập nhật ID từ 5 đến 54, v.v. Bạn sẽ luôn nhận được ký tự đầu tiên của ID.

Để khắc phục điều này, hãy thử thay đổi 2 dòng cuối cùng trước khi trở lại trong chức năng user_data của bạn để:

$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'); 
} 

tới:

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) { 

nên

if (logged_in()) { 
+0

Tôi đã thay đổi nó tuy nhiên dữ liệu của người dùng vẫn không lặp lại! – thedullmistro

0

đối với tôi nó có vẻ như bạn quên để cập nhật dữ liệu trong phiên làm việc. cho phép nói ở đây:

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); 
} 

hy vọng nó sẽ giúp bạn giải quyết vấn đề của mình.

+0

có lỗi này "Cảnh báo: array_merge() [function.array-merge]: Đối số # 2 không phải là một mảng trong /home/emusauce/public_html/classm8.net/test/core/init.php trên dòng 12 " – thedullmistro

+0

được. bạn có thể vui lòng cho biết kết quả của hàm 'user_data' là gì? – chmeliuk

0

Những gì tôi thấy rằng bạn trong dòng này

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

bạn đang sử dụng "firstname", trong khi cơ sở dữ liệu nó được đặt tên là "first_name", xem nhấn

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

Hãy cho tôi biết nếu điều này giải quyết hay không như tôi cũng muốn biết câu trả lời của nó

+0

Vấn đề có vẻ khác vì anh ta nhận được kết quả ** '5' ** ngay cả khi anh ta sử dụng như $ user_info ['firstname']. Tôi nghĩ rằng điều này cho thấy anh ta đang điền các giá trị phiên không chính xác. –

+0

vâng, có vẻ như vậy, tôi sẽ yêu cầu bạn vui lòng cung cấp mã và db của bạn, nếu có thể để tôi có thể theo dõi vấn đề chính xác –

+0

chắc chắn Ravi, nơi nào tốt cho tôi để đưa mã của tôi lên? – thedullmistro

0

có thể giúp gì cho bạn một số thay đổi trong mã của bạn

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); 
     } 
} 

a 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

Từ kinh nghiệm của việc tạo ra cơ sở mã lớn trong PHP và khi bạn mở rộng các ứng dụng mà bạn sẽ tìm thấy bạn đang sử dụng ngày càng nhiều dữ liệu trên tất cả các vị trí từ bảng người sử dụng. Ngoài ra, bảng nên chỉ thực sự chứa dữ liệu quan trọng nhất được sử dụng comonly và bạn KHÔNG muốn gửi nhiều hơn 1 hoặc 2 truy vấn tới bảng người dùng trên mỗi lần truy cập trang vì nó có thể sớm trở thành cổ chai.Vì lý do này, bạn lưu trữ tốt hơn tất cả dữ liệu dữ liệu (di chuyển các trường lớn sang một bảng hoặc trường khác hiếm khi được sử dụng). Sau đó lưu trữ toàn bộ hồ sơ người dùng trong một phiên có nghĩa là bất kỳ chức năng, lớp, vv có thể sử dụng nó khi nó trở thành siêu siêu và bạn có thể tin tưởng nó đủ để sử dụng nó trong toàn bộ ứng dụng mà không cần truy vấn lại bảng người dùng một lần nữa.

Tôi đã viết một ví dụ làm việc (kiện cấu trúc bảng db) và nhận xét tất cả trong suốt giải thích lý do tại sao tôi đã thực hiện theo cách tôi có và một số điểm bạn có thể muốn xem xét.

//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>'; 

P.S. Ngoài ra, bạn có thể muốn bắt đầu sử dụng LIMIT trong các truy vấn SQL của bạn như LIMIT 1 trong truy vấn trên cho mysql biết rằng nó có thể ngừng tìm kiếm sau khi nó tìm thấy 1 kết quả - và bạn nên có chỉ mục trên cột đó (tốt hơn là chỉ mục chính hoặc chỉ mục duy nhất) để giữ cho nó sáng nhanh (hoặc ít nhất là trong đầu anyway> <).