1

Netbeans を使用して PHP で登録/ログイン フォームを作成しています。これを実装するために、ログイン、登録、およびデータベース接続機能を scripts.php ファイルに入れ、インクルード コールを介してロードします。

さて、私のログイン機能はこれを使用します

$username = mysql_real_escape_string($_POST['username']);
$password = sha1(mysql_real_escape_string($_POST['password']));
$query = sprintf("SELECT * FROM users WHERE username='%s' AND password='%s'", $username, $password);

$link = connectDB();

$results = mysqli_query($link, $query);

データベースに接続して結果を取得します。検証は後で行われます。

私の登録ロジックでは、ほぼ同じものを使用しています。

$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']);

//check if user name and password match conditions
$link = connectDB();
$query = "SELECT * FROM users WHERE username = '" . $username . "'";
$results = mysqli_query($link, $query);

登録ページは正常に読み込まれますが、ログイン ページには、ログイン機能に未定義のインデックス「username」があることを示すエラー テキストが出力されます。これは、ページが読み込まれるときに発生し、関数は呼び出されていません。

しかし、登録機能ではほぼ同じレイアウトでエラーにはなりません。

なぜこれが起こっているのですか?

編集

問題が見つかりました。

を使用してデータベース接続を開いていましmysqli_connectたが、mysql-real_escape_string関数を使用していました。この 2 つは互換性がなく、追加するとiまったく別物になります。

4

1 に答える 1

2

あなたの質問に関連しているかもしれないし、関連していないかもしれませんが、私が見逃すことのできないいくつかのポイント:

  1. 文字列の SQL エスケープは、常に最後に行われます。文字列を SQL エスケープしないでくださいsha1The Great Escapismを参照して、エスケープとは何かを学びましょう。
  2. を使用する場合mysql_real_escape_string、この関数を呼び出す前にデータベースに接続する必要があります。これは、ジョブを実行するためにデータベース接続を確立する必要があるためです。
  3. mysql と mysqli 拡張機能を混在させています。両方の機能ではなく、どちらか一方を使用してください。
  4. mysqli を使用している場合 (そうするべきです!)、手動で文字列と を SQL エスケープする代わりに、準備済みステートメントsprintfを使用してください。

言い換えれば、現在、あなたはそれを完全に間違っています。それらを最初に修正すると、問題が解決する場合があります。

于 2012-05-25T01:25:26.750 に答える