2015-01-20 2 views
1

Bootstrap Data Table을 사용하고 있으며 데이터베이스에서 여러 사용자를 삭제하려고합니다. 한 번에 한 명의 사용자를 삭제할 수 있지만 한 번 이상 하나를 삭제하려고하면 문제가 발생하여 오류를 찾을 수 없습니다.PHP에서 아약스 호출로 여러 행 삭제

function removeRow(){ 

    var url = 'remove-user.php'; 
    var id = document.getElementById("user-id").value; 
    var data = 'userID=' + id; 

    $.ajax({ 
      url: url, 
      data: data, 
      cache: false, 
      error: function(e){ 
        alert(e); 
       }, 
      success: function() { 
       alert(data); 
       var selects = $('#users-table').bootstrapTable('getSelections'); 
        ids = $.map(selects, function (row) { 
         return row.id; 
        }); 

       $('#users-table').bootstrapTable('remove', { 
        field: 'id', 
        values: ids 
       });     
      } 
      }); 

    } 

예 : 여기

는 AJAX 코드 URL의 데이터 아이디 것이다 = 여기

1,2 제거-user.php 코드 :

require("../config.php"); 
if(isset($_GET['userID'])) { 
    try{ 
    $userID = $_GET['userID']; 
    $query = "DELETE FROM users WHERE user_id IN (:userID)"; 
    $stmt = $db->prepare($query); 
    $stmt->bindParam(":userID", $userID, PDO::PARAM_INT); 
    $stmt->execute(); 
    $user_removed = 'User was successfully deleted.'; 
    $_SESSION['user_removed'] = $user_removed; 
    } catch (Exception $e){ 
    echo 'The following error occured: <br/>'.$e->getMessage(); 
    } 
} 

둘 이상의 사용자를 확인하면 첫 번째 사용자는 삭제되지만 다른 사용자에게는 삭제되지 않습니다. 내 코드에 실수가 있습니까?

여러 사용자를 삭제하려면 테이블에서 선택하고 여러 ID (예 : userID = 1,2)가 포함 된 숨겨진 입력 값을 전달하십시오. remove-user.php 페이지로 직접 가서 GET을 울리면 1,2 따옴표가 표시되지 않습니다. 매개 변수를 바인딩하는 대신 ID를 지정하도록 내 삭제를 변경하면 모든 것이 정상적으로 작동합니다. 나는 왜 그것이 작동하지 않는지 정말로 확신하지 못한다.

자세한 정보가 필요한 경우 알려주십시오.

+0

'$ _GET [ '아이디']'무엇이 포함되어 있습니까 : 여기

내가 내 remove-user.php 코드를 변경 무엇인가? –

+0

DOM-ID로 ID를 선택합니다. 그러나 오직 하나의 ID 만있을 수 있습니다. –

+0

@JayBlanchard 선택된 체크 박스의 모든 ID를 포함하고 다음과 같이 URL에 매개 변수로 전달합니다 - userID = 1,2 – iamthestreets

답변

0

그래서 마침내 내가 시도한 해결책을 찾을 수있었습니다. 나는 그것이 작동하지 않는 이유가 내게 bindParam을 사용하려고하는 것과 관련이있을 것이라고 생각합니다.

try{ 
    $ids = array($_GET['userID']); 
    $inQuery = implode(',', $ids); 
    $stmt = $db->prepare(
     'DELETE 
     FROM users 
     WHERE user_id IN(' . $inQuery . ')' 
    ); 
    $stmt->execute($ids); 
    $count = $stmt->rowCount(); 
    $user_removed = ''.$count.' user(s) deleted successfully.'; 
    $_SESSION['user_removed'] = $user_removed; 
} catch (Exception $e){ 
    $error = '<strong>The following error occured:</strong>'.$e->getMessage(); 
    $_SESSION['error'] = $error; 
} 
0

문제는 데이터를 PDOStatement로 전달하는 방법입니다.

// assign :userID to $userID which should be cast into an int. 
$stmt->bindParam(":userID", $userID, PDO::PARAM_INT); 

이 내가 유사한 접근하는 방법 (적절한 사용 권한을 확인하신 가정을)입니다 :

당신의 SQL 쿼리 :userID 매개 변수에서
$ids_in = $_GET['userID']; 
$ids_cast = array(); 
foreach(explode(',', $ids_in) as $id) { 
    // casting to an int means that SQL injection can't work, though I wonder if 
    // allowing a user to delete an arbitrary number of IDs is a good thing. 
    $ids_cast[] = intval($id); 
} 
// gets rid of bad strings &ct. 
$ids_filtered = implode(',',array_filter($ids_cast)); 
if(!$ids_filtered) die('No valid IDs'); 
$query = "DELETE FROM users WHERE user_id IN ($ids_filtered)"; 
// run query. 
+0

임의의 수의 ID를 삭제하는 것을 방지하는 방법은 무엇입니까? – zavg

+0

@ zavg'userID = 1,2,3,4,5,6,7,8,9,20,11,12,13,14,25'는 파괴적인 것처럼 보입니다. – cwallenpoole

+0

하지만 코드가이를 방지하는 방법은 무엇입니까? – zavg

0

(예를 들어, 쉼표로 구분 식별자의 순서를 포함한 문자열입니다, 1,2).

$query = "DELETE FROM users WHERE user_id IN (:userID)";

하지만 정수 bindParam 기능에 PDO::PARAM_INT 인수를 전달로 매개 변수를 정의 바인딩 할 때.

$stmt->bindParam(":userID", $userID, PDO::PARAM_INT); 

시도 대신

$stmt->bindParam(":userID", $userID, PDO::PARAM_STR); 

를 사용합니다.

+0

위의 답변을 시도했지만 여전히 모든 사용자가 아닌 첫 번째 사용자 만 삭제합니다. – iamthestreets

+0

당신은 GET [ 'userId']이 실제로 의도 된 것보다는 "1,2"라는 문자열을 포함하고 있음을 확인할 수 있습니다. id는 getElementById로 선택합니다. 일반적으로 하나의 요소 일뿐입니다. 원하는 요소를 연결하여 문자열에 어떻게 제공합니까? –

+0

또한 PDO :: PARAM_INT는 틀린 데이터 유형입니다. PDO :: PARAM_STR로 계속 진행하십시오. –

관련 문제