0

私がやろうとしているのは、ログイン後、アクセスレベルに基づいて、さまざまなランディングページをセットアップすることです。もちろん、PHPとMySQLについて話している:)

users テーブルを持つデータベースがあり、users テーブルには基本的に 3 つのフィールドがあります。

user,pass,access

そして私は2つの基本アクセスレベルを持っています:

(1=user, 5=admin)

ここでもオンラインでいくつかの例を見つけましたが、何らかの理由でそれを機能させることができませんでした。ここで私が得たもの:

login.php

<form id="form" name="form" method="POST" action="login_engine.php">
<p>Please enter your login information:</p>
<label>User</label><input type="text" name="Username" id="Username" />
<label>Password</label><input type="password" name="Password" id="Password" />
<input name="submit" type="submit" id="submit" value="Login">
</form>

これがエンジンです:

<?php
include "connect.php";

// username and password sent from form
$MyUsername = $_POST['Username'];
$MyPassword = $_POST['Password'];


$sql="SELECT * FROM tbl_users WHERE user=$MyUsername and pass=$MyPassword";
$result=mysql_query($sql);

$count=mysql_num_rows($result);

if($count===1){
  // Register $myusername, $mypassword and redirect to file "home.php"
  session_register("user");
  session_register("pass");
  while($row = mysql_fetch_array($result))
  {
    if($row['access']=='5')
    {
      header("home1.php");
    }
    else
    {
      header("home2.php");
    }
  }
} else {
  echo "Invalid! Please try again PC.";
  echo "<br>";
  echo $_POST['Username'];
  echo "<br>";
  echo $MyUsername;
  echo "<br>";
  echo $_POST['Password'];
  echo "<br>";
  echo $MyPassword;
  echo "<br>";
  echo $sql;
  echo "<br>";
  echo $result;
  echo "<br>";
  echo $count;
}

//mysql_close();
?>

これは出力です:

Invalid! Please try again PC.
userdemo
userdemo
mypassword
mypassword
SELECT * FROM tbl_users WHERE user=userdemo and pass=mypassword

何かが間違っていることを示す最初の兆候は、変数 $result と $count がエラー メッセージに出力されていないことです (その後、いくつかのメッセージを表示していましたが、コードを大幅に変更したため、何をしたかを見失い、表示を停止しました情報ですが、$result は "... #4" のように表示され、$count は "0" と表示されていたことを覚えています。)

PHPスクリプトの最後に行くので、何かが間違っていることを理解しています.最後のelseですが、$sql正しいようです(ここで間違っている可能性があります)。

ここで何が間違っているのか誰にも分かりますか?

4

3 に答える 3

0

一重引用符は正常に機能するはずですが、代わりに次を試すことができます。

<?php
include "connect.php";

if (!empty($_POST)) {
    // username and password sent from form
    $MyUsername = mysql_real_escape_string($_POST['Username']);
    $MyPassword = mysql_real_escape_string($_POST['Password']);

    $sql = "SELECT * FROM tbl_users WHERE user='" . $MyUsername . "' AND pass='" . $MyPassword . "'";
    $result = mysql_query($sql) or die(mysql_error());
    $count = mysql_num_rows($result);

    if ($count) {
        // Register $myusername, $mypassword and redirect to file "home.php"
        session_register("user");
        session_register("pass");
        while ($row = mysql_fetch_array($result)) {
            if ($row['access'] == '5') {
                header("home1.php");
            } else {
                header("home2.php");
            }
        }
    } else {
        echo "Invalid! Please try again PC.";
        echo "<br>";
        echo $_POST['Username'];
        echo "<br>";
        echo $MyUsername;
        echo "<br>";
        echo $_POST['Password'];
        echo "<br>";
        echo $MyPassword;
        echo "<br>";
        echo $sql;
        echo "<br>";
        echo $result;
        echo "<br>";
        echo $count;
    }
}
//mysql_close();
?>

クエリを 1 つの結果に制限してから、while ループを取り除くことも検討する必要があります。変数にも追加mysql_real_escape_string()しました。$_POST

于 2012-12-08T06:29:12.940 に答える
0

文字列を引用符で囲みます。

SELECT * FROM tbl_users WHERE user=userdemo and pass=mypassword

それを次のように置き換えます。

SELECT * FROM tbl_users WHERE user='userdemo' and pass='mypassword'
于 2012-12-08T05:29:07.740 に答える
0

現在のコードは常に行数を 0 として返す必要があります。これは、すべての文字列が SQL ステートメントに入力されるためです。交換

 
  $sql="SELECT * FROM tbl_users WHERE user=$MyUsername and pass=$MyPassword";
 

 
  $sql="SELECT * FROM tbl_users WHERE user='$MyUsername' and pass='$MyPassword'";
 

これにより、ユーザー入力またはパス入力のいずれかにアポストロフィが含まれていない限り、差し迫った問題の一部が解決されます。その場合、振り出しに戻ります。
使用する

 
   $MyUsername = mysql_real_escape_string($MyUsername);
   $MyPassword = mysql_real_escape_string($MyPassword);
 

私の最初のコードがその問題を解決する前に。
これはあなたの質問に答え、現在の問題を解決します。

はるかに重要なこと

まずmysql減価償却されました。新しいプロジェクトでの使用をやめ、既存のプロジェクトをMySQLiまたはPDOに変換してください。
第二に、そのコードは非常に安全ではありません。SQL インジェクションが原因でデータが消去される可能性があります。最初のポイントで提案された方法を使用して、より安全にします。

これが役に立てば幸いです...まったく。

于 2012-12-08T06:55:23.007 に答える