データベースからセッションにデータを取得する最も効率的な方法
質問
大量のデータを取得するための最も迅速な方法 (ゴルフを考えてください) と、既に行っていることを続行せずに MySQL データベースからセッションに大量のデータを取得するための最も効率的な方法 (パフォーマンスを考えてください) は何ですか:
$sql = "SELECT * FROM users WHERE username='" . mysql_escape_string($_POST['username']) . "' AND password='" . mysql_escape_string(md5($_POST['password'])) . "'";
$result = mysql_query($sql, $link) or die("There was an error while trying to get your information.\n<!--\n" . mysql_error($link) . "\n-->");
if(mysql_num_rows($result) < 1)
{
$_SESSION['username'] = $_POST['username'];
redirect('index.php?p=signup');
}
$_SESSION['id'] = mysql_result($result, '0', 'id');
$_SESSION['fName'] = mysql_result($result, '0', 'fName');
$_SESSION['lName'] = mysql_result($result, '0', 'lName');
...
そして、誰かが「はい」と尋ねる前に、本当に「選択」する必要があります
編集:はい、コードのさらに上の部分で SQL インジェクションが行われないようにデータをサニタイズしています。
解決
私はこれを思いつきました、そしてそれはうまくいくようです。
while($row = mysql_fetch_assoc($result))
{
$_SESSION = array_merge_recursive($_SESSION, $row);
}
他のヒント
最も効率的:
$get = mysql_query("SELECT * FROM table_name WHERE field_name=$something") or die(mysql_error());
$_SESSION['data'] = mysql_fetch_assoc($get);
終わり。
これは配列に格納されるようになりました。したがって、フィールドがユーザー名であるとします。次のようにします。
echo $_SESSION['data']['username'];
データは配列の名前です - ユーザー名は配列フィールドです。そのフィールドの値を保持します。
編集:いくつかの構文の間違いを修正しました:P しかし、アイデアはわかります。
これでは質問の答えにはなりませんが、現在のコードでは SQL インジェクションが行われる可能性がありませんか?
私は間違っている可能性があります。PHP で働いたことはなく、SQL で文字列が使用されているのを見て警鐘が鳴り始めました。
編集:
私はあなたの投稿を改ざんしようとしているわけではありません。スペルミスを修正しているだけです。ロールバックしないでください。
「大量のデータ」が何を意味するのかわかりませんが、1人のユーザーのデータのみを初期化しているように見えますか?もしそうなら、データベース内に数メガバイトのデータを含む数百の列がない限り、これを最適化する理由はありません。
別の言い方をすると、なぜこれを最適化する必要があるのでしょうか?パフォーマンス上の問題がありますか?
あなたが現在行っていることは単純なアプローチであり、特別な問題がない限り、別の方法で行う理由は見当たりません。
ただし、ユーザー データをユーザー オブジェクトにラップすると、プログラム構造に多少は役立つかもしれません。入力を検証することもおそらく良い考えです。
@unkwntechはあなたが正しいように見えますが、Googleに続いて導きました ここ に変更したいようです mysql_real_escape_string()
編集として、スペルを修正しました 効率的 また、「とは何か」も削除されました。トピックがすべてを物語っているので、それは実際には必要ありません。
をクリックすると、編集履歴 (実際の変更がわかりやすく強調表示されます) を確認できます。 「1分前に編集しました」 質問の下部にあるテキスト。
たとえば、json を使用してみてください。
$_SESSION['data'] = json_encode(mysql_fetch_array($result));
その関数の実装は、彼がすでに行っていることよりも速いですか?
] をマークダウンに入力するのに苦労している人はいますか?それを貼り付けなければなりません
はい、バグっています。
@Anders - 50〜75列ほどあります。
繰り返しますが、これが実際にアプリケーションのパフォーマンス上の問題を引き起こしていない限り、私はアプリケーションの最適化を気にしません。ただし、パフォーマンスが問題になる場合は、最初にデータの一部のみを取得し、必要に応じて他の列を遅延ロードすることを検討します。
Unkwntech の提案が実際に機能する場合は、設定を変更することをお勧めします。 SELECT
パスワード列はそれらのフィールドの 1 つになるため、すべてを取得しないようにステートメントを作成します。
この内容をセッション内に保持する必要があるかどうかについては、なぜ保持しないのですか?ユーザーがログインするときに DB をチェックするつもりなら (そのときに行われると思いますが、違いますか?) とにかく、計画が立てられれば、かなり機密性の低い情報 (名前など) をセッションに保存したほうがよいでしょう。その人の訪問中にその情報を使用することについて。
パフォーマンス上の問題を引き起こすほどではありませんが、コードをもう少しきれいに見せたいと思っています。
次に、ユーザー データをクラスでラップします。$_SESSION を直接変更すると、少々汚く見えます。データを辞書に保存したい場合は、データを別のクラスに置いた場合でも可能です。
すべての列を反復処理してその名前を取得し、同じキー名を持つマップにデータをコピーするループを実装することもできます。そうすれば、辞書内のキーによって名前が付けられた内部変数とデータベースの列名が常に同じになります。(これには、データベース内の列名を変更すると変数名も変更されるという欠点もありますが、これは非常に一般的でよく受け入れられているトレードオフです。)
たとえば、json を使用してみてください。
$_SESSION['data'] = json_encode(mysql_fetch_array($result));
編集後であなたは json_decode
の $_SESSION['data']
変数を使用すると、必要なすべてのデータを含む配列が得られます。
説明:
使用できます json_encode
そして json_decode
作成するコードの行数を減らしたい場合。質問の例では、データベース内の各列を SESSION 配列にコピーするために 1 行のコードが必要でした。50 ~ 75 行のコードで実行する代わりに、1 byte で実行できます。 json_encoding
データベースレコード全体を文字列に変換します。この文字列は SESSION 変数に保存できます。その後、ユーザーが別のページにアクセスすると、SESSION 変数が JSON 文字列全体とともに存在します。名前を知りたい場合は、次のコードを使用できます。
$fname = json_decode($_SESSION['data'])['fname'];
この方法は 1 行ずつコピーするよりも高速ではありませんが、コーディングを節約でき、データベースやコードの変更に対する耐性が高くなります。
ところで] をマークダウンに入力するのに苦労している人はいますか?それを貼り付けなければなりません。