2012-01-09 11 views
1

可能性の重複:
mysql_fetch_array() expects parameter 1 to be resource, boolean given in selectPHPログインスクリプト、PHPセキュアなログインセッション

私はまだ私のサイトのためのPHPログインスクリプトの作成に苦労しています。 Iとして読み込ま取得errosは、以下:

警告:はmysql_num_rows()は、パラメータ1は、ライン上/Applications/XAMPP/xamppfiles/htdocs/xponline/loginproc.phpで与えられたリソース、boolean型であることが期待13

警告:ヘッダー情報を変更することはできません - すでに送信されたヘッダー(/Applications/XAMPP/xamppfiles/htdocs/xponline/loginproc.php:13からの出力は/Applications/XAMPP/xamppfiles/htdocs/xponline/loginproc.php 21行目)

これは私の検証ページコードです:

行目
<?php 

// Inialize session 
session_start(); 

// Include database connection settings 
include('config.inc'); 

// Retrieve username and password from database according to user's input 
$login = mysql_query("SELECT * FROM user WHERE (\ 
    username = '" . mysql_real_escape_string($_POST['username']) . "') and \ 
    (password = '" . mysql_real_escape_string(md5($_POST['password'])) . "')"); 

// Check username and password match 
if (mysql_num_rows($login) == 1) { 
// Set username session variable 
$_SESSION['username'] = $_POST['username']; 
// Jump to secured page 
header('Location: default_1.php'); 
} 
else { 
// Jump to login page 
header('Location: index.php'); 
} 

?> 

は次のとおりです。:-(

+0

選択したクエリを印刷するとエラーが発生します。 – Bajrang

+0

1行に80文字(現代的には100文字)を超えてはいけません。ところで、あなたが質問をするたびに、あなたは答えを受け入れる必要があります:あなたの過去の質問(あなたのプロフィールを通してアクセス可能)のいくつかを見て、 。 – Hossein

+0

'$ _SESSION ['username'] = $ _POST ['username'];'注意して、これを画面に出力すると、ユーザが自分自身に ' ' – DampeS8N

答えて

0

mysql_query()は、障害発生時にFALSEを返します。助けてください

if (mysql_num_rows($login) == 1) { 

...それが起こっているようです。

0

するmysql_queryは、いくつかのケースでは、ブールの代わりに、MySQLの結果を返します。

SELECT、SHOW、DESCRIBE、EXPLAINおよび 結果セットを返す他の文の場合は、するmysql_query()が成功した場合にリソースを返し、またはFALSE on エラーです。

あなたのコードではリソースが必要ですが、クエリが失敗したためにFALSEが返されます。

初期クエリで何が問題なのかを調べるには、mysql_error()()をご覧ください。

PHPスクリプトが(MySQLクエリの場合)エラーメッセージを出力し、THENがヘッダーを書き込もうとしたことが原因です。ヘッダーを設定する前に何も出力することはできません。

0

最初の警告mysql_num_rows() expects parameter 1 to be resourceは、クエリが結果を返さなかったことを意味します。 echo $login;を開き、SQLコンソール(例:phpMyAdmin)で実行できるかどうかを確認してください。

2番目の警告Cannot modify header informationは、おそらく前の警告のために発生しています。最初の警告が何らかのテキストを出力するので、header(...)はそのような警告を出します。コードの実行中に警告とエラーが出力されない場合、headerはそのような警告を発生しません。

ところで、md5は今や簡単に割れてしまいます。セキュリティを強化するために、より安全な方法(SHA)を使用します。そして、をご記入ください。mysql_real_escape_string alone is not enough to protect agains SQL injections

1

まず、PHPコードをデバッグするときは、いつも報告された順にエラーを解決しようとします。

だから、最初の1のために開始します。

警告:はmysql_num_rows()パラメータ1がリソースであることを期待、で指定したboolean ...ライン上で...

明らか

mysql_num_rowsに渡される最初のパラメータ(値$login)はブール値であり、リソースではありませんでした。だから、$loginは、その値が割り当てられてしまったところを見てみましょう:

明らか
$login = mysql_query("…"); 

mysql_queryは、ブール値の代わりに、リソースを返しました。

を成功した場合にリソースを返しmysql_query()結果セット、またはエラー時にFALSEを返すSELECT、SHOW、DESCRIBE、EXPLAINやその他の文の場合:。manual page for mysql_queryあなたが読むことができるオン

あなたはSELECTステートメントを実行し、mysql_queryているようにresourceが、ブール値を返しませんでした、クエリがエラーのために失敗している必要があります。

がエラーを取得するには、失敗した場合に mysql_errorを呼び出すことができます:あなたはデバッグ目的でのみが、決してライブ環境でMySQLのエラーメッセージを印刷する必要があり

if ($login) { 
    echo mysql_error(); 
} 

注意。

1

リソースタイプが予想されているが、ブール値が指定されているというエラーが表示されました。

php.net(http://www.php.net/manual/en/function.mysql-query.php)のmysql_queryリファレンスをチェックすると、次のようなクエリが実行されます。リソースが返されますが、場合によってはphp.netサイトから、FALSE reeturn:

するmysql_query()は、ユーザーが参照するテーブル(複数可)にアクセスする権限を持っていない場合にも失敗し、FALSEを返しますクエリ。

おそらく問題は次のとおりです。 1.サーバーに正しく接続していませんか?

あなたはmysql_error機能の使用方法のphp.netサイトからここでは例を誤りhttp://php.net/manual/en/function.mysql-error.php

をチェックするためにmysql_errorを使用することができます:あなたは非常に単純なその機能を使用見ることができるように

<?php 
$link = mysql_connect("localhost", "mysql_user", "mysql_password"); 

mysql_select_db("nonexistentdb", $link); 
echo mysql_errno($link) . ": " . mysql_error($link). "\n"; 

mysql_select_db("kossu", $link); 
mysql_query("SELECT * FROM nonexistenttable", $link); 
echo mysql_errno($link) . ": " . mysql_error($link) . "\n"; 
?> 

を、 mysql接続に使用されたリソース変数を使ってその関数を呼び出すだけです。 も多分コードのこれらの部分はあなたを助けることができる(再び、それはphp.netサイトからである)

<?php 

$link = mysql_connect("localhost", "mysql_user", "mysql_password"); 
mysql_select_db("database", $link); 

$result = mysql_query("SELECT * FROM table1", $link); 
$num_rows = mysql_num_rows($result); 

echo "$num_rows Rows\n";  
?> 

は、このヘルプを願っています。

関連する問題