2014-04-14 4 views
-2

프로그램 실행시 My $ result 변수는 "Resource id # 4"와 같습니다. 분명히 내 mysql_query()가 성공적으로 실행되었음을 의미합니다. 그러나 mysql_num_rows ($ result)를 호출하면 항상 0이 반환됩니다. 행은 존재하지만 0 값이 계속 유지됩니다. 왜?0을 반환하는 mysql_num_rows()

if (isset($_POST["user"]) && isset($_POST["pass"])) 
{ 
    // prepare SQL 
    $sql = sprintf("SELECT 1 FROM users WHERE username='%s' AND password=PASSWORD('%s')", 
        mysql_real_escape_string($_POST["user"]), 
        mysql_real_escape_string($_POST["pass"])); 

    // execute query 
    $result = mysql_query($sql); 


    if ($result === false) 
     die("Could not query database"); 


    $numOfRows = mysql_num_rows($result); 
+1

'$ sql'을 출력 해 보았습니까? 어쩌면 사용자와 패스 값은 mysql_real_escape_string에 의해 이스케이프되고있는 코드를 포함하고 있을지도 모른다. 또한, 더 이상 사용되지 않는'MySQL' 라이브러리 (''MySQL'' 또는''PDO') 대신에''MySQLi'' 또는''PDO''를 사용하십시오. (http://php.net/manual/en/mysqlinfo.api.choosing.php) – Diamondo25

+0

mysql_ * . –

+1

"1"은 열 이름을 의미합니까? 그것은 "하나의 행을 얻는다"는 의미는 아니며, 값을 가져 오려는 열 이름의 목록은'SELECT' –

답변

1

코드에는 아무런 문제가 없습니다.

가장 확실한 설명은 데이터베이스로 전송되는 쿼리가 어떤 행도 반환하지 않는다는 것입니다.

기본 디버깅을 추가하는 것이 좋습니다. 데이터베이스에 제출하기 전에 SQL 텍스트 $sql의 값을 반향 (또는 vardump 또는 printf)하십시오.

SQL 텍스트가 데이터베이스로 전송되기를 기대하며이 쿼리가 행을 반환하는지 확인하십시오.

디버깅의 다른 단계로, 실제로 결과 집합에서 행을 반입하고 반환 된 행을 표시하는 것이 좋습니다.


일반적으로 SELECT 목록의 리터럴에 별칭을 지정합니다.

SELECT 1 AS one FROM ... 

하지만 실제로 이것이 mysql_num_rows에 문제를 일으킬 것이라고 생각하지 않습니다.


이전 버전의 PHP는 기본적으로 "마법 인용 부호"기능이 설정되어 있다고 생각합니다 (자동으로 문자열에 addslashes 기능 실행); 생성 된 SQL을 반향 출력하면 "이중 이스케이프"가 문제인지 아닌지를 알 수 있습니다.


부록

mysql_로 인터페이스는 사용되지 않으며 새로운 개발이 (많이 개선) 교체 중 하나를 사용하게해야한다고 여기 의무적 참고 : mysqli 또는 PDO을 .