2016-06-14 2 views
2

PHP에서 MySQL 쿼리를 실행하려고하는데 몇 가지 문제가 있습니다. PHP에서이 쿼리를 실행할 때 항상 0 행을 반환하지만 내 콘솔에서이를 실행하면 예상대로 작동하는 것으로 보입니다.PHP의 MySQL : 항상 0 행이 반환됩니다.

<?php 
include '../mysql.php'; 
$name = $_POST["name"]; 
$email = $_POST["email"]; 
$sql = "SELECT COUNT(*) FROM accounts WHERE name = '" . $name . "' AND email = '" . $email . "'"; 
echo $sql . "</br>"; 
$res = mysqli_query($connection, $sql); 
if(!$res) { 
    die("Query Failed!"); 
} 
$row_cnt = $result->num_rows; 
printf("Result set has %d rows.</br>", $row_cnt); 
if($row_cnt > 0) { 
    echo "Account exists!"; 
} else { 
    echo "Account does not exist! Creating...</br>"; 
    if(mysqli_query($connection, "INSERT INTO accounts (`name`, `email`, `password`, `ip`) VALUES ('" . $name . "', '" . $email . "', 'abc123', 'localhost')")) { 
     echo "Created account!"; 
    } else { 
     echo "Failed to create account"; 
    } 
} 
mysqli_free_result($res); 
mysql_close($connection); 

출력 :

SELECT COUNT(*) FROM accounts WHERE name = 'testUser' AND email = '[email protected]' 
Result set has 0 rows. 
Account does not exist! Creating... 
Created account! 

은 다음 표에 우리가 예상을 참조하십시오

mysql> select * from accounts; 
+----+----------+------------------+----------+-----------+ 
| id | name  | email   | password | ip  | 
+----+----------+------------------+----------+-----------+ 
| 10 | testUser | [email protected] | abc123 | localhost | 
+----+----------+------------------+----------+-----------+ 
1 row in set (0.00 sec) 

그러나 쿼리를 다시 실행하면 동일한 정확한 출력을 가지고 있으며, 다른 행은 만들어진.

mysql> select * from accounts; 
+----+----------+------------------+----------+-----------+ 
| id | name  | email   | password | ip  | 
+----+----------+------------------+----------+-----------+ 
| 10 | testUser | [email protected] | abc123 | localhost | 
| 11 | testUser | [email protected] | abc123 | localhost | 
+----+----------+------------------+----------+-----------+ 
2 rows in set (0.00 sec) 

데이터가 이미 행에 있음을 감지 할 수없는 이유에 대한 아이디어가 있습니까?

+0

당신은'SELECT count (*)'를 사용하고 나서 행 수를 확인합니다. 이것은 결코 작동하지 않을 것입니다. 조건에 맞는 행 수인 첫 번째 (계산) 열의 값을 가져와야합니다. – Devon

+0

imo, 왜냐하면 당신은 하나의 행에 그것을 세는 것이 확실하기 때문입니다. 어쨌든 가져 오십시오. 'num_rows' 카운트는 아무 쓸모가 없다는 것을 알려줍니다. 데이터를 원하고 처리하기 때문에 유용한 정보가 거의 없습니다. 일부 데이터가 있다고 가정합니다. 항상 가져 오기. 당신은 어쨌든 그것의 끝을 테스트합니다. 'num_rows '는'select' 쿼리와 함께 사용할 때 거의 유용하지 않습니다. 이모. –

+0

데이터에 신경 쓰면 암호를 해시하십시오. SQL 인젝션으로부터 보호하십시오. 일부 앱은 버려지는 앱이며, 중요하지 않습니다. – Drew

답변

4

두 가지 변수 $ result와 $ res가 있습니다. 이 변경 :

$row_cnt = $result->num_rows; 

하려면 :

$row_cnt = $res->num_rows; 

UPDATE :

또한이 설정을 변경 :

$sql = "SELECT COUNT(*) FROM accounts WHERE name = '" . $name . "' AND email = '" . $email . "'"; 

사람 :

$sql = "SELECT * FROM accounts WHERE name = '" . $name . "' AND email = '" . $email . "'"; 

그렇지 않으면 $ res가 항상 1과 같아 지므로 응용 프로그램이 예상대로 작동하지 않습니다. - 데본

업데이트 # 2 :

mysqli_close($connection); 

닫기 연결 대신

mysql_close($connection); 

이 두 가지를 혼합하지 마십시오! - Saty

업데이트 # 응용 프로그램을 보호하기 위해 PHP 변수를 청소 약 3

읽기. 하나의 좋은 게시물은 here이며 Google에서 더 많은 정보를 얻을 수 있습니다.

+0

'SELECT count (*)'에서 집계 함수를 사용하기 때문에 조건에 맞는 행이 0 개 또는 조건에 맞는 행이 1000 개가 있든 항상 1을 반환합니다. – Devon

+0

두 가지 문제가 있지만 이는 분명히 그 중 하나에 대한 대답입니다. –

+0

아니요, 그렇지 않습니다 ... 쿼리에 관계없이 그룹화하지 않고 select count를 수행하면 행 수는 항상 1입니다. – Devon

관련 문제