-1

すべてをインラインで記述するのではなく、関数の記述を始めたばかりです。これは、再利用可能な関数が通常どのように記述されるかですか?

function test_user($user) {
$conn = get_db_conn();
$res = mysql_query("SELECT * FROM users WHERE uid = $user");
$row = mysql_fetch_assoc($res);
if (count($row) == 1) {
return true;
}
else {
    return false;
}
}

誰かがログインすると、私はそのユーザーの UID を持っています。それがすでにDBにあるかどうかを確認したい。その基本的なロジックは、

「あるなら設定を表示、!あるならサインアップボックスを表示」といった流れ。明らかに、それはコードの残りの部分でどのように使用されるかに依存しますが、これは宣伝どおりに機能し、落とし穴に陥っていますか? ありがとう!

4

5 に答える 5

1

これを試して:

$conn = get_db_conn(); # should reuse a connection if it exists

# Have MySQL count the rows, instead of fetching a list (also prevent injection)
$res = mysql_query(sprintf("SELECT COUNT(*) FROM users WHERE uid=%d", $user));

# if the query fails
if (!$res) return false;

# explode the result
list($count) = mysql_fetch_row($res);
return ($count === '1');

考え:

  • return false はユーザーがまだ存在しないことを意味するため、失敗したクエリの処理を改善する必要があります。

  • データベースを使用してカウントすると、より高速になります。

  • uidは sprintf ステートメントの整数であると想定しています。これで、ユーザー入力に対して安全になりました。

  • ように見えるifステートメントがある場合は、if (something) { true } else { false }それを折りたたむ必要がありますreturn something

HTH

于 2009-07-16T23:27:24.127 に答える
0

それは再利用可能です、はい。SQL を PHP コード自体から移動することを検討することをお勧めします。

必ずしも最適化を求めているわけではありませんが、ユーザーの表示設定 (DB に保存されていると想定しています) を照会し、空に戻った場合はサインアップ ボックスを表示することを検討してください。データベースへの旅行を保存しますが、トラフィックによっては、それが膨大になる可能性があります。この実装を維持する場合は、SELECT でデータベースから 1 つの列のみを選択することをお勧めします。データを気にしない限り、すべての列をフェッチする理由はありません。

于 2009-07-16T23:25:55.707 に答える
0

まずはお電話が必要です

$user = mysql_real_escape_string($user);

コードに sql インジェクションのバグがあるため、マニュアルを参照してください。次に、クエリを次のように変更することで、ロジックを簡素化できます。

SELECT COUNT(1) FROM user WHERE uid = $user;

からの単一の戻り値を評価できるようにするだけです$row。最後に、php の基本を理解したら、php フレームワークを見てみましょう。それらは問題を引き起こす可能性があり、良いコードを書けるわけではありませんが、おそらく多くの作業を節約できます。

于 2009-07-16T23:28:05.997 に答える
0

インデント!全体的には悪くないように見えます...コメントを確認してください..

function test_user($user)
{
   $conn = get_db_conn(); //this should be done only once. Maybe somewhere else...?
   $res = mysql_query("SELECT uid FROM users WHERE uid = $user");
   $row = mysql_fetch_assoc($res);
     //I can't remember...can you return count($row) and have that forced to boolean ala C? It would reduce lines of code and make it easier to read.
   if (count($row) == 1) {
      return true;
   }
   else {
      return false;
   }
}
于 2009-07-16T23:30:40.923 に答える
0

また、

if (condition) {
    return true;
}
else {
    return false;
}

次のように書き換えることができます。

return condition;

これにより、入力と読み取りが大幅に節約されます:)

于 2009-07-16T23:31:01.483 に答える