2016-05-17 1 views
0

私は現在、私のコースの一環としてニュースサイトのログインシステムを作っています。何らかの理由でif文で$ rows-> num_rows == 1を使用すると、常に "else"コードが実行されます。基本的には、これは、入力されている正しいユーザー情報に対応するテーブルの行を検出できないことを意味します。 HTMLコードに情報が入力されたときに実行されるPHPコードを次に示します。テーブル内のNUMBER行が検出されない

<?php 
error_reporting(E_ALL); 
ini_set('display_errors', 1); 

//Connect to DB 
    include_once("db_connect.php")or die ("Couldnt connect to DB"); 
$username = $_POST['user']; 
$password = $_POST['password']; 

session_start(); 

if(trim($username) != '' and trim($password) != ''){ 

//Sanitizes whatever is entered 
    $username=stripslashes($username); 
    $password=stripslashes($password); 

    $username=strip_tags($_POST['user']); 
    $password=strip_tags($_POST['password']); 

    $username=mysqli_real_escape_string($conn,$username); 
    $password=mysqli_real_escape_string($conn,$password); 

//Checks whether Username exists   
$query = mysqli_query($conn, "SELECT * FROM user WHERE users='$username' 
AND password = '$password' ") 
or die(mysqli_error($conn)); 

$numrows=mysqli_num_rows($query); 

if($numrows > 0){ 

// echo "Record exists."; 

$_SESSION['login_user']=$username; // Initializing Session 

header("location: index.php"); // Redirecting To Other Page 
exit; 
} 

else { 
    echo "Username or password is incorrect."; 
} 
}else{ 
    echo "Please enter information"; 
} 
?> 

最後のif文で行が検出されないので問題が発生します。そして、はい、私のテーブルは1行のユーザー情報(ユーザー、パスワード)で埋められ、HTMLフォームもPOSTを使用します。

私はこの問題を少なくとも3時間は調査したが、まだ解決策を見つけることはできません。ここで

現在のエラーログです:

Warning: include_once(1): failed to open stream: No such file or directory in /home/vol9_7/byethost4.com/b4_18083024/htdocs/loginAuth.php on line 6 

Warning: include_once(): Failed opening '1' for inclusion 
(include_path='.:/usr/share/pear/') in  
/home/vol9_7/byethost4.com/b4_18083024/htdocs/loginAuth.php on line 6 

Notice: Undefined variable: conn in  
/home/vol9_7/byethost4.com/b4_18083024/htdocs/loginAuth.php on line 22 

Warning: mysqli_real_escape_string() expects parameter 1 to be mysqli, null  
given in /home/vol9_7/byethost4.com/b4_18083024/htdocs/loginAuth.php on line 
22 

Notice: Undefined variable: conn in 
/home/vol9_7/byethost4.com/b4_18083024/htdocs/loginAuth.php on line 23 

Warning: mysqli_real_escape_string() expects parameter 1 to be mysqli, null 
given in /home/vol9_7/byethost4.com/b4_18083024/htdocs/loginAuth.php on line 
23 

Notice: Undefined variable: conn in 
/home/vol9_7/byethost4.com/b4_18083024/htdocs/loginAuth.php on line 42 

Warning: mysqli_query() expects parameter 1 to be mysqli, null given in  
/home/vol9_7/byethost4.com/b4_18083024/htdocs/loginAuth.php on line 42 

Notice: Undefined variable: conn in 
/home/vol9_7/byethost4.com/b4_18083024/htdocs/loginAuth.php on line 43 

Warning: mysqli_error() expects parameter 1 to be mysqli, null given in 
/home/vol9_7/byethost4.com/b4_18083024/htdocs/loginAuth.php on line 43 

EDIT:フレッド-ii-答え​​を使用します。 include_once("db_connect.php")or die ("Couldnt connect to DB");がコードの先頭に移動しました。

第2に、新しいバージョンのif文が追加されて古いバージョンに置き換えられました。このステートメントはFred -ii- answerでも見ることができます。私は、テーブルと列 名前を混同しているので

第三に、SQLステートメントが修正されました。

最後に、error_reporting(E_ALL); ini_set('display_errors', 1); はフレッド-ii-答え​​の礼儀再び、エラーを見つけるのを助けるために追加されました。

+0

'IF($ rows-> NUM_ROWS> = 1)'旋回を与えます。重複したユーザー名に賭けているか、クエリが失敗しました。 –

+0

oh btw 'include_once(" db_connect.php ")'は間違った場所にあり、同じ名前を持つ複数のユーザ名がある場合でも私の上記のコメントがおそらく使用されるべきですが、その前にまず接続する必要がありますエスケープ関数。あなたはここで馬の前に馬車を置き、何もエラーをチェックしていません。 –

+0

データベースにレコードが重複していますか? PHP文書の最初の行にinclude_once( "db_connect.php")を移動してください –

答えて

2

以下の回答は、元の投稿https://stackoverflow.com/revisions/37284594/1に記載されています。編集としてマークしないで、コードの先頭にインクルードを2回移動し、追加編集としてマークしません。


あなたが

include_once("db_connect.php")or die ("Couldnt connect to DB"); 

それはあなたがmysqli_real_escape_string()である、DB接続を必要とする任意の関数を呼び出す前に配置する必要があり、ここで馬の前に送料を入れています。

データベースが大きくなるにつれ、同じユーザー名を持つ複数の人がいる場合は、if ($rows->num_rows >= 1)またはif ($rows->num_rows > 0)も使用する必要があります。有りうる。実際、私は昨日そのようなことを試していました。

また、各ヘッダーの後にexit;を使用してください。そうしないと、コードを実行し続けることができます。

また、クエリに対するエラーもチェックする必要があります。あなたはそれをやっていない。

これでも動作しない場合は、POST配列に対して使用している機能の一部に悪影響があり、有効な文字を取り除く可能性があります。削除する必要があるかもしれません。

準備されたステートメントを使用すると、これらのステートメントからすべて削除されます。

エラーチェック(クエリが失敗しました)。

http://php.net/manual/en/mysqli.error.phpおよびhttp://php.net/manual/en/function.error-reporting.php のリンクを参照し、コードに適用してください。


パスワード

私はまた、あなたがプレーンテキストでパスワードを保存することができることに気づきました。これはお勧めしません。

使用次のいずれか:

重要追記:

もし、あなたがpassword_hash()または互換機能パックを使用することを決定しないときhttps://github.com/ircmaxell/password_compat/(PHP < 5.5の場合)現在のパスワード列の長さが60未満の場合は、それ以上(またはそれ以上)に変更する必要があることに注意することが重要です。このマニュアルでは255の長さが推奨されています。

有効にするには、新しいハッシュを使用して列の長さを変更し、最初からやり直す必要があります。そうしないと、MySQLは自動的に失敗します。関心の

その他のリンク:


編集:

変更し、このブロック:(あなたのメソッドは、$rows->num_rowsのために失敗することができる)

$query="SELECT * FROM user WHERE users='$username' AND password = '$password'"; 
$rows = mysqli_query($conn, $query); 

if ($rows->num_rows == 1){ 

    $_SESSION['login_user']=$username; // Initializing Session 

    header("location: index.php"); // Redirecting To Other Page 
} 

へ:

$query = mysqli_query($conn, "SELECT * FROM user WHERE users='$username' AND password = '$password' ") 
or die(mysqli_error($conn)) 
; 

$numrows=mysqli_num_rows($query); 

if($numrows > 0){ 

// echo "Record exists."; 

    $_SESSION['login_user']=$username; // Initializing Session 

    header("location: index.php"); // Redirecting To Other Page 
    exit; 
} 

し、ファイルの先頭にこれを配置します。

<?php 
error_reporting(E_ALL); 
ini_set('display_errors', 1); 

// rest of your code 

NOTA:

私はSELECT * FROM user WHERE users

あなたは右を選んだことを確認し、このかかわらずに質問していますあなたはそれらを偶然逆算していないことを確認してください。

+0

あなたの最初の点に関してはそうです。 mysqli_real_escape_stringよりも上の行を移動するだけで、データベースに接続する必要があります。 –

+0

@KentGodfreyはい、それを試してください。私は今は出発しなければならないが、約1時間で戻ってくるだろう。私をつけておく。 –

+0

さて、それを行ってください。私は実際にそれを私の変数の上に置くことにしました。コードが更新されています。そして、私の問題に関しては、まだ解決されていません。時間を割いて返信して助けてくれてありがとう。また、私は非常にパスワードの暗号化を認識しています。このプロジェクトを真剣に使用することになった場合、私は100%個人データの暗号化を使用します。 1時間ほどであなたを見てください –

0

私はこの

使用あなたに別のコードを示唆:これに代えて

if ($result = mysqli_fetch_array($rows,MYSQLI_NUM)){ 

if ($rows->num_rows == 1){ 
+0

ええと、このif文を使用すると、ログインフォームは常に白いページを返します。入力していただきありがとうございます! –

+0

あなたの歓迎、私は1つを忘れる ")" if文。それを私が直した。 ;) –

+0

もう一度おねがいしますが、今回は致命的なエラーが発生しました –

関連する問題