2014-09-28 1 views
-3

PHP에 익숙하지 않고 사용자 이름과 패스워드를 생성하려고합니다. 체계. 경고 : mysql_num_rows()는 매개 변수 1이 18 번 줄에 C : xamppserver htdocs www login.php에 주어진 boolean 값을 가질 것을 기대합니다.

내가 사용하고있는 PHP 코드 :

<?php 
    $username = "root"; 
    $password = "pass"; 
    $hostname = "localhost"; 

    $dbhandle = mysql_connect($hostname, $username, $password) or die("Could not connect to database"); 

    $selected = mysql_select_db("login", mysql_connect($hostname, $username, $password)); 

    $myusername = $_POST['user']; 
    $mypassword = $_POST['pass']; 

    $myusername = stripslashes($myusername); 
    $mypassword = stripslashes($mypassword); 

    $query = "SELECT * FROM users WHERE Username='$myusername' and Password='$mypassword'"; 
    $result = mysql_query($query); 
    $count = mysql_num_rows($result); 

    if($count==1) { 
     echo 'It Works!'; 
    } 

?> 

그리고 이것은 위의 코드는 내가 페이지를로드 할 때마다 반환 것입니다 :

경고 :) (mysql_num_rows도를 매개 변수 일 것으로 예상 리소스가되도록 부울은 18 행의 C : \ xamppserver \ htdocs \ www \ login.php에 있습니다.

아무도 도와 줄 수 있습니까?

+2

스택 오버플로에 오신 것을 환영합니다. "Stack Snippets"기능은 HTML/JS/CSS 전용이며 PHP와 호환되지 않습니다. 나는 당신을 위해 그것을 제거했지만, 이것을 명심하십시오. –

+0

당신의 질의가 실패하면, mysql_error()를 사용하여 그 이유를 찾으십시오. – Mihai

+0

귀하의 질의 mostl은 자원 대신에'FALSE'를 리턴했을 것입니다. mysq_num_rows()를 사용하기 전에 확인하십시오. –

답변

0

Password은 MySQL의 예약어 (함수 이름이기도 함)이므로 맨 줄 이름으로 사용할 수 없습니다.

`backticks`에 열 이름을 넣거나 다른 이름을 사용해야합니다.

개인적으로는 항상을 권장합니다. 표 및 열 이름에 관한 백틱을 사용하십시오. 같은 이유로 PHP에서 이라고 쓸 수 있지만, 뭔가 특별한 경우 (이 경우 상수는 그 이름으로 존재) 쉽게 깨질 것입니다.

또한 코드는 이며 극도로입니다. 나는 사용자 이름 Admin'; --을 입력 할 수 있으며 관리자 계정 (또는 이와 유사한)에 즉시 액세스 할 수 있습니다. 이것은 큰 문제이며 mysql_* 함수를 사용하지 않고 대신 PDO의 준비된 명령문으로 전환하여 해결해야합니다.

+2

올바르지 않습니다. http://dev.mysql.com/doc/refman/5.5/en/reserved-words.html – Mihai

1

변경이 라인 :

$selected = mysql_select_db("login", mysql_connect($hostname, $username, $password)); 

당신은 DB 연결 $dbhandle은 데이터베이스, 다음 매개 변수를 선택해야

$selected = mysql_select_db("login", $dbhandle); 

합니다.

당신은 두 번 mysql_connect()을 사용하는 당신은 이미 그것을 호출하고 여기서

$dbhandle = mysql_connect($hostname, $username, $password) 

, 현재의 코드가 SQL injection에게 열려 대신 or die("Could not connect to database")

플러스의 실제 오류에 대한 사용 mysql_error(), . mysqli with prepared statements 또는 PDO with prepared statements, 을 사용하면 훨씬 안전합니다.


비밀번호를 일반 텍스트로 저장하는 것으로 나타났습니다. 이 경우에는 매우 낙심하고 있습니다.

나는 CRYPT_BLOWFISH 또는 PHP 5.5의 password_hash() 기능을 사용하도록 권장했습니다. PHP < 5.5의 경우 password_hash() compatibility pack을 사용하십시오.

$myusername = stripslashes($myusername); 
$mypassword = stripslashes($mypassword); 

에 :

$myusername = stripslashes($myusername); 
$myusername = mysql_real_escape_string($myusername); 

$mypassword = stripslashes($mypassword); 
$mypassword = mysql_real_escape_string($mypassword); 

mysqli 방법, 당신이 사용할 수에 대한

: (하고


은 좀 더 안전하고, 변화에 존재하는 코드를 만들려면 기본 방법)

<?php 
$username = "root"; 
$password = "pass"; 
$hostname = "localhost"; 
$db_name = "login"; 

$dbhandle = mysqli_connect($hostname, $username, $password, $db_name) 
      or die(mysqli_error($dbhandle)); 

$myusername = mysqli_real_escape_string($dbhandle,stripslashes($_POST['user'])); 
$mypassword = mysqli_real_escape_string($dbhandle,stripslashes($_POST['pass'])); 

$query = "SELECT * FROM users WHERE Username='$myusername' and Password='$mypassword'"; 
$result = mysqli_query($dbhandle, $query); 
$count = mysqli_num_rows($result); 

if($count==1) { 
    echo 'It Works!'; 
} 

양식에 이름이 지정된 요소와 POST 메서드 과 통찰력이 포함되어 있는지 확인하십시오.

즉 :

<form action="handler.php" method="post"> 
Username: <input type="text" name="user"> 
Password: <input type="password" name="pass"> 

<input type="submit" name="submit" value="Submit"> 
</form> 

그렇지 않으면, 당신은 당신이 error reporting를 사용하는 가정, Undefined index 경고를 받게됩니다.

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

// rest of code 
관련 문제