Deletar múltiplas linhas dinamicamente com PDO? – php mysql pdo
Pergunta:
Digamos que eu tenha uma tabela de usuários (id | nome) e que onde eles são listados (client-side) eu possa selecionar vários deles e deletá-los ao mesmo tempo.
Como eu poderia fazer isso num banco MySQL utilizando PDO?
Eu sei que o MySQL permite o uso da cláusula IN que serviria para esse tipo de query. Ex:
DELETE FROM usuarios WHERE id IN (37,45,58) # deletaria os ids 37, 45 e 58
O problema é que como os ids seriam dinâmicos e o PDO utiliza prepared-statements, não sei como procederia com o código nele. Imagino que seria algo como:
$query = $pdo->prepare("DELETE FROM usuarios WHERE id IN :ids");
$query->bindParam(':ids', [37,45,58]); #array de ids vindo de um $_POST, por exemplo.
$query->execute();
Teria alguma forma de fazer algo como o código acima, com valores dinâmicos?
Autor da pergunta Kazzkiq
Maicon Carraro
Podes fazer uso da função str_repeat() do PHP para gerar uma string repetindo o ? por cada ID presente na tua matriz:
$ids = //... seja lá como você recupera os ids
$mParams = str_repeat('?,', count($ids) - 1) . '?';
$sth = $db->prepare("DELETE FROM usuarios WHERE id IN ($mParams)");
$sth->execute($ids);
Por exemplo se tivesse um
$ids = [11, 23, 34, 47];
O str_repeat vai gerar uma saída:
?,?,?,?
Ficando
$sth = $db->prepare("DELETE FROM usuarios WHERE id IN (?,?,?,?)");
nas minhas consultas PDO utilizo sempre parâmetros nomeados então não é possível usar o “coringa” ?, uso o seguinte trecho de código
$ids = array(); // sua variável
$sql = 'SELECT ...';
$parameters = array(); // variável de parâmetros passada para execute()
$in = array();
foreach ($ids as $key => $value) {
$keyname = ':id' . $key;
$parameters[$keyname] = $value;
array_push($in, $keyname);
}
$sql .= 'WHERE id IN (' . join(', ', $in) . ')';



