Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá pessoal,
Estou tentando executar o seguinte comando:
$mysqli->autocommit(FALSE);
$mysqli->multi_query("INSERT INTO clientes (nome) VALUES ('Teste'); INSERT INTO clientes (nome) VALUES ('Teste')");
$mysqli->commit();
Isso não tem efeito de inserção do registro. Somente o próximo auto índice da tabela que é alterado, mas o registro não é inserido!
Porém, se eu tento realizar a mesma operação, com o autocommit(TRUE), dá certo.
Alguém pode me dar uma luz de por que está ocorrendo este problema?
Se utilizo autocommit(FALSE); e faço uma query simples, dá certo.
O multi_query não suporta autocommit? por que quando desligado, a única alteração que ele faz é no próximo auto índice, mas nenhum registro é inserido!
Obrigado à todos!
Oi Henrique,
O exemplo foi apenas com 2 querys, mas na verdade vão ser 15 +/-. São várias tabelas envolvidas. A necessidade do multi_query é por que se eu for fazer com query separada ou vou ter que fazer if em cada query e incrementando uma variável de controle, para ver se no final algum query deu erro e fazer rollback. Enquanto com o multi_query com um simples if($mysqli_error) {}, estaria resolvido!
Mas deixando a preguiça de lado, irei fazer tudo separado.
Deixo abaixo como estou fazendo, pois pode ser uma ideia para outras pessoas que passem pelo mesmo problema.
A forma que estou implementando é uma forma simples, e para não ter que ficar repetindo o if e a variável para controle do erro.
// QUERY'S
$queryerror = false:
$query[0] = "MEU SQL 1"
$query[1] = "MEU SQL 2"
$query[2] = "MEU SQL 3"
$query[3] = "MEU SQL 4"
// PERCORRE O ARRAY E EXECUTA AS QUERY'S
$mysqli->autocommit(FALSE);
foreach ($query as $sqlquery) {
if (!$mysqli->query($sqlquery)) $queryerror = true;
}
// SE NÃO TIVER ERROS
if (!$queryerror)
{
$mysqli->commit();
echo "SUCESSO!";
} $mysqli->rollback();
echo "DEU ERRO";
}
OBS (iniciantes): Ressalto que $mysqli é a minha variável de conexão ao banco - e não um padrão! Considero ainda que o trecho de código acima é para quem está a trabalhar com orientação a objetos!
Obrigado e um abraço!
Bom, é uma solução aceitável... Acredito que seja a melhor maneira.
Boa sorte aí...
Henrique,
Obrigado!
Considere o tópico como resolvido! Acredito que seja a melhor alternativa, e me parece que você também.. rsrs
Um abraço!
------------------------------------------------------------
Ahhh... Uma melhoria do array de sql's, seria a retirada dos índices... Ficando assim:
// QUERY'S
$queryerror = false:
$query = array();
$query[] = "MEU SQL 1";
$query[] = "MEU SQL 2";
$query[] = "MEU SQL 3";
$query[] = "MEU SQL 4";
// PERCORRE O ARRAY E EXECUTA AS QUERY'S
$mysqli->autocommit(FALSE);
foreach ($query as $sqlquery) {
if (!$mysqli->query($sqlquery)) $queryerror = true;
}
// SE NÃO TIVER ERROS
if (!$queryerror)
{
$mysqli->commit();
echo "SUCESSO!";
} $mysqli->rollback();
echo "DEU ERRO";
}
Dessa forma não precisaria ficar enumerando os índices em cada query.
Abraços!
não poderia usar um único insert com múltiplos "values"?
INSERT INTO table_name VALUES
('foo','bar'),
('foo2','bar2'),
('foo3','bar3')
Hinom,
Claro que pode!
Pode quando é uma tabela só, e quando são várias? Aí não dá né!? Era justamente essa a aplicação da multi_query()!
Um abraço!
$mysqli->autocommit(FALSE);
$mysqli->query("BEGIN;");
$mysqli->multi_query("INSERT INTO clientes (nome) VALUES ('Teste'); INSERT INTO clientes (nome) VALUES ('Teste')");
$mysqli->commit();
* note o uso de "BEGIN" após setar o autocommit
Oi hinom,
Tentei tanto BEGIN quanto START TRANSACTION e não deu certo. Troquei de servidor e só com o autocommit(FALSE); funcionou,
Então, o problema era no servidor!
Obrigado!
Porque utilizar multiqueries? Não pode fazer isso com 2 queries?
Essa é a ideia de transaction.
Eu não sei detalhes da implementação de multiquery, deveria em tese apenas quebrar a query em vários pedaços e executar um a um, mas pode não ser só isso.