2

データベースの各列名を独自の $_SESSION に格納しようとしています。たとえば、列名が column_one、column_two、column_three、column_four、および column_five であるとします。これらを $_SESSION['column_one']、$_SESSION['column_two'] などの $_SESSION に格納したいのですが、これをループで実行しようとしていますが、成功していません。これを達成するためにループをどのように設定しますか?

$query = "SELECT * FROM table WHERE user_id = $id";
$result = mysqli_query($dbc, $query);
$num = mysqli_num_rows($result);

if ($num == 1) {

    //User was found
    while($row = mysqli_fetch_array($result, MYSQLI_BOTH)) {
        $_SESSION['user_id'] = $row['user_id'];
    }

}
4

3 に答える 3

3

これを試していただけますか:

$id = mysqli_real_escape_string($dbc,$id);
$query = "SELECT * FROM table WHERE user_id = $id";
$result = mysqli_query($dbc, $query);
$num= mysqli_num_rows(result);
if ($num == 1) {
    $row = mysqli_fetch_assoc($result);
    $_SESSION['UserData'] = $row;
}else{
//handle error or user not found
}

echo '<pre>';
print_r($_SESSION['UserData']);
echo '</pre>';

while や別のループを使用する必要がないため、1 行だけです。

于 2013-08-10T01:15:34.343 に答える
2

このようなものが動作するはずです:

while($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
    foreach($row as $column => $value) {
        $_SESSION[$column] = $value;
    }
}

SQL インジェクションから保護するための追加のアドバイス、次の 2 行:

$id = mysqli_real_escape_string($dbc, $id);
$query = "SELECT * FROM table WHERE user_id = '$id'";

アップデート:

に欠落している接続パラメーターを指摘してくれた EmilioGort に感謝しますmysqli_real_escape_stringmysqli_real_escape_stringドキュメントを参照してください。

于 2013-08-10T01:15:12.080 に答える
0

他の回答では方法が提案されていましたが、私はこれをまったく行わないことを強く提案します。なんで?

まず第一に、$row明確に定義された配列形式でユーザーのすべての詳細が含まれています。一般に、この構造を十分に準備しておくことをお勧めします。

さらに重要: $row を平坦化すると、次のように名前の競合が発生する可能性があります。

にプロパティ$rowがあり、userName最終的に設定するアプリケーションの他の場所があるとします

$_SESSION[ 'userName' ] = $newUserName;

への新しい割り当てにより、ログイン プロセス中に保存されたプロパティ$_SESSION[ 'userName' ] が意図せず変更される可能性があります。

「今、私のコードは ' で userName を使用していません$_SESSION。そうです!残念ながら、この名前だけを何ヶ月も後に別の何かに使用する可能性があります...

より良い解決策

次のようにユーザーの詳細を保存します。

$_SESSION[ 'sys$userDetails' ] = $row;

プレフィックスsys$は、フレームワークによって生成されたセッションのプロパティの指標であると想像してください。

したがって、ビジネス ロジックに関連するセッション データにはsys$プレフィックスを付けないでください。

于 2013-08-10T01:47:47.683 に答える