2014-05-13 1 views
0

준비된 문을 디버깅하려고하지만 문제가 있습니다. 아래 스크립트를 사용하면 '테스트 1'과 '테스트 2'가 브라우저에 표시되지만 '테스트 3'은 표시되지 않습니다. my -> fetch() 문이 작동하지 않는 것 같습니다. 오류 없음.Prepared Statement; fetch() 또는 fetch_all()? While 문 관련 문제

if (empty($login_errors)) { // OK to proceed! 

echo 'test one'; 

$pas = get_password_hash($p); 
$loginQuery = $dbc->prepare("SELECT id, username, type FROM user WHERE (email=? AND pass=?)"); 
$loginQuery->bind_param('ss',$e,$pas); 
$loginQuery->execute(); 
$loginQuery->bind_result($id,$username,$type); 

echo 'test two'; 

while($loginQuery->fetch()){ 

echo 'test three'; 

$idRow = $id; 
$usernameRow = $username; 

$_SESSION['user_id'] = $idRow[0]; 
$_SESSION['username'] = $usernameRow[0]; 
} 
echo 'test four'; 
} 

내 첫번째 생각 선택되는 하나의 필드 (한 바인드 결과) ->fetch()있을 때 사용하는 것이었다. 나는 을 사용했는데 ($loginQuery->bind_result($id,$username,$type);) 3 개가 있지만 HTTP 500 오류가 다시 발생합니다.이 생각이 맞습니까? 하나의 fetch(), 많은 fetch_all()?

두 페치가 작동하지 않는 이유는 무엇입니까? 내 코드에 문제가있는 것을 볼 수 있습니까?

'test four'가 표시됩니다. 이는 쿼리가 데이터를 반환하지 않음을 나타냅니다. 이 같은

$q = "SELECT id, username, type, IF(date_expires >= NOW(), true, false) FROM user WHERE (email='$e' AND pass='" . get_password_hash($p) . "')";  
$r = mysqli_query ($dbc, $q); 
+0

구문이 정확합니다. 왜 'echo'test four ';'* after *'를 추가하면 쿼리가 결과를 반환하지 않음을 나타낼까요? 그 여분의 테스트가 보이지 않는다면 스크립트가 자동으로 죽어 가고'error_reporting'을 켜거나/켜야 함을 의미합니다. 또한 최소한'prepare()'와'execute()'에 대한 반환 값을 확인해야하며, 스크립트 실행을 중단하지 않고 실패 할 수 있습니다. – Sammitch

+0

감사합니다. 'test four'가 표시되며 SQL 쿼리 결과가 표시되지 않습니다. 내 초기 준비되지 않은 성명서 (아래)가 잘 작동했기 때문에 이것은 혼란 스럽습니다.업데이트 된 작업을 포함하도록 질문을 수정했습니다. – DVCITIS

답변

1

이 올바른 생각인가? 하나의 fetch(), 많은 fetch_all()?

실제로 두 개의 서로 다른 두 가지 방법 두 개의 서로 다른 개체입니다.

  • fetch()는 mysqli 문 객체에 속하며 쿼리 결과를 전역 변수에 할당하는 추악한 방법을 사용합니다. 루프에서 실행할 수 있습니다. 루프는 하나의 행을 여러 개 가져올 수있는 곳입니다. fetch()은 많은 레코드를 얻기 위해 fetch()를 사용할 때 모순되는 점이 없습니다.
  • fetch_all()은 mysqli 결과 객체에 속하며 구문 설탕 일 뿐이며 루프에서 fetch_assoc()을 실행합니다.
-2

뭔가 작동합니다 :

$loginQuery = $dbc->stmt_init(); 
$loginQuery = $loginQuery->prepare("SELECT id, username, type FROM user WHERE LOWER(email) = LOWER(?) AND pass = ?"); 
$loginQuery->bind_param('ss',$e,$pas); 
$loginQuery->execute(); 
$results = $loginQuery->get_result(); 
if($results->num_rows > 0) 
{ 
    $row = $results->fetch_assoc(); 
    $user_name = $row['username']; 
    $user_id = $row['id']; 


    $_SESSION['user_id'] = $user_id; 
    $_SESSION['username'] = $user_name; 
} 
else 
{ 
    echo "no rows returned, bad username and password."; 
} 

이 $의 DBC는 mysqli 개체입니다 가정 당신이 준비가 문 앞에, 나는 연결을 사용하고 아래 문제없이 작동하기 때문에 혼란 또한 전 준비 stmt_init()를 호출해야합니다
$loginQuery = $dbc->stmt_init(); 

은 또한) (LOWER 사용하여 이메일에 대한 쿼리의 경우를 구분했다, 네가 원하는 것은 LOGI에 이렇게 n 및 등록. 누군가가 [email protected]에 등록하지 않으면 다른 사람이 [email protected]에 등록합니다. 등록하는 이메일이 이미 데이터베이스의 이메일과 일치하지 않는지 확인하고 비교시 mysql LOWER() 함수를 사용할 것인지 확인해야합니다.

위 코드를 사용하면 결과 집합의 첫 번째 행을 얻을 수 있습니다. 당신이 올바른 행로에있는 모든 행을 얻을 필요가 있다면. 하지만 당신은해야 할 것 :

$usersQuery = $dbc->prepare("SELECT id, username, type FROM user"); 
$usersQuery->execute(); 
$results = $usersQuery->get_result(); 
if($results->num_rows > 0) 
{ 
    while($row = $results->fetch_assoc()) 
    { 
     $user_id = $row['id']; 
     $user_name = $row['username']; 
     $user_type = $row['type']; 
    } 
}