Transações com PHP e Microsoft SQL Server
Ola pessoal! Irei tratar de um recurso bem legal e importante do SQL Server que são as transações, e como utilizar este recurso junto o PHP.
O que é transação?
É um conjunto de procedimentos que é executado num banco de dados, que para o usuário é visto como uma única ação. A integridade de uma transação depende de 4 propriedades, conhecidas como ACID.
- Atomicidade - Uma transação não pode ser executada pela metade, isto é, ou se executa ela por inteiro, ou se retorna para o estado anterior a transação, onde nada foi executado.
- Corretude - Uma transação deve ser efetuada como um programa que preserva a consistência do BD. Sendo assim, ela é de responsabilidade do programador que codifica a transação.
- Consistência - Uma Transação só executa se o estado do Banco de Dados permanecer consistente após seu fim.
- Isolamento - Sua necessidade surge em execuções concorrentes, a intercalação das diversas transações que ocorrem simultaneamente, não podem ser intercaladas de forma a gerar um estado inconsistente.
- Durabilidade - Quando ocorre falha no banco de dados, apos a execução com sucesso de uma transação, a durabilidade garante por algum mecanismo a recuperação das informações perdidas.
Comandos COMMIT e ROLLBACK
Após iniciar uma transação e executar as instruções desejadas esta transação precisa ser finalizada, para finalizá-la utilizamos “COMMIT” se não houver nenhum erro nas instruções SQL, e “ROLLBACK” se pelo menos uma instrução retornou algum erro.
Como utilizar as transações com PHP:
1 – Inicie uma conexão com o bando de dados:
2 – Inicie a transação, verifique que “NOME_TRANSACAO” é um nome qualquer que você deve atribuir:
3 – Inicie uma variável contador:
4 – Execute suas instruções SQL e verifique se não houve erros, caso ocorra contador é incrementado de 1:
5 – Verifique valor do contador, COMMIT se contador for 0 ou de ROLLBACK se contador for maior que 0:
Pronto nossa transação esta concluída espero que tenham gostado!
O que é transação?
É um conjunto de procedimentos que é executado num banco de dados, que para o usuário é visto como uma única ação. A integridade de uma transação depende de 4 propriedades, conhecidas como ACID.
- Atomicidade - Uma transação não pode ser executada pela metade, isto é, ou se executa ela por inteiro, ou se retorna para o estado anterior a transação, onde nada foi executado.
- Corretude - Uma transação deve ser efetuada como um programa que preserva a consistência do BD. Sendo assim, ela é de responsabilidade do programador que codifica a transação.
- Consistência - Uma Transação só executa se o estado do Banco de Dados permanecer consistente após seu fim.
- Isolamento - Sua necessidade surge em execuções concorrentes, a intercalação das diversas transações que ocorrem simultaneamente, não podem ser intercaladas de forma a gerar um estado inconsistente.
- Durabilidade - Quando ocorre falha no banco de dados, apos a execução com sucesso de uma transação, a durabilidade garante por algum mecanismo a recuperação das informações perdidas.
Comandos COMMIT e ROLLBACK
Após iniciar uma transação e executar as instruções desejadas esta transação precisa ser finalizada, para finalizá-la utilizamos “COMMIT” se não houver nenhum erro nas instruções SQL, e “ROLLBACK” se pelo menos uma instrução retornou algum erro.
Como utilizar as transações com PHP:
1 – Inicie uma conexão com o bando de dados:
<?php $dados = @mssql_connect(“host”, “user”, “senha”) or die (Erro!'); $conectar = @mssql_select_db(“banco”, $dados) or die (‘Erro!'); ?>
2 – Inicie a transação, verifique que “NOME_TRANSACAO” é um nome qualquer que você deve atribuir:
<?php mssql_query(“BEGIN TRANSACTION NOME_TRANSACAO”); ?>
3 – Inicie uma variável contador:
<?php $contador = 0; ?>
4 – Execute suas instruções SQL e verifique se não houve erros, caso ocorra contador é incrementado de 1:
<?php if(!@mssql_query(“Insert Into.....”)) $contador += 1; if(!@mssql_query(“Update Set.....”)) $contador += 1; if(!@mssql_query(“Delete From.....”)) $contador += 1; ?>
5 – Verifique valor do contador, COMMIT se contador for 0 ou de ROLLBACK se contador for maior que 0:
<?php if($contador == 0) mssql_query(“COMMIT TRANSACTION NOME_TRANSACAO”); else mssql_query(“ROLLBACK TRANSACTION NOME_TRANSACAO”); ?>
Pronto nossa transação esta concluída espero que tenham gostado!
Óla boa tarde, estou precisando inserir uns dados digitados pelo usuário em duas tabelas ao mesmo tempo, tipo todos o preenchidos irão para uma tabela A mas para tabela não quero que vai tudo como como na Tabela A, segue parte do código preciso muito terminar isso mas não estou conseguindo.
// definição geral de variáveis:
$table = 'cadastro';
$form = [
'status' => 'Cadastrar',
'submit' => 'Salvar',
'consultar' =>'Consultar',
];
# campos do formulário
$fdata = [
'descricao' => isset($_POST['descricao']) ? $_POST['descricao'] : null,
'pi' => isset($_POST['pi']) ? $_POST['pi'] : null,
'loc_anterior' => isset($_POST['loc_anterior']) ? $_POST['loc_anterior'] : null,
'localizacao' => isset($_POST['localizacao']) ? $_POST['localizacao'] : null,
'complemento' => isset($_POST['complemento']) ? $_POST['complemento'] : null,
'nota_fiscal' => isset($_POST['nota_fiscal']) ? $_POST['nota_fiscal'] : null,
'fornecedor' => isset($_POST['fornecedor']) ? $_POST['fornecedor'] : null,
'recurso' => isset($_POST['recurso']) ? $_POST['recurso'] : null,
'docente' => isset($_POST['docente']) ? $_POST['docente'] : null,
'valor_total' => isset($_POST['valor_total']) ? $_POST['valor_total'] : null,
'status_anterior' => isset($_POST['status_anterior']) ? $_POST['status_anterior'] : null,
'status' => isset($_POST['status']) ? $_POST['status'] : null,
'up_arq' => isset($_POST['up_arq']) ? $_POST['up_arq'] : null,
];
// se algo for postado
if (sizeof($_POST)) {
// trate as variáveis aqui:
// percorre os dados postados
foreach ($_POST as $k => $v) {
// scape special chars
$v = "'" . $sqli->real_escape_string($v) . "'";
// monta um array sanitizado para insert/update
$vars[] = "$k = " . $v;
}
$pi = ($_POST['pi']);
$loc_anterior = ($_POST['loc_anterior']);
$loc_atual = ($_POST['loc_atual']);
$status_anterior = ($_POST['status_anterior']);
$status_atual = ($_POST['status_atual']);
// middle query
$middle_query = $table . ' SET ' . implode(', ', $vars);
// new record case
$query = "INSERT INTO movimentação set pi = '$pi', loc_anterior = '$loc_anterior', loc_atual ='$loc_atual' ,status_anterior ='$status_anterior', status_atual = '$status_atual' "; // aqui vai para tabela Movimentao
$query = 'INSERT INTO ' . $middle_query; // aqui vai para outra tabela mas ele só garva a segunda independente da ordem que eu coloco.
// definição geral de variáveis:
$table = 'cadastro';
$form = [
'status' => 'Cadastrar',
'submit' => 'Salvar',
'consultar' =>'Consultar',
];
# campos do formulário
$fdata = [
'descricao' => isset($_POST['descricao']) ? $_POST['descricao'] : null,
'pi' => isset($_POST['pi']) ? $_POST['pi'] : null,
'loc_anterior' => isset($_POST['loc_anterior']) ? $_POST['loc_anterior'] : null,
'localizacao' => isset($_POST['localizacao']) ? $_POST['localizacao'] : null,
'complemento' => isset($_POST['complemento']) ? $_POST['complemento'] : null,
'nota_fiscal' => isset($_POST['nota_fiscal']) ? $_POST['nota_fiscal'] : null,
'fornecedor' => isset($_POST['fornecedor']) ? $_POST['fornecedor'] : null,
'recurso' => isset($_POST['recurso']) ? $_POST['recurso'] : null,
'docente' => isset($_POST['docente']) ? $_POST['docente'] : null,
'valor_total' => isset($_POST['valor_total']) ? $_POST['valor_total'] : null,
'status_anterior' => isset($_POST['status_anterior']) ? $_POST['status_anterior'] : null,
'status' => isset($_POST['status']) ? $_POST['status'] : null,
'up_arq' => isset($_POST['up_arq']) ? $_POST['up_arq'] : null,
];
// se algo for postado
if (sizeof($_POST)) {
// trate as variáveis aqui:
// percorre os dados postados
foreach ($_POST as $k => $v) {
// scape special chars
$v = "'" . $sqli->real_escape_string($v) . "'";
// monta um array sanitizado para insert/update
$vars[] = "$k = " . $v;
}
$pi = ($_POST['pi']);
$loc_anterior = ($_POST['loc_anterior']);
$loc_atual = ($_POST['loc_atual']);
$status_anterior = ($_POST['status_anterior']);
$status_atual = ($_POST['status_atual']);
// middle query
$middle_query = $table . ' SET ' . implode(', ', $vars);
// new record case
$query = "INSERT INTO movimentação set pi = '$pi', loc_anterior = '$loc_anterior', loc_atual ='$loc_atual' ,status_anterior ='$status_anterior', status_atual = '$status_atual' "; // aqui vai para tabela Movimentao
$query = 'INSERT INTO ' . $middle_query; // aqui vai para outra tabela mas ele só garva a segunda independente da ordem que eu coloco.
26/01/2017 8:05am
(~7 anos atrás)
Amigo, como faço para fazer a conexão com o SQL Server 2008?
Faz meses que tento e nada até agora. Usando mssql, srvsql ou pdo... Valeu!
Faz meses que tento e nada até agora. Usando mssql, srvsql ou pdo... Valeu!
01/11/2013 2:43pm
(~11 anos atrás)
$query = "INSERT INTO cadastro (pi, descricao, complemento, nota_fiscal,fornecedor,recurso,docente,valor_total,up_arq,loc_anterior,loc_atual,status_anterior,status_atual) VALUES('$pi', '$descricao', '$complemento', '$nota_fiscal','$fornecedor','$recurso','$docente','$valor_total','$loc_anterior','$loc_atual','$status_anterior','$status_atual' ); INSERT INTO movimentação (pi,loc_anterior,loc_atual, status_anterior, status_atual) VALUES ('$pi','$loc_anterior','$loc_atual','$status_anterior','$status_atual')";
mas da eesse erro
Falha durante a Insersao!
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'INSERT INTO movimentação (pi,loc_anterior,loc_atual, status_anterior, status_' at line 1