2012-06-19 2 views
1

현재 사용자가 임의의 코드를 받아서 최대 3 번의 다운로드를 위해 mp3에 액세스하는 데 사용하는 다운로드 플랫폼을 개발 중입니다. 파이썬을 사용하여 임의의 코드 목록을 생성하고 관련 전자 메일 주소의 빈 열이있는 SQL 테이블로 가져오고 사용 횟수는 기본값 0으로 가져 왔습니다. 전자 메일을 특정 코드와 연결하고 카운트에 추가하기 위해 다운로드에 최대 세 번 액세스 할 수 있도록 다음 PHP 스크립트를 작성했습니다.PHP MySQL SELECT 리소스 만 반환 쿼리

$email = $_POST["email"]; 
$email = stripslashes($email); 
$uniqueCode = $_POST["uniqueCode"]; 
$uniqueCode = stripslashes($uniqueCode); 

// check that all fields are filled 
if($uniqueCode=="" || $email=="") 
    apologize("Please fill out all fields."); 

// check to make sure that the e-mail is valid 
if (verifyEmail($email) == FALSE) 
    apologize("Please enter a valid e-mail address."); 

// check if uniqueCode input is alphanumeric 
if (verifyCode($uniqueCode) == FALSE) 
    apologize("Download codes are alphanumeric."); 

// check to see if unique code is correct 
$sql = mysql_query("SELECT * FROM wd009 where uniqueCode='$uniqueCode'"); 
$result = mysql_fetch_array($sql); 

if($sql==FALSE) 
{ 
    apologize("Your download code is invalid. Please try again"); 
} 
// only allow users with less than 3 downloads to proceed 
else if ($result['count'] <= 3) { 
     if ($result['email'] == ""){ 
      mysql_query("UPDATE wd009 SET email='$email', count=1 WHERE uniqueCode='$uniqueCode'"); 
      apologize("added email"); 
      } 
     else if ($result['email'] != $email) 
      apologize("different email from record!!"); 
     else if ($result['email'] == $email){ 
      mysql_query("UPDATE wd009 SET count=count+1 WHERE uniqueCode='$uniqueCode'"); 
      apologize("updated the count!"); 

} 
else 
    apologize("Your download code is used up!"); 

는 분명 내가 코드에 포함되지 않습니다 위의 일부 기능을 사용하지만 나는 그들 모두를 확인했고 그들 중 누구도 MySQL의 쿼리에 방해가 없습니다. apologize()가 사과 한 직후 종료 될 수 있습니다. 양식에 올바른 코드를 입력하면 올바르게 작동하고 SQL 데이터베이스가 업데이트됩니다. 그러나 다운로드 코드 입력이 영숫자 인 경우 양식이 문자열이 테이블에있는 특정 문자열과 일치하지 않더라도 양식을 수락합니다. 즉, mysql_query는 입력에 관계없이 리소스를 리턴한다. 데이터베이스 연결을 점검했지만 다운로드 코드가 올 바르면 테이블이 올바르게 업데이트되었으므로 문제가되지 않습니다.

내가 생각할 수있는 모든 방법으로 디버깅을 시도했으며 진정으로 당황 스럽다. 당신이 제공 할 수있는 모든 도움이 크게 감사하겠습니다!

+0

PDO를 사용하면 좀 더 친숙해질 것입니다. 더 이상이 자원을 사용하지 않습니다. – hakre

답변

1

매뉴얼에서 볼 수 있듯이 mysql_query은 항상 유효한 검색어에 대한 리소스를 반환하므로 논리를 변경하고 반환하는 행 수를 계산해야합니다 (mysql_query이 아닌).

이외에도 mysql_query은 더 이상 사용되지 않으므로 mysqli 또는 PDO를 사용해야합니다.

마찬가지로 - 더 이상 사용되지 않는 - mysql_num_rows 기능을 사용하여 행 수를 계산할 수 있습니다. 0 행을 귀하의 경우 유효한 코드가 될 것입니다.

+0

+1은 PDO를 제안합니다. mysql_ * 여러분을 사용하여 종료하십시오! –

0

if($sql==FALSE) 

아마

if(mysql_num_rows($sql) == 0) 

편집과 같이해야한다 : 나는 mysqli, 동의 또는 PDO는 이제 바람직하다. 는 SQL 그것을 받아들이고 문자열로 진실하고 유효한을 통과하기 때문에

if($sql==FALSE) 
{ 
    apologize("Your download code is invalid. Please try again"); 
} 

:

0

아마 문제는이 라인입니다. SQL 주입을 피하기 위해 할 수도있는 한 가지 방법은 사용자 입력을 직접 주입하는 대신 매개 변수를 사용하는 것입니다.

$sql = mysql_query("SELECT * FROM wd009 where uniqueCode='$uniqueCode'");  

대신 같은 것을 할 :

$stmt = $mysqli->prepare("SELECT * FROM wd009 where uniqueCode=?"); 
$stmt->bind_param($uniqueCode); 
$stmt->execute(); 

while ($stmt->fetch()) { 
    ..... 

당신은 또한 너무 그것을 업데이트 문이 방법을 수행 할 수 있습니다.

해당 테이블에 많은 양의 데이터가있는 경우 SQL 문에서 반환되는 열을 제한하여 데이터베이스의로드를 줄 이도록 할 수 있습니다.