2012-05-11 1 views
3

삭제 링크가 모두 $rows인데, 그 위에 마우스를 놓으면 삭제할 올바른 ID가 반영됩니다. 그러나 DELETE을 클릭하면 phpfile.php?id=4으로 리디렉션되고 아무 것도 삭제되지 않습니다. 오류는 게시되지 않습니다. 나는이 버그를 해결할 수있는 경우mysqli가 작동하지 않습니다.

if(isset($_GET['id'])) { 
// Get the ID 
$id = intval($_GET['upload_id']); 


require_once ('../mysqli_connect.php'); //Connect to the db 




    $delquery = " 
     DELETE 
     FROM upload 
     WHERE upload_id = {$id}"; 
    $done = @mysqli_query ($dbc, $delquery); // Run the query 

    if($done) { 
     // Make sure the result is valid 
     if (mysqli_num_rows($done)==1) { 
     echo 'Record Deleted'; 
     } 
     else { 
      echo 'error - delete failed'; 
     } 

     // Free the mysqli resources 
     @mysqli_free_result($result); 
    } 
    else { 
     echo "Error! Query failed:" .$mysqli_error($dbc); 
    } 
    mysqli_free_result($done); 
    mysqli_close($dbc); 
} 

가 나는 다운로드 기능을 제외하고는 유사한 버그를 해결할 : 같은 페이지에서 기존

while ($row = mysqli_fetch_array($r,MYSQLI_ASSOC)) 
{ 
    echo '<tr><td align="left">' . 
    $row['title'] . '</td><td align="left">' 
    . $row['genre'] . '</td><td align="left">' 
    . $row['length'] . '</td><td align="left">' 
    . $row['created'] . '</td><td align="left">' 
    . $row['views'] . '</td><td align="left">' 
    . "<a href='newwriter_profile.php?id={$row['upload_id']}'>Delete</a></td>" .  '</tr>'; 
} 
echo '</table>'; // Close the table 

코드의 나머지 부분.

+0

'@'기호로 표시하지 않으므로 아무런 오류도보고되지 않습니다. 모든'@'를 제거하십시오. –

+0

은 @을 제거했지만 여전히 오류가 없습니다. – V1GG3N

답변

2

$_GET['id']을 사용하려는 경우 을 존재하지 않는 문자 ($_GET['upload_id'])에서 가져옵니다. $_GET['upload_id']가 설정되어 있지 않기 때문에, 그 값이 귀하의 쿼리로 끝나는 0으로 해석됩니다있는 NULL입니다 대신 intval()를 사용 DELETE FROM upload WHERE upload_id = 0

$id = intval($_GET['upload_id']); 
// Should be 
$id = intval($_GET['id']); 

, 나는 $id에 검사를 더 광범위한 경계를 사용하는 것이 좋습니다 것입니다. 예를 들어, "abc"과 같은 문자열이 ?id=abc에 전달 된 경우 intval("abc")은 0으로 캐스팅하고 쿼리에 0을 전달합니다. id 요구는 양의 정수로하면, 같은 것을 사용 : 마지막으로

if (ctype_digit($_GET['id'])) { 
    // ok, do your query 
} 
else { 
    // invalid input, report error to user and don't touch your database. 
} 

, 우리는 스크립트의 나머지 부분을 볼 수 없습니다,하지만 (삭제 작업을 수행 할 하이퍼 링크를 사용할 때 일반적으로 중요입니다 또는 해당 작업에 대한 작업)을 수행하기 전에 삭제하려는 행의 소유권을 확인하십시오. 로그인 한 사용자에게 행을 삭제할 수있는 권한이 있는지 확인하십시오. 그렇지 않은 경우 데이터베이스 작업을 수행하지 마십시오. 그렇지 않으면 모든 사용자가 URL에 값을 전달하여 다른 사용자의 데이터를 수정할 수 있습니다. 추천 읽기 : The Spider of Doom

+0

정보를 제공해 주셔서 감사합니다, 마이클. 그런 다음 삭제 작업을 수행하는 가장 좋은 방법은 무엇입니까? 행의 소유권을 어떻게 확인해야합니까? – V1GG3N

+1

@ V1GG3N 소유권을 확인하는 한 링크를 사용할 수 있습니다. 어떤 종류의 로그인 사용자가 있다고 가정하고 업로드 행에 일종의 사용자 식별자가 있다고 가정하면 delete query'WHERE' 절을 사용하여 사용자가 DELETE FROM upload WHERE upload_id와 같이 삭제할 수 있는지 확인하십시오 = {$ id} 및 userid = $ logged_in_userid'입니다. –

+0

Michael 감사합니다. 세션 변수에 따라 조정하여 소유권을 확인했습니다. 이것은 여전히 ​​거미가 내 쿼리를 계속 치는 것을 허용합니까? 어쨌든, 내 삭제는 여전히 망가졌고 어떤 오류도주지 않습니다. – V1GG3N