3

大量のデータを取得する最も速い方法(ゴルフを考える)と、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インジェクションが発生することはありません。

4

10 に答える 10

1

最も効率的:

$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'];

データは配列の名前です-usernameは配列フィールドです..そのフィールドの値を保持します。

編集:いくつかの構文エラーを修正しました:Pしかし、あなたは考えを理解します。

于 2012-02-23T04:40:30.753 に答える
1

私はこれを思いつきましたが、うまくいくようです。

while($row = mysql_fetch_assoc($result))
 {
    $_SESSION = array_merge_recursive($_SESSION, $row);
 }
于 2008-08-25T09:05:49.067 に答える
0

OK、これはあなたの質問に答えませんが、あなたの現在のコードはあなたにSQLインジェクションを開いたままにしませんか?

私は間違っている可能性があり、PHPで作業したことはなく、SQLで文字列が使用されているのを見て、アラームベルが鳴り始めました。

編集:

私はあなたの投稿を改ざんしようとはしていません。スペルミスを修正していました。ロールバックしないでください。

于 2008-08-25T08:27:37.957 に答える
0

「大量のデータ」の意味がわかりませんが、1 人のユーザーのデータのみを初期化しているように見えますか? もしそうなら、データベースに数メガバイトのデータを含む何百もの列がない限り、これを最適化する理由はわかりません。

別の言い方をすれば、なぜこれを最適化する必要があるのでしょうか? パフォーマンスに問題がありますか?

あなたが今行っていることは単純明快なアプローチであり、具体的な問題がない限り、別の方法で行う理由がまったくわかりません。

ただし、ユーザー データをユーザー オブジェクトにラップすると、プログラムの構造が改善される場合があります。入力を検証することも、おそらく良い考えです。

于 2008-08-25T08:30:56.717 に答える
0

たとえば、json を使用してみてください。

$_SESSION['data'] = json_encode(mysql_fetch_array($result));

編集 後で変数を編集json_decodeする$_SESSION['data']と、必要なすべてのデータを含む配列が得られます。

説明:

記述するコードの行数を減らしたい場合はjson_encode、 andを使用できます。json_decode問題の例では、データベースの各列を SESSION 配列にコピーするために 1 行のコードが必要でした。50 ~ 75 行のコードを使用する代わりに、json_encodingデータベース レコード全体を 1 行ずつ文字列にすることもできます。この文字列は SESSION 変数に格納できます。その後、ユーザーが別のページにアクセスすると、SESSION 変数が JSON 文字列全体とともに存在します。名を知りたい場合は、次のコードを使用できます。

$fname = json_decode($_SESSION['data'])['fname'];

この方法は、行ごとのコピーよりも高速ではありませんが、コーディングを節約でき、データベースまたはコードの変更に対する耐性が高くなります。

ところで 、他の誰かが ] をマークダウンに入力するのに問題がありますか? 私はそれを貼り付けなければなりません。

于 2008-08-25T08:31:26.700 に答える
0

@Unkwntechあなたは正しいように見えますが、ここに導かれたGoogleに従うと、 mysql_real_escape_string()に変更したいかもしれません

編集に関しては、効率的のスペルを修正し、「とは何か」を削除しました..トピックがすべてを語っているので、それは実際には必要ないため.

質問の下部にある「1 分前に編集」というテキストをクリックすると、編集履歴 (実際の変更が強調表示されます) を確認できます。

于 2008-08-25T08:35:08.453 に答える
0

たとえば、json を使用してみてください。

$_SESSION['data'] = json_encode(mysql_fetch_array($result));

その機能の実装は、彼がすでに行っていることよりも高速ですか?

] をマークダウンに入力するのに問題がある人はいますか? 私はそれを貼り付けなければなりません

はい、バグっています。

于 2008-08-25T08:35:34.757 に答える
0
@Anders - 50〜75列のようなものがあります。

繰り返しますが、これが実際にアプリケーションのパフォーマンスの問題を引き起こしている場合を除き、私はわざわざ最適化するつもりはありません。ただし、パフォーマンスが問題になる場合は、最初に一部のデータのみを取得し、必要に応じて他の列を遅延読み込みすることを検討します。

于 2008-08-25T08:38:20.223 に答える
0
パフォーマンスの問題を引き起こすほどではありませんが、コードをもう少しきれいにしたいと思います。

次に、ユーザー データをクラスにラップします。$_SESSION を直接変更すると、やや汚く見えます。データをディクショナリに保持したい場合は、別のクラスに入れても実行できます。

すべての列を反復処理し、それらの名前を取得して、データを同じキー名でマップにコピーするループを実装することもできます。そうすれば、ディクショナリのキーによって名前が付けられた内部変数とデータベースの列名は常に同じになります。(これには、データベース内の列名を変更するときに変数名を変更するという欠点もありますが、これは非常に一般的で広く受け入れられているトレードオフです。)

于 2008-08-25T08:47:46.240 に答える
0

Unkwntech の提案が実際に機能する場合SELECTは、パスワード列がそれらのフィールドの 1 つになるため、すべてを取得しないようにステートメントを変更することをお勧めします。

このようなものをセッションに保持する必要があるかどうかについては、なぜですか? ユーザーがログインしたときに DB をチェックする場合 (そうなると思いますよね?) いずれにせよ、計画している場合は、かなり機密性の低い情報 (名前など) をセッションに保存することをお勧めします。その人の訪問中にその情報を使用することについて。

于 2008-08-25T10:23:55.680 に答える