2012-03-21 2 views
0

私はここで間違っていますか?それは理由を与えずにDatabase Count Failed(Process.phpの$ count行にある)です。私は私達のそのラインの一部を「か死ぬか」を取るとき、それは常に私が押され、それが実際にアカウントを作成していないボタンに関係なく、「作成したユーザーアカウント」が表示さ...ログインPHPエラー

Form.php

<html> 
<head> 
<title>Forms</title> 
<link rel="stylesheet" href="http://code.jquery.com/mobile/1.1.0-rc.1/jquery.mobile-1.1.0-rc.1.min.css" /> 
<script src="http://code.jquery.com/jquery-1.7.1.min.js"></script> 
<script src="http://code.jquery.com/mobile/1.1.0-rc.1/jquery.mobile-1.1.0-rc.1.min.js"></script> 
</head> 
<body> 
    <form action="process.php" method="post"> 
     <label for="username">Email: </label> 
     <input type="email" name="username" value="" id="username"/> 
     <br/> 
     <label for="password">Password: </label> 
     <input type="password" name="password" value="" id="password"/> 
     <br/> 
     <input type="submit" name="submit" value="Sign in"/> 
     <input type="submit" name="submit" value="Sign up"/> 
    </form> 
</body> 
</html> 

Process.php

<?php 
    //1. Create a database connection 
    $connection = mysql_connect("localhost","web","1234") or die("Database connection failed: " . mysql_error()); 

    //2. Select a database to use 
    $db_select = mysql_select_db("tongue", $connection) or die("Database selection failed: " .mysql_error()); 
?> 
<html> 
<head> 
<title>Form processing</title> 
<link rel="stylesheet" href="http://code.jquery.com/mobile/1.1.0-rc.1/jquery.mobile-1.1.0-rc.1.min.css" /> 
<script src="http://code.jquery.com/jquery-1.7.1.min.js"></script> 
<script src="http://code.jquery.com/mobile/1.1.0-rc.1/jquery.mobile-1.1.0-rc.1.min.js"></script> 
</head> 
<body> 
    <?php 
     $username = $_POST['username']; 
     $password = trim($_POST['password']); 
     $hashed_password = sha1($password); 

     $action = $_POST['submit']; 

    //3. Select email, password from database 
     $query = " 
       SELECT email, password FROM user 
       WHERE email='$username' AND password='$hashed_password'"; 
     $user = mysql_query($query, $connection) 
      or die ("Database query failed: ".mysql_error()); 

     $count = mysql_num_rows($user) or die ("Database count failed: ".mysql_error()); 

    //4. Authenticate user 
     if ($count == 1) { 
      if($action="Sign up"){ 
       echo "User already exists"; 
      } else if ($action="Sign in"){ 
       echo "User signed in"; 
      }; 
     } else if ($count == 0){ 
      if($action="Sign up"){ 
      $query = " 
       INSERT INTO users (email, password) 
       VALUES ('$username', '$hashed_password')"; 
      $signup = mysql_query($query, $connection); 
      echo "User account created"; 
      } else if ($action ="Sign in"){ 
       echo "Username and/or password incorrect"; 
      }; 
     }; 


    ?> 
</body> 
</html> 
+0

)はポイント(あなたのコードのダイを持つがありません、あなたが処理するために行く合法的な状態であり、 $ countが0の場合、そこにありますか? –

答えて

0

は、この例を実行してみてください:

$a = 0 OR die('foobar'); 
var_dump($a); 

あなたはOR die()値はconsidered falseある任意の時間に実行されることが、わかります。

あなたのコードはかなり悪いです。

  • スクリプトは、あなたがより多く、10歳mysql_* APIを使用しているSQLインジェクション
  • に開放され、新しく作成されたコードでは使用すべきではありません。代わりに、PDOまたはMySQLiのいずれかを使用することを学ぶ必要があります。
  • それはあなたがすでに独自のユーザ名欄
  • を持っている場合、これはあなたが事前に人々に伝えることなく、新しいアカウントを作成しないでください、あなたのパスワード
  • をハッシュする方法ではなく、ユーザー名とパスワードの両方によって選択することが無意味です。メールアドレスを間違えた場合はどうなりますか?

これは、私はそれを行うだろうかのようなものです:あなたが'crypt()`のマニュアルエントリを読めば、あなたは結果のハッシュがすでに含まれていることに気づくでしょう、これは、明らかに少し単純化したバージョンである

$connection = new PDO('mysql:host=hostname;dbname=tongue', 'web', '1234'); 
$connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 

$statement = $connection->prepare(' 
    SELECT 
     email, 
     hash, -- instead of password, because thats what it is 
     salt 
    FROM user 
    WHERE email = :username 
'); 
$statement->bindParam(':username', $_POST['username'], PDO::PARAM_STR, 127); 
if ($statement->execute()) 
{ 
    $data = $statement->fetch(PDO::FETCH_OBJ); 
} 

if ($data) 
{ 
    $hash = crypt($_POST['password'], '$2a$07$' . $data->salt . '$'); 
    if ($hash === $data->hash) 
    { 
     // user OK 
    } 
    else 
    { 
     // login failed 
    } 
} 
else 
{ 
    //login failed 
} 

元の塩。あなたはそれから抽出することができます。しかし、その意図はあまりにも多くの細目を追加するのではなく、ポイントを作ることでした。

if($condition_1 && $condition_2 && $condition_3)を実行すると、PHPは最初の失敗した状態でのチェックを停止するため、ログインの条件は単一のifにラップされている可能性があります。

+0

ありがとうございました。 PDO(http://www.phpro.org/tutorials/Introduction-to-PHP-PDO.html#3) –

+0

@LapMingLeeの理解に役立つこのウェブサイトを見つけました。これはhttp://wiki.hashphpでも役に立ちます。 org/PDO_Tutorial_for_MySQL_Developers –

0

このライン

$count = mysql_num_rows($user) or die ("Database count failed: ".mysql_error()); 

は死ぬとき0として$カウント== 0、希望偽と評価される。行が戻ってこない場合は、$ count == 0で中止する必要はありません。さらに、すでにクエリが正常に実行されたことを確認しているので、実際には失敗する可能性はほとんどありません。

あなたは失敗をチェックしたいならば、結果は===ではなく==の使用ではなく

$count = mysql_num_rows($user); 
    if ($count === false) 
    { 
     die ("Database count failed: ".mysql_error()); 
    } 

「falsy」注意よりも、実際に偽で確認し、これは我々がタイプと値の両方をチェックし確認してください。

0

最初に単純なSELECT * FROM userを使用して接続をテストし、要素を印刷することをお勧めします。接続がOKの場合は、SQLクエリーにエラーがある可能性があります。 $user変数にはリソースが含まれていて、そうでない場合はmysql_num_rows()が失敗します。 is_resource()を使用して、mysql_query()によって返されたオブジェクトが実際に有効であることを確認します。

0

はここで最終的なコード(おかげでたくさんの@_tereko)です:$は== 0を数えるよう

<?php 
     try{ 
     $username_signup = "[email protected]"; 
     $password_signup = "est"; 
     $hash = crypt($password_signup, '$3a$08$2'); // salt 

     $connection = new PDO ('mysql:host=localhost;dbname=tongue', 'web', '1234'); 
     $connection -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
     $connection -> setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 

     function login ($query, $connect, $user) { 
     $statement = $connect->prepare($query); 
     $statement -> bindParam(':username', $user, PDO::PARAM_STR, 127); 
     $statement -> execute(); 
     $data = $statement->fetch (PDO::FETCH_OBJ); // fetches the columns defined as $property 
     return $data; 
     } 

     function create ($query, $connect, $user, $pass) { 
     $statement = $connect->prepare($query); 
     $statement -> bindParam(':username', $user, PDO::PARAM_STR, 127); 
     $statement -> bindParam(':password', $pass, PDO::PARAM_STR, 127); 
     $statement -> execute(); 
     } 

     $sql = 'SELECT email, hash FROM user WHERE email=:username'; // must be defined before calling 

     if ($row = login ($sql, $connection, $username_signup)) { 
      echo "Account already exists!"; 
     } 
     else { 
      $sql = 'INSERT INTO user(email, hash) VALUES (:username, :password)'; 
      create($sql, $connection, $username_signup, $password_signup); 
      echo "account created"; 
     }; 


    $connection = null; 

    } catch(PDOException $e) { 
     echo $e->getMessage(); 
    } 

?>