2016-11-17 1 views
0

레코드가 존재하는지 확인하고 싶으면 A 페이지로 이동하고 그렇지 않으면 B 페이지로 이동하십시오. 레코드가 있는지 여부와 관계없이 항상 페이지 A로 이동합니다. 귀하의 SELECT EXISTS(...)중첩 된 IF 조건이 작동하지 않는 이유는 무엇입니까?

<?php 
$ini = parse_ini_file("../phpconfig.ini"); 

$conn = mysqli_connect($ini['hostaddress'], $ini['username'], $ini['password'], $ini['databasename']); 

if (mysqli_connect_errno()) 
{ 
    echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
} 

$options = ['cost' => 10,]; 

$number = mysqli_real_escape_string($conn, $_POST['number']); 
$password = password_hash((mysqli_real_escape_string($conn, $_POST['password'])), PASSWORD_BCRYPT, $options); 

$sql = "INSERT INTO usertemp (Employee_Number, Password) 
VALUES ('$number', '$password')"; 

if (mysqli_query($conn, $sql)) { 

    $sql2 = "SELECT EXISTS(SELECT 1 FROM employee WHERE Number = '$number')"; 
    $row2 = mysqli_query($conn, $sql2); 

     if (mysqli_num_rows($row2) > 0) { 
      //Has record in Employee table 
      header("location: display_createaccount_a.php"); 
     } else { 
      //No record in Employee table 
      header("location: display_createaccount_b.php"); 
     } 

} else { 
    echo "Error: " . $sql . "<br>" . mysqli_error($conn); 
} 

mysqli_close($conn); 
?> 
+3

password_hash() 함수의 salt 옵션은 개발자가 자체적으로 (일반적으로 안전하지 않은) 염을 생성하지 않도록하기 위해 더 이상 사용되지 않습니다. 이 함수 자체는 개발자가 소금을 제공하지 않을 때 암호 학적으로 안전한 소금을 생성합니다. 따라서 사용자 지정 소금 생성은 더 이상 필요하지 않습니다. PHP는, somepoint에서 그 버전으로 업그레이 드해야합니다 더 나은 가이드 라인을 따라 시작 –

+1

*** [탈출하지 않도록하십시오] (http://stackoverflow.com/q/36628418/1011527) ** * 또는 해싱하기 전에 다른 클렌징 메커니즘을 사용하십시오. 이렇게하면 암호가 변경되어 불필요한 추가 코딩이 발생합니다. –

+1

[Little Bobby] (http://bobby-tables.com/)에서 *** [귀하의 스크립트는 SQL 주입 공격의 위험에 있습니다.] (http://stackoverflow.com/questions/60174/how-can- i-prevent-sql-injection-in-php) *** [MySQLi] (http://php.net/manual)에 대한 [prepared] (http://en.wikipedia.org/wiki/Prepared_statement) 진술에 대해 배우십시오. /en/mysqli.quickstart.prepared-statements.php). 심지어 [이스케이프 문자열] (http://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string) 안전하지 않습니다! [그것을 믿지 않아?] (http://stackoverflow.com/q/38297105/1011527) –

답변

1

은 항상 참 또는 거짓으로 1 개 행을 반환하는 것입니다.

이 경우 결과의 첫 번째 색인을 읽고이를 조건 값으로 사용하십시오.

또는 더 나은 아직, 대신 LIMIT를 사용하고 그대로 앱 로직을 유지 : 또한

$sql2 = "SELECT * FROM employee WHERE Number = '$number' LIMIT 1"; 

, 내가 준비된 문에 PHP documents을 확인하는 것이 좋습니다. 이것은 mysql을 쿼리하는보다 안전한 방법이다.

관련 문제