9

セッションのIDに固有のphpを使用してSQLテーブルからデータを取得しようとしていますが、何かをエコーアウトしたときにユーザーの位置しか取得できません!

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

次のように表示されます。

5 5

データベースの 5 番目の位置でログインすると!

4

7 に答える 7

3

5を取得する理由は、このコードのためです。

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

$ _SESSION ['user_id']の値は5です。したがって、割り当て後の$ user_infoの値は5です。これは、$ _SESSION['user_id']が意図したとおりに配列に設定されていないためです。その結果、$ user_infoが文字列として取得され、['firstname']は[0]と評価されます。必要に応じて、ID5を54などに更新できます。IDの最初の文字は常に取得されます。

これを修正するには、user_data関数で戻る前の最後の2行を次のように変更してみてください。

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

に:

if (logged_in() === true) { 
    $user_data = user_data($_SESSION['user_id'], 'username', 'first_name', 'last_name', 'email');
    $_SESSION['user_id'] = $user_data;
}
于 2012-10-23T15:05:39.773 に答える
2
if (logged_in === true) { 

する必要があります

if (logged_in()) { 
于 2012-10-18T19:23:56.197 に答える
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);
}

それがあなたの問題を解決するのに役立つことを願っています。

于 2012-10-22T06:01:35.057 に答える
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>
于 2012-10-25T08:28:38.863 に答える
0

PHP で大規模なコード ベースを作成した経験から、アプリケーションを拡張すると、users テーブルのあらゆる場所でますます多くのデータを使用していることがわかります。また、テーブルには、一般的に使用される最も重要なデータのみを実際に含める必要があり、すぐにボトルネックになる可能性があるため、ページ ヒットごとに users テーブルに 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>';

PS また、上記のクエリの LIMIT 1 は、1 つの結果が見つかった後に検索を停止できることを mysql に伝えるため、SQL クエリで LIMIT の使用を開始することもできます。また、その列にインデックス (できればプライマリ インデックスまたは一意のインデックス) が必要です。 )それを高速に保つために(または少なくとも最初は >< )。

于 2012-10-25T21:07:14.257 に答える
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>

私もその答えを知りたいので、これが解決するかどうか教えてください

于 2012-10-22T06:48:12.747 に答える
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);
        }
}

 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>
于 2012-10-25T09:09:27.423 に答える