2012-03-09 9 views
0

테이블에서 MySQL 데이터로 HTML 폼을 채 웠습니다.MySQL 데이터 쿼리 이상한 동작

제출 한 경우 MySQL 테이블에서 데이터 행을 삭제해야하는 양식을 해당 테이블에 포함 시켰습니다.

이 코드는 내 테이블의 MySQL 데이터로 테이블을 채 웁니다. (db 연결 코드를 놓치고 관련성이없는 것으로 간주 된 코드가 누락되었습니다).

while($row_data=mysql_fetch_array($table_data)){ 
    echo "<tr>"; 
    echo "<td>" . $row_data['ID'] . "</td>"; 
    echo "<td>" . $row_data['Site'] . "</td>"; 
    echo "<td>" . $row_data['Date'] . "</td>"; 
    echo "<td>" . $row_data['Target_Site'] . "</td>"; 
    echo "<td>" . $row_data['Target_Contact_Email'] . "</td>"; 
    echo "<td>" . $row_data['Target_Contact_Name'] . "</td>"; 
    echo "<td>" . $row_data['Link_Type'] . "</td>"; 
    echo "<td>" . $row_data['Link_Acquired'] . "</td>"; 
    echo "<td>" . $row_data['Notes'] . "</td>"; 
    echo "<td>" . $row_data['Link_URL'] . "</td>"; 
    echo "<td></td>"; 
    echo "<td><form action='delete.php' method='post'><input type='hidden' name='delete_id' value=" . $row_data['ID'] . "><input type='submit' value='&#x2713;' name='delete' style='background:none;' /></form></td>"; 
    echo "</tr>"; 
    } 

당신이 코드에서 볼 수 있듯이

는 형태이다 말에 테이블 데이터가 있고, 클릭 한 경우는 그 주어진 행을 삭제하기위한 것입니다. 양식에서 볼 수 있듯이 작업은 delete.php입니다.

$ID = $_POST['delete_id']; 
$Delete = $_POST['delete']; 



if(isset($Delete)){ 

mysql_query("DELETE FROM link_building WHERE 'ID'=" . $ID); 

header("location:link_building.php?success2=1"); 
}else{ 
header("location:link_building.php?fail2=1"); 
} 

이제 (DB 연결 코드를 놓쳤다), 그것은 일종의 작동하지만, 단지 내가하려고 할 때마다 0의 ID가 데이터의 행을 삭제 delete.php 코드입니다 예를 들어 ID가 2 인 데이터 행을 삭제하면 데이터를 성공적으로 삭제했지만 실제로 삭제되지는 않는다고 표시됩니다. 그러나 ID가 0 인 행에서 삭제를 클릭하면 해당 행 대신 모든 데이터가 삭제됩니다.

+0

변수 (문자열)에 쿼리를 작성하여 출력하고, mysql_query & redirect를 주석 처리하십시오. 그리고이 출력 된 쿼리를 수동으로 실행 해보십시오 (phpmyadmin). 이것은 아마도 잘못된 것을 알려줍니다. –

+0

@ Ryan - 열 이름을 어디에서 인용해야하는지 읽었습니까? 사람들에게 그렇게하도록 가르치는 튜토리얼이나 그 밖의 것이 있으면 정말로 관심이 있습니다. –

+0

나는 정말로 정직하다는 것을 잊는다. 얼마나 작은 것들이 큰 차이를 만들 수 있는지 놀랍습니다. – RSM

답변

6

'ID'에 작은 따옴표를 붙였습니다. 모든 문자열과 비교 된 정수 0은 MySQL에서 TRUE와 같고 인용 된 'ID'은 열 이름이 아니라 문자열 리터럴이므로 ID = 0을 전달할 때 삭제가 발생하지만 다른 모든 경우에는 실패합니다.

ID에서 따옴표를 제거

mysql_query("DELETE FROM link_building WHERE ID=" . $ID); 
//------------------------------------------^^^^ 

는 또한, 코드를 SQL 인젝션에 취약합니다. $ID 값을 올바르게 필터링하십시오. 위의 코드는 $_POST['delete_id']의 존재와 나머지 작업을 진행하기 전에 유효성을 검사하는 것이 원래의 차이가 있음을

if (isset($_POST['delete_id']) && !ctype_digit($_POST['delete_id'])) { 
    // Non-integer value! error! bail out! 
} 
else { 
    $ID = $_POST['delete_id']; 
    // Do your query... 
} 

참고. 원래의 경우 $ID$Delete의 값을 확인하지 않고 설정합니다. 다른 양식 입력 만 있으므로 $Delete을 확인하지 않아도됩니다.

마지막 참고 사항 :이 게시물에는 인증 코드가 표시되지 않지만 양식 입력에서 SQL 삭제를 수락하면 삭제하기 전에 삭제할 행의 사용 권한을 확인해야합니다. 그렇지 않은 경우, 사용자가 양식을 수정하여 다른 사용자의 행을 삭제할 수 있습니다 (상황에 따라 다름).