Ir para conteúdo
lsantgo

SELECT ... FOR UPDATE com PHP

Recommended Posts

Estou a dois dias tentando resolver esse problema, se alguém puder me ajudar eu agradeço de mais. Possuo a seguinte consulta:

SELECT proxNum FROM orcamento FOR UPDATE;

UPDATE orcamento SET proxnum = proxnum + 1;

Ela serve para que eu possa captar o próximo numero disponível para orçamento e já fazer um update adicionando 1 unidade a esse numero antes que que a aplicação quando usada por outro usuário capte o mesmo numero que outro.

A consulta funciona perfeitamente, o banco usado é oracle 11g.

Porém não consigo aplicar isso na linguagem php, pois a query não aceita 2 consultas. Já tentei usar cursores utilizando de oci_new_cursor, porém sem exito. Alguns trechos de código tentei adaptar de exemplos desse site PHP oci_new_cursor Examples Se alguém puder me ajudar por favor. Já nem sei mais o que tentar

Seguem abaixo 2 exemplos de códigos (um com cursor e outro sem) :

 

<?php
include "config.php"; //arquivo de configuração
//------------------------------------------------------------------------------------------------------//

$query2 = "BEGIN
SELECT proxnum FROM orcamento FOR UPDATE of proxnum;
UPDATE orcamento SET proxnum = proxnum + 1; 
end;";

$s2 = oci_parse($c, $query2);
if (!$s2) {
    $m2 = oci_error($c);
    trigger_error('Could not parse statement: ' . $m['message'], E_USER_ERROR);
} //prepara para a execução

$refcur = oci_new_cursor($c); 

$r2 = oci_execute($s2);
if (!$r2){
    $m2 = oci_error($s2);
    trigger_error('Could not execute statement: ' . $m['message'], E_USER_ERROR);
}// executa a consulta
 oci_execute($refcur);
?>
<?php
include "config.php"; //arquivo de configuração
//------------------------------------------------------------------------------------------------------//

$query2 = "
SELECT proxnum FROM orcamento FOR UPDATE of proxnum;
UPDATE orcamento SET proxnum = proxnum + 1; ";

$s2 = oci_parse($c, $query2);
if (!$s2) {
    $m2 = oci_error($c);
    trigger_error('Could not parse statement: ' . $m['message'], E_USER_ERROR);
} //prepara para a execução


$r2 = oci_execute($s2);
if (!$r2){
    $m2 = oci_error($s2);
    trigger_error('Could not execute statement: ' . $m['message'], E_USER_ERROR);
}// executa a consulta

?>

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consegui resolver da seguinte maneira

 

$query2 = "DECLARE
CURSOR cursore IS
SELECT proxnumorc FROM pcconsum FOR UPDATE of proxnumorc;
BEGIN
  OPEN cursore;
UPDATE pcconsum SET proxnumorc = proxnumorc + 1;
COMMIT;
  CLOSE cursore;
END;";

 

Fiz um cursor com um bloco PL/SQL e deu certo.
Porém,  preciso armazenar o resultado do select que esta dentro do cursor em uma variável php, e depois imprimir a variável.

Entretanto, quando tento, me deparo com o seguinte erro:
Warning: oci_fetch_array(): ORA-24374: define not done before fetch or execute and fetch in C:\xampp\htdocs\ProjectO\numorca.php on line 31


O retorno do cursor não é aceito. Alguem sabe como resolver isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Adicione seu código aqui.

Compartilhar este post


Link para o post
Compartilhar em outros sites
<?php
include "config.php"; //arquivo de configuração
//------------------------------------------------------------------------------------------------------//

$query2 = "DECLARE
v_consulta NUMBER;
CURSOR cursore IS
SELECT exemplo FROM tabela FOR UPDATE of exemplo;
BEGIN
  OPEN cursore;
  FETCH cursore INTO v_consulta;
 
  UPDATE tabela SET exemplo = exemplo + 1;
  COMMIT;
  CLOSE cursore;
END;";

$s2 = oci_parse($c, $query2);
if (!$s2) {
    $m2 = oci_error($c);
    trigger_error('Could not parse statement: ' . $m['message'], E_USER_ERROR);
} 

$r2 = oci_execute($s2);
if (!$r2){
    $m2 = oci_error($s2);
    trigger_error('Could not execute statement: ' . $m['message'], E_USER_ERROR);
}

$row = oci_fetch_array($s2, OCI_ASSOC + OCI_RETURN_NULLS);
$final = $row['v_consulta'];

echo $final;

?>

Esse é meu código, eu gostaria de buscar o valor retornado pelo select que esta dentro do cursor, para armazenar em uma variável php.

Compartilhar este post


Link para o post
Compartilhar em outros sites

No seu caso, não é uma simples query, e sim a execução de um cursor:

 

Depois de oci_parse e antes de oci_execute, é necessário criar o cursor:

$cursor = oci_new_cursor($c)

Além disso, depois de executar o statement ($r2 = oci_execute($s2);), execute o cursor:

oci_execute($cursor);

E itere sobre o cursor:

while ($data = oci_fetch_assoc($cursor, OCI_ASSOC + OCI_RETURN_NULLS)) {
    print_r($data);
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por BTK
      Boa noite, estou tentando criar um curl que faz cadastro no site(o proprietário está ciente disso) porem ele está me retornando (HTTP/1.1 100 Continue HTTP/1.1 302 Moved Temporarily)

       $ch = curl_init();   
          
                                                                                                                     
          curl_setopt($ch, CURLOPT_URL, "https://www.cafefacil.com.br/customer/account/create/");                                     
          curl_setopt($ch, CURLOPT_HEADER, true);                                                                                                   
          curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36');                                                                                                                                               
          curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);                                                                                         
          curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);                                                                                       
          curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);                                                                                       
          curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
          curl_setopt($ch, CURLOPT_COOKIESESSION, true);                                                                             
          curl_setopt($ch, CURLOPT_COOKIEJAR, getcwd().'/cafefacil.txt');
          curl_setopt($ch, CURLOPT_COOKIEFILE, getcwd().'/cafefacil.txt'); 
          
          
          
          
          $b1 = curl_exec($ch);
          
          $form_key = value($b1, 'type="hidden" name="form_key" value="', '"');
          
          curl_setopt($ch, CURLOPT_URL, 'https://www.cafefacil.com.br/customer/account/createpost/');                                     
          curl_setopt($ch, CURLOPT_HEADER, true);                                                                                                   
          curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36');                                                                                                                                                  
          curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);                                                                                         
          curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);                                                                                    
          curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);                                                                                       
          curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
          curl_setopt($ch, CURLOPT_COOKIESESSION, true);   
          curl_setopt($ch, CURLOPT_REFERER, 'https://www.cafefacil.com.br/customer/account/create/');                                                                           
          curl_setopt($ch, CURLOPT_COOKIEJAR, getcwd().'/cafefacil.txt');
          curl_setopt($ch, CURLOPT_COOKIEFILE, getcwd().'/cafefacil.txt'); 
          curl_setopt($ch, CURLOPT_POST, 1);                                                                                                    
          $boundary = '---------------------------WebKitFormBoundaryRQ3KHJbpfmPf11v6';
          
          $data = '-----------------------------'.$boundary.'
          Content-Disposition: form-data; name="success_url"
          
          
          -----------------------------'.$boundary.'
          Content-Disposition: form-data; name="error_url"
          
          
          -----------------------------'.$boundary.'
          Content-Disposition: form-data; name="form_key"
          
          '.$form_key.'
          -----------------------------'.$boundary.'
          Content-Disposition: form-data; name="tipopessoa"
          
          15
          -----------------------------'.$boundary.'
          Content-Disposition: form-data; name="firstname"
          
          NomeTest SobreNomeTest
          -----------------------------'.$boundary.'
          Content-Disposition: form-data; name="nomefantasia"
          
          
          -----------------------------'.$boundary.'
          Content-Disposition: form-data; name="inscricaoestadual"
          
          
          -----------------------------'.$boundary.'
          Content-Disposition: form-data; name="email"
          
          nometestsobrenometest@gmail.com
          -----------------------------'.$boundary.'
          Content-Disposition: form-data; name="day"
          
          01
          -----------------------------'.$boundary.'
          Content-Disposition: form-data; name="month"
          
          01
          -----------------------------'.$boundary.'
          Content-Disposition: form-data; name="year"
          
          1990
          -----------------------------'.$boundary.'
          Content-Disposition: form-data; name="dob"
          
          01/01/1990
          -----------------------------'.$boundary.'
          Content-Disposition: form-data; name="taxvat"
          
          199.758.750-50
          -----------------------------'.$boundary.'
          Content-Disposition: form-data; name="celular"
          
          (11)4712-8491
          -----------------------------'.$boundary.'
          Content-Disposition: form-data; name="password"
          
          senhatest
          -----------------------------'.$boundary.'
          Content-Disposition: form-data; name="confirmation"
          
          senhatest
          -----------------------------'.$boundary.'
          Content-Disposition: form-data; name="persistent_remember_me"
          
          on
          -----------------------------'.$boundary.'--';
          
          $header[] = "Content-Type: multipart/form-data; boundary=".$boundary;
          curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
          curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 
          
            
          echo $exec = curl_exec($ch);
          curl_close($ch);
    • Por sadamkim
      Pessoal,  me deparei com um problema.
      Tenho uma Tabela, onde fica armazenada as transações dos clientes.
      Cada transação tem vários registros com o campo STATUS.
       
      Preciso fazer um MAX, para pegar a ultima transação por data, e assim saber qual foi o status da mesma.
      Mas ao utilizar o MAX e selecionar o campo STATUS ele me traz todos os registro, porque o mesmo não pode agrupar por status, por conter valores diferentes.
      É possível criar alguma forma de selecionar no meu caso a ultima transação por data (MAX) e trazer o campo status?
      Seja com alguma procedure, ou outra função do ORACLE.


    • Por allencar.limma
      Tento incluir as informações de um formulário no banco de dados e não consigo. conforme código abaixo.
      <? /*Incluir as informações no formulario */ include "config.php"; $nome = trim($_POST['nome']); $masp = trim($_POST['masp']); $cpf = trim($_POST['cpf']); $telefone = trim($_POST['telefone']); $email = trim($_POST['email']); $endereco = trim($_POST['endereco']); $data_nascimento = trim($_POST['data_nascimento']); $unidade_lotacao = trim($_POST['unidade_lotacao']); /* Vamos checar algum erro nos campos */ if ((!$nome) || (!$masp) || (!$cpf) || (!$telefone) || (!$email) || (!$endereco) || (!$data_nascimento) || (!$unidade_lotacao)){ echo "ERRO: <br /><br />"; if (!$nome){ echo "Nome Completo é requerido.<br />"; } if (!$masp){ echo "Masp é requerido.<br />"; } if (!$cpf){ echo "CPF é requerido.<br /)>"; } if (!$telefone){ echo "Telefone é requerido.<br />"; } if (!$email){ echo "Email é requerido.<br />"; } if (!$endereco){ echo "Endereço é requerido.<br />"; } if (!$data_nascimento){ echo "Data de Nascimento é requerido.<br />"; } if (!$unidade_lotacao){ echo "Unidade de Lotação é requerido.<br>"; } echo "Preencha os campos abaixo: <br />"; include "formulario_cadastro.php"; }else { /* Vamos checar se o nome de Usuário escolhido e/ou Email já existem no banco de dados */ $sql_email_check = mysql_query( "SELECT COUNT(usuario_id) FROM usuarios WHERE email='{$email}'" ); $sql_masp_check = mysql_query( "SELECT COUNT(usuario_id) FROM usuarios WHERE masp='{$masp}'" ); $sql_cpf_check = mysql_query( "SELECT COUNT(usuario_id) FROM usuarios WHERE cpf='{$cpf}'" ); $eReg = mysql_fetch_array($sql_email_check); $uReg = mysql_fetch_array($sql_masp_check); $uReg = mysql_fetch_array($sql_cpf_check); $email_check = $eReg[0]; $masp_check = $uReg[0]; $cpf_check = $uReg[0]; if (($email_check > 0) || ($masp_check > 0) || ($cpf_check > 0)){ echo "<strong>ERRO</strong>: <br /><br />"; if ($email_check > 0){ echo "Este email já está sendo utilizado.<br /><br />"; unset($email); } if ($masp_check > 0){ echo "Este Masp já está sendo utilizado.<br /><br />"; unset($masp); } if ($cpf_check > 0){ echo "Este CPF já está sendo utilizado.<br /><br />"; unset($cpf); } include "formulario_cadastro.php"; }else{ /* Se passarmos por esta verificação ilesos é hora de finalmente cadastrar os dados. Vamos utilizar uma função para gerar a senha de forma randômica*/ function makeRandomPassword(){ $salt = "abchefghjkmnpqrstuvwxyz0123456789"; srand((double)microtime()*1000000); $i = 0; while ($i <= 7){ $num = rand() % 33; $tmp = substr($salt, $num, 1); $pass = $pass . $tmp; $i++; } return $pass; } $senha_randomica = makeRandomPassword(); $senha = md5($senha_randomica); // Inserindo os dados no banco de dados //$cpf = htmlspecialchars($cpf); ***RETIRADO PELO FATO DE NÃO ESTA SENDO USADO $sql = mysql_query( "INSERT INTO usuarios (none, masp, cpf, telefone, email, endereco, data_nascimento, unidade_lotacao) VALUES ('$nome', '$masp', '$cpf', '$telefone', '$email', '$endereco', '$data_nascimento', '$unidade_lotacao', now())") or die( mysql_error() ); if (!$sql){ echo "Ocorreu um erro ao criar sua conta, entre em contato."; }else{ $usuario_id = mysql_insert_id(); // Enviar um email ao usuário para confirmação e ativar o cadastro! $headers = "MIME-Version: 1.0\n"; $headers .= "Content-type: text/html; charset=iso-8859-1\n"; $headers .= "From: RCI - <rci@rcionline.com.br>"; $subject = "Confirmação de cadastro - www.rcionline.com.br"; $mensagem = "Prezado {$nome} {$masp},<br /> Obrigado pelo seu cadastro em nosso site, <a href='http://www.rcionline.com.br'> http://www.rcionline.com.br</a>!<br /> <br /> Para confirmar seu cadastro e ativar sua conta em nosso site, podendo acessar à áreas exclusivas, por favor clique no link abaixo ou copie e cole na barra de endereço do seu navegador.<br /> <br /> <a href='http://www.rcionline.com.br/ativar.php?id={$usuario_id}&code={$senha}'> http://www.rcionline.com.br/ativar.php?id={$usuario_id}&code={$senha} </a> <br /> <br /> Após a ativação de sua conta, você poderá ter acesso ao conteúdo exclusivo efetuado o login com os seguintes dados abaixo:<br > <br /> <strong>Usuario</strong>: {$usuario_id}<br /> <strong>Senha</strong>: {$senha_randomica}<br /> <br /> Obrigado!<br /> <br /> Webmaster<br /> <br /> <br /> Esta é uma mensagem automática, por favor não responda!"; mail($email, $subject, $mensagem, $headers); echo "Foi enviado para seu email - ( ".$email." ) um pedido de confirmação de cadastro, por favor verifique e sigas as instruções!"; } } } ?>  
    • Por vinicius.david
      Gostaria que fosse possível encontrar produtos pela marca no Opencart 2.3.0.2. Quando a pessoa digitar no buscar a marca do produto, ele deveria mostrar todos os produtos que pertencem aquela marca. Em catalog/model/catalog/product.php já existe por padrão a função de procurar por fabricante: 

      if (!empty($data['filter_manufacturer_id'])) {                 $sql .= " AND p.manufacturer_id = '" . (int) $data['filter_manufacturer_id'] . "'";             }
      Mas ela não faz a função de procurar por marca. Alguém já encontrou alguma solução na internet para este caso?
    • Por manolegal
      Bom dia.
      Recebo em meu formulário um dado em forma de url.
      Extraio desta url o CNPJ da empresa. A seguir faço uma pesquisa para verificar se este CNPJ está em minha base de dados, sendo que se estiver trago dados da empresa para preenchimento do campo empresa do formulário.
      Estando a empresa no BD, consigo trazer os dados corretamente, porém estes dados não passados para o formulário para serem o valor inicial do campo empresa.
      $cnpj_numero = 12345678910; $Sql_cnpj = "SELECT id_empresa as id_empresa_bd_ext, upper(empresas.empresa) as fornecedor_bd_ext FROM empresas WHERE empresas.cnpj = '$cnpj_numero'"; $Resultado_cnpj = executa($Sql_cnpj); while ($linha_cnpj = pg_fetch_array($Resultado_cnpj)){ $empresa_bd_ext = $linha_cnpj["fornecedor_bd_ext"]; $forn_hid_bd_ext = $linha_cnpj["id_empresa_bd_ext"]; } echo "Fornecedor BD: $empresa_bd_ext - $forn_hid_bd_ext<br><hr>"; // Está mostrando dados corretamente // Definir valor a ser recebido pelo campo Empresa do Formulário if ($cnpj_numero != ""){ $empresa = $empresa_bd_ext; $forn_hid = $forn_hid_bd_ext; }else{ // Caso url não tenha trazido CNPJ, atribuo outro valor $empresa = $empresa_bd; $forn_hid = $forn_hid_bd; } O campo empresa do formulário não está recebendo o valor de $empresa. Considerando que exista um CNPJ, onde pode estar o problema?
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.