2014-08-17 4 views
2

Я новичок в PDO, и я сделал несколько поисков по проблеме, с которой я столкнулся, и я не смог найти ответы на это. Как вы можете видеть ниже, у меня есть эта функция:УДАЛИТЬ несколько строк в PDO

function deleteInfo($id){ 
    $pdo = connPDO(); 
    $deleteInfo = $pdo -> prepare("DELETE FROM game_locais_zumbis WHERE id_zumbi IN (:id)"); 
    $deleteInfo -> bindValue(":id", $id, PDO::PARAM_STR); 
    $deleteInfo -> execute(); 
    $pdo = null; 
} 

После этого у меня есть следующий код:

while($row = $listInfo -> fetch(PDO::FETCH_ASSOC)){ 
    $ids[] = $row['ids']; 
} 
$ids = implode(',', $ids); 
deleteInfo($ids); 

Когда я повторяю свои $ идентификаторы, я получаю:

1,2,3,4,5

Но функция DELETE не удаляет все эти пять строк в моем db, но только первый, как «1». Когда я запускаю ту же самую функцию DELETE в моем db, заменяя «: id» на «1,2,3,4,5», он работает! Кто-нибудь знает, в чем моя ошибка? Я ценю любую помощь.

+1

При использовании привязки вары с помощью оператора IN, каждая запись должна быть отдельной переменной связывания .... вы пытаетесь УДАЛИТЬ где 'id_zumbi IN ('1, 2,3,4,5 ') '(обратите внимание на цитаты, которые' bindValue() 'обертывает вокруг строки) –

+2

Тот факт, что вы извлекаете эти идентификаторы из' $ row [' ids '] ', предполагает, что вы получая их от запроса. Если это не та же самая таблица, которая была первоначально запрошена, вы можете просто объединить ее с подзапросом как: 'DELETE FROM game_locais_zumbis WHERE id_zumbi IN (SELECT id FROM othertable WHERE somecondition = true)' –

+0

Я не знал, что привязывать vars котировки. Интересно! Я попробую обходной путь для этого. Благодаря! – user3854140

ответ

2

К сожалению, вы не можете связать массив элементов с подготовленными операторами. Вам нужно будет напрямую их построить в запросе.

function deleteInfo($ids) 
{ 
    $pdo = connPDO(); 

    if (!is_array($ids)) 
     $ids = array($ids); // if it is just one id not in an array, put it in an array so the rest of the code work for all cases 

    $ids = array_map([$pdo, 'quote'], $ids); // filter elements for SQL injection 

    $pdo->exec('DELETE FROM game_locais_zumbis WHERE id_zumbi IN (' . implode(', ', $ids) . ')'); 
} 

Не забудьте передать массив deleteInfo() вместо его в взрывается строку.

+0

Хорошо, теперь я вижу, как все работает в PDO. Я изучаю больше всех вас здесь, потому что я думал, что связывание варов не цитируется. Я ценю код, который вы сделали. Огромное спасибо! – user3854140

3

Я хотел бы сделать это:

$query = "DELETE FROM game_locais_zumbis WHERE id_zumbi in (".str_repeat("?,", count($ids) - 1)."?)"; 
$stmt = $conn->prepare($query); 
$stmt->execute($ids); 
Смежные вопросы