transação (PHP+Postgre)

Enviada por Hugo 
Hugo
transação (PHP+Postgre)
06 de December de 2005 às 03:24PM
Galera, por favor, me corrigam se eu tiver errado. Estou operando com um banco PorgreSql e num cadastro que envolve 4 tabelas, faço uma transação, claro ehehe
O problema é que a transação não está funcionando, desconfio o que seja e gostaria que vocês dissessem se é por isso mesmo.
basicamente é isso:
$conexao();

pg_query($conexao,"begin");

$sql1 = "insert ...";
$res1 = pg_query($conexao,$sql1)

if (!$res1) {
@pg_query($conexao,"rollback");
}

$sql2 = "insert ...";
$res2 = pg_query($conexao,$sql2)

if (!$res2) {
@pg_query($conexao,"rollback");
}
.
. (outras duas tabelas)
.

pg_query($conexao,"commit");

então, minha desconfiança, é que faço a verificação diretamente no $res. Eu teria que atribuir true ou false à uma flag ou assim diretamente teria que funcionar?
Se não entenderem, posso explicar novamente.
Desde já agradeço, valeu!
Vanessa Schissato
Re: transação (PHP+Postgre)
06 de December de 2005 às 03:40PM
OIE...

BOM....EU PUBLIQUEI UM SCRIPT DE UMA CLASSE DE TRANSAÇÃO PARA BD POSTGRESQL ESSES DIAS:
http://www.phpbrasil.com/scripts/script.php/id/2649

MAS NO SEU SCRIPT AE...

EU ACHO QUE SÓ FUNCIONA SE VC COLOCAR
"BEGIN TRANSACTION", "ROLLBACK TRANSACTION", "COMMIT TRANSACTION"....EM VEZ DE BEGIN, ROLLBACK E COMMIT

Além do mais, vc podia atribuir a uma variável $contadora os problemas...e por um if dava commit ou rollback soh no final...

Mas qt a sua dúvida ae...do if(!$res) eh pra dar certo sim
;)


TENTA ASSIM:

$conexao();

pg_query($conexao,"BEGIN TRANSACTION");

$sql1 = "insert ...";
$res1 = @pg_query($conexao,$sql1) or die $contadora++;

$sql2 = "insert ...";
$res2 = @pg_query($conexao,$sql2) or die $contadora++;

.
. (outras duas tabelas)
.

if($contadora){
pg_query($conexao,"ROLLBACK TRANSACTION");
}else{
pg_query($conexao,"COMMIT TRANSACTION");
}


;)
Hugo
Re: transação (PHP+Postgre)
07 de December de 2005 às 09:54AM
Vanessa, ocorre um erro de 'variável não esperada' na linha do $res1 = @pg_query($conexao,$sql1) or die $contadora++;
meu rollback continua não funcionando :s
Vanessa Schissato
Re: transação (PHP+Postgre)
07 de December de 2005 às 10:30AM
tenta assim:

$conexao();

pg_query($conexao,"BEGIN TRANSACTION");

$sql1 = "insert ...";
if(!$res1 = @pg_query($conexao,$sql1)) $contadora++;

$sql2 = "insert ...";
if(!$res2 = @pg_query($conexao,$sql2)) $contadora++;

.
. (outras duas tabelas)
.

if($contadora){
pg_query($conexao,"ROLLBACK TRANSACTION");
}else{
pg_query($conexao,"COMMIT TRANSACTION");
}
joannes
Re: transação (PHP+Postgre)
26 de January de 2017 às 02:07PM
Ó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.
joannes
inserir dados em duas tabelas diferentes
26 de January de 2017 às 02:07PM
Ó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.
Eduardo Molina
Re: transação (PHP+Postgre)
18 de February de 2017 às 02:58PM
amigo, peço que de uma olhada na sintaxe de seu insert, pois tu esta ajuntando o insert com o update.
Você precisa estar logado no PHPBrasil.com para poder enviar mensagens para os nossos fóruns.

Faça o login aqui.