0

ログインフォームに少し問題があります。コードが古いmysqlコードだった場合、ログインは正しく機能しましたが、mysqliに変更したため、正しく機能しなかったため、問題はmysqliコードだと思います。

ユーザーがログインフォームにユーザー名とパスワードを入力し、[ログイン]ボタンをクリックすると、ユーザー名とパスワードが正しいかどうかがデータベースにチェックインされます。正しい場合はmenu.phpページに移動し、ログインが正しくない場合は、ログインが正しくないことを示すメッセージを表示して、再試行してください。

代わりに、以下のコードは、ユーザーがユーザー名とパスワードを入力して[ログイン]ボタンをクリックすると、ユーザー名とパスワードが正しいかどうかに関係なく、からを更新するだけで、メニューに移動しません。 phpページまたはログインの間違ったメッセージを表示します。

だから私の質問は、なぜこれが起こっているのか、ログインした後、ユーザーをナビゲートしたり、間違ったログインメッセージを表示したりしないのはなぜですか?

現在のコードを表示するようにコードが更新されました:

<?php

ini_set('display_errors',1); 
 error_reporting(E_ALL);

    // PHP code
    session_start(); 

    $username="xxx";
    $password="xxx";
    $database="mobile_app";

    $mysqli = new mysqli("localhost", $username, $password, $database)or die( "Unable to select database");

    foreach (array('teacherusername','teacherpassword') as $varname) {
            $$varname = (isset($_POST[$varname])) ? $_POST[$varname] : '';
          }

    // move this outside the condiitonal
    $loged = false;

    if (isset($_POST['submit'])) {

    $query = $mysqli->prepare("
    SELECT * FROM Teacher t  
    WHERE 
    (t.TeacherUsername=?)
    AND
    (t.TeacherPassword=?)
    ");

   $stmt=$mysqli->prepare($query);
   $stmt->bind_param("s",$teacherusername);
   $stmt->bind_param("s",$teacherpassword);

   $stmt->execute(); 

   $stmt->bind_result($TeacherId,$TeacherForename,$TeacherSurname,$TeacherUsername,$TeacherPassword);

    while($row=$stmt->fetch())
      {

          if ($_POST['teacherusername'] == ($row['TeacherUsername']) && $_POST['teacherpassword'] == ($row['TeacherPassword']))
          {
              $loged = true;
          }

$_SESSION['teacherforename'] = $row['TeacherForename'];
$_SESSION['teachersurname'] = $row['TeacherSurname'];
$_SESSION['teacherusername'] = $row['TeacherUsername'];

      }

      if ($loged == true){
      header( 'Location: menu.php' ) ;
    }
    }

     ?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Teacher Login </title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" type="text/css" href="LoginStyle.css">
</head>
<body>
<?php if ($loged == false && $_POST) {
  echo "The Username or Password that you Entered is not Valid. Try Entering it Again.";
  }
?>
<form action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>" method="post" id="teachLoginForm">        
    <p>Username</p><p><input type="text" name="teacherusername" /></p>      <!-- Enter Teacher Username-->
    <p>Password</p><p><input type="password" name="teacherpassword" /></p>  <!-- Enter Teacher Password--> 
    <p><input id="loginSubmit" type="submit" value="Login" name="submit" /></p>
    </form>

</body>
</html>

アップデート:

エラー報告をオンにし、回答の1つから取得した上記のコードを使用すると、以下の警告と致命的なエラーが発生します。

Warning: mysqli::prepare() expects parameter 1 to be string, object given in /web/stud/xxx/Mobile_app/teacherlogin.php on line 33

Fatal error: Call to a member function bind_param() on a non-object in /web/stud/xxx/Mobile_app/teacherlogin.php on line 34

これらはどういう意味ですか、そして誰かがそれらを修正する方法について何かアイデアを持っていますか?上記のコードを更新して、現在のコードを表示しました。

4

2 に答える 2

1

更新/編集:

あなたのコメントに続いて、私はあなたのmysqliコードをもう一度見て、あなたが犯した多くの間違いに気づきました(複数のprepareとbind_resultステートメントと他のいくつかのこと)。以下のコードを更新しました。これにより、いくつかの改善が行われ、問題が解決するはずです。データベーススキーマについてはよくわかりませんでしたが、将来別の列を追加してコードを更新しないかのように(*)を使用するよりも、実際に必要な列を指定する方が常に適切です。 bind_resultとしてのmysqliステートメントはクエリと一致しません。

<?php
  // PHP code
  session_start(); 

  $username="xxx";
  $password="xxx";
  $database="mobile_app";

  $mysqli = new mysqli("localhost", $username, $password, $database);

  /* check connection */
  if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    die();
  }

  // required variables (make them explciit no need for foreach loop)
  $teacherusername = (isset($_POST['teacherusername'])) ? $_POST['teacherusername'] : '';
  $teacherpassword = (isset($_POST['teacherpassword'])) ? $_POST['teacherpassword'] : '';
  $loggedIn = false;

  if (isset($_POST['submit'])) {

    // don't use $mysqli->prepare here
    $query = "SELECT * FROM Teacher WHERE TeacherUsername = ? AND TeacherPassword = ? LIMIT 1";
    // prepare query
    $stmt=$mysqli->prepare($query);
    // You only need to call bind_param once
    $stmt->bind_param("ss",$teacherusername,$teacherpassword);
    // execute query
    $stmt->execute(); 
    // get result and assign variables (prefix with db)
    $stmt->bind_result($dbTeacherId,$dbTeacherForename,$dbTeacherSurname,$dbTeacherUsername,$dbTeacherPassword);

    while($stmt->fetch()) {
      if ($teacherusername == $dbTeacherUsername && $teacherpassword == $dbTeacherPassword) {
        $loggedIn = true;
      }
    }

    /* close statement */
    $stmt->close();

    /* close connection */
    $mysqli->close();

    if ($loggedIn == true){
      // left your session code as is - but think wisely about using
      // the Username as a session variable (security risk)
      $_SESSION['teacherforename'] = $dbTeacherForename;
      $_SESSION['teachersurname'] = $dbTeacherSurname;
      $_SESSION['teacherusername'] = $dbTeacherUsername;
      header( 'Location: menu.php' ) ;
      die();
    }
  }
?>
<html>
<head></head>
<body>
  <?php if ($loggedIn == false && $_POST) {
    echo "The Username or Password that you Entered is not Valid. Try Entering it Again.";
    }
  ?>
  <form action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>" method="post" id="teachLoginForm">        
  <p>Username</p><p><input type="text" name="teacherusername" /></p>      <!-- Enter Teacher Username-->
  <p>Password</p><p><input type="password" name="teacherpassword" /></p>  <!-- Enter Teacher Password--> 
  <p><input id="loginSubmit" type="submit" value="Login" name="submit" /></p>
  </form>
</body>
</html>

更新/編集: 注意するために、私はあなたのコードのほとんどを書き直したので、意味がなくなったのでこのテキストを変更しました。上記が機能しない場合(まだmysqliエラーが発生する場合など)は、Teacherテーブルに5つを超える列があることを意味します。

重要な参考までに、$mysqli->prepareステートメントと$stmt->bind_resultステートメントの間の接続があります。これらは、選択された列の数に関して一致する必要があります。bind_resultで変数に任意の名前を付けることができますが、変数の数はSELECTステートメントで選択した列の数と一致する必要があるため、列に明示的に名前を付ける方が常に(*)よりも優れています。

于 2012-06-11T19:30:30.523 に答える
0

HTMLを移動する必要があります。htmlの後に入力フォームのIFがあります。以下のように、HTMLをelseに追加します。

session_start(); 

$username="xxx";
$password="xxx";
$database="mobile_app";

$mysqli = new mysqli("localhost", $username, $password, $database)or die( "Unable to select database");

foreach (array('teacherusername','teacherpassword') as $varname) {
        $$varname = (isset($_POST[$varname])) ? $_POST[$varname] : '';
      }

if (isset($_POST['submit'])) {

$query = $mysqli->prepare("
SELECT * FROM Teacher t  
WHERE 
(t.TeacherUsername=?)
AND
(t.TeacherPassword=?)
");

$loged = false;

$stmt=$mysqli->prepare($query);
$stmt->bind_param("s",$teacherusername);
$stmt->bind_param("s",$teacherpassword);

$stmt->execute(); 



$stmt->bind_result($TeacherId,$TeacherForename,
                    $TeacherSurname,$TeacherUsername,$TeacherPassword);

while($row=$stmt->fetch())
  {

      if ($_POST['teacherusername'] == ($row['TeacherUsername']) && $_POST['teacherpassword'] == ($row['TeacherPassword']))
      {
          $loged = true;
      }

   $_SESSION['teacherforename'] = $row['TeacherForename'];
   $_SESSION['teachersurname'] = $row['TeacherSurname'];
   $_SESSION['teacherusername'] = $row['TeacherUsername'];

  }

  if ($loged == true){
  header( 'Location: menu.php' ) ;
}else{
  echo "The Username or Password that you Entered is not Valid. Try Entering it Again.";
}


}else{
?>
<form action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>" method="post" id="teachLoginForm">        
<p>Username</p><p><input type="text" name="teacherusername" /></p>      <!-- Enter Teacher Username-->
<p>Password</p><p><input type="password" name="teacherpassword" /></p>  <!-- Enter Teacher Password--> 
<p><input id="loginSubmit" type="submit" value="Login" name="submit" /></p>
</form>
<?php
}
 ?>
于 2012-06-11T16:18:17.183 に答える