Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

irineusturza

mysql_insert_id retona 0

Recommended Posts

Ola,

 

Script abaixo realiza a inserção no banco, a tabela tem id auto-increment, o mysql_insert_id retona 0.

 

Repassei vários tópicos e nenhuma solução me ajudou.

 

Eu acredito que seja devido ao include.

 

Desde já agradeço a ajuda de todos.

 

-----------------------------------------

 

<?php

//resgata as informacoes recebidas
$codAgencia = $_REQUEST["codAgencia"];
$codSolicitante = $_REQUEST["codSolicitante"];
$codServico = $_REQUEST["codServico"];
$nomeServico = $_REQUEST["nomeServico"];
$valorServico = $_REQUEST["valorServico"];
$placa = $_REQUEST["placa"];
$nomeCliente = $_REQUEST["nomeCliente"];
$cpfCnpj = $_REQUEST["cpfCnpj"];
$nMatricula = $_REQUEST["nMatricula"];
$endereco = $_REQUEST["endereco"];
$cartorio = $_REQUEST["cartorio"];
$cidade = $_REQUEST["cidade"];
$nomePais = $_REQUEST["nomePais"];
$dtNascimento = $_REQUEST["dtNascimento"];




include("../funcao/funcao_inserir.php");
inserir(array("dtNascimento","nomePais","cidade","cartorio","endereco","nMatricula","codAgencia","codSolicitante","codServico","nomeServico","valorServico","placa","nomeCliente","cpfCnpj"),
array("",$dtNascimento,$nomePais,$cidade,$cartorio,$endereco,$nMatricula,$codAgencia,$codSolicitante,$codServico,$nomeServico,$valorServico,$placa,$nomeCliente,$cpfCnpj), "orders");


//retorna o id do ultimo insert feito no banco
$consultaOrdem = mysql_insert_id();


header('Location: ../pedido_05.php?codPedido='.$consultaOrdem.'&codAgencia='.$codAgencia.'&codSolicitante='.$codSolicitante);
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que a função inserir() faz exatamente? Talvez ela execute algo depois do INSERT ou até encerre a conexão, por isso o insert_id falha.

 

Outra coisa, habilite todas as exibições de erro, como mostrado neste tópico, na Orientação No. 2. Pode dar alguma pista

 

 

 

PS: funções mysql_* estão obsoletas desde o PHP 5.5 e já foram removidas no PHP 7. Prefira usar MySQLi ou PDO. Veja mais aqui: http://rberaldo.com.br/mysql-obsoleto-php/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola Beraldo,

 

Segue codigo da insert

 

<?php
include("../conexao/conexao.php");
include("../conexao/fecha_conexao.php");

function inserir($coluna, $valor, $tabela){

//verificar se sao arrays
if ((is_array($coluna)) and (is_array($valor))){

//verificar se tem o mesmo numero de elementos
if((count($coluna)) == (count($valor))){

//montar SQL
// implode = junta os elemento de uma matriz em uma string
$inserir = "INSERT INTO {$tabela} (".implode(', ',$coluna).")
VALUES ('".implode('\',\'',$valor)."')";
}else{
return false;
}
}else{
//montar a SQL
$inserir = "INSERT INTO {$tabela} ({$coluna}) VALUES('{$valor}')";
}

//verifica se conectou
if($conexao = connect()){

//inseriu?
if(mysqli_query($conexao, $inserir)){
//fecha conexao
fechaConexao($conexao);
return true;
}else{
echo "query invalida";
return false;
}
}else{
return false;
}


}


?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

ok, ajustado.

 

de "mysql_insert_id()" para "mysqli_insert_id()".

"fechaConexao($conexao);" também comentado/desabilitado.

 

 

porem agora o "mysqli_insert_id()" nao retorna nenhum valor.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

Ajustei como você havia informado. Porem, apesar o insert funcionar, não retorna nada.

 

Segue código ajustado, com fechaConexao já comentado/desabilitado.

 

----------------------------------------------------------

<?php
ini_set('display_errors', true);
error_reporting(E_ALL);


//resgata as informacoes recebidas
$codAgencia = isset($_REQUEST["codAgencia"]) ? $_REQUEST["codAgencia"] : "";
$codSolicitante = isset($_REQUEST["codSolicitante"]) ? $_REQUEST["codSolicitante"] : "";
$codServico = isset($_REQUEST["codServico"]) ? $_REQUEST["codServico"] : "";
$nomeServico = isset($_REQUEST["nomeServico"]) ? $_REQUEST["nomeServico"] : "";
$valorServico = isset($_REQUEST["valorServico"]) ? $_REQUEST["valorServico"] : "";
$placa = isset($_REQUEST["placa"]) ? $_REQUEST["placa"] : "";
$nomeCliente = isset($_REQUEST["nomeCliente"]) ? $_REQUEST["nomeCliente"] : "";
$cpfCnpj = isset($_REQUEST["cpfCnpj"]) ? $_REQUEST["cpfCnpj"] : "";
$nMatricula = isset($_REQUEST["nMatricula"]) ? $_REQUEST["nMatricula"] : "";
$endereco = isset($_REQUEST["endereco"]) ? $_REQUEST["endereco"] : "";
$cartorio = isset($_REQUEST["cartorio"]) ? $_REQUEST["cartorio"] : "";
$cidade = isset($_REQUEST["cidade"]) ? $_REQUEST["cidade"] : "";
$nomePais = isset($_REQUEST["nomePais"]) ? $_REQUEST["nomePais"] : "";
$dtNascimento = isset($_REQUEST["dtNascimento"]) ? $_REQUEST["dtNascimento"] : "";


include("../funcao/funcao_inserir.php");
inserir(array("dtNascimento","nomePais","cidade","cartorio","endereco","nMatricula","codAgencia","codSolicitante","codServico","nomeServico","valorServico","placa","nomeCliente","cpfCnpj"),
array($dtNascimento,$nomePais,$cidade,$cartorio,$endereco,$nMatricula,$codAgencia,$codSolicitante,$codServico,$nomeServico,$valorServico,$placa,$nomeCliente,$cpfCnpj), "orders");


//retorna o id do ultimo insert feito no banco
$consultaOrdem = mysqli_insert_id($inserir);


header('Location: ../pedido_05.php?codPedido='.$consultaOrdem.'&codAgencia='.$codAgencia.'&codSolicitante='.$codSolicitante);
?>

 

 

------------------------

 

<?php
ini_set('display_errors', true);
error_reporting(E_ALL);

include("../conexao/conexao.php");
//include("../conexao/fecha_conexao.php");

function inserir($coluna, $valor, $tabela){

//verificar se sao arrays
if ((is_array($coluna)) and (is_array($valor))){

//verificar se tem o mesmo numero de elementos
if((count($coluna)) == (count($valor))){

//montar SQL
// implode = junta os elemento de uma matriz em uma string
$inserir = "INSERT INTO {$tabela} (".implode(', ',$coluna).")
VALUES ('".implode('\',\'',$valor)."')";
}else{
return false;
}
}else{
//montar a SQL
$inserir = "INSERT INTO {$tabela} ({$coluna}) VALUES('{$valor}')";
}

//verifica se conectou
if($conexao = connect()){

//inseriu?
if(mysqli_query($conexao, $inserir)){
//fecha conexao
//fechaConexao($conexao);
return true;
}else{
echo "query invalida";
return false;
}
}else{
return false;
}


}


?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

$inserir não existe no escopo global. Não tem como passar essa variável para mysqli_insert_id()

 

O parâmetro dessa função é o link de conexão, ou seja, o retorno de mysqli_connct.

 

Você precisa remodelar seu código. O insert_id terá que ser executado dentro do inserir(), por exemplo, ou o método deve retornar o link de conexão, para que possa ser usado pelo mysqli_insert_id

 

Dê uma lida nestes links:

http://php.net/manual/pt_BR/language.variables.scope.php

http://php.net/manual/pt_BR/mysqli.insert-id.php

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por eacpaula
      Olá Pessoal!
       
      Estou com problema para inserção de tabelas relacionadas, pesquisei diversos sites e fóruns para tentar entender qual seria a melhor forma.
       
      Então, vi que precisaria capturar o último ID inserido da tabela pai (coluna autoincrement) para chave pk da tabela filha, encontrei os seguintes métodos:
      LAST_INSERT_ID() - MYSQL
      mysql_insert_id() - PHP
      lastinserid() - PDO
      Realmente, tive uma exaustiva tentativa de uso destes métodos, não sou experiente com PHP e tenho bastante dificuldade.
       
      Além deste problema de inserção de tabelas relacionadas, nesta ocasião a uma "coluna pk" que não vou precisar preencher, porém, como é obrigatório o preenchimento, após não saberei como proceder.
       
      Então vamos ao meu cenário:

      //DADOS BANCARIOSCREATE TABLE IF NOT EXISTS `dados_bancarios_pf` ( `id` int(11) unsigned NOT NULL, `banco` varchar(50) NOT NULL, `agencia` varchar(15) NOT NULL, `conta` varchar(15) NOT NULL, `tipo` varchar(30) NOT NULL, `titular` varchar(50) NOT NULL) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=latin1;//CLIENTESCREATE TABLE IF NOT EXISTS `clientes_pf` ( `id` int(11) unsigned NOT NULL, `banco_id` int(11) unsigned NOT NULL, `titulo_id` int(11) unsigned NOT NULL, `nome` varchar(20) NOT NULL, `sobrenome` varchar(50) NOT NULL, `nome_completo` varchar(70) NOT NULL, `cpf` varchar(11) NOT NULL, `rg` varchar(10) NOT NULL, `cep` varchar(8) NOT NULL, `endereco` varchar(45) NOT NULL, `bairro` varchar(30) NOT NULL, `cidade` varchar(50) NOT NULL, `estado` varchar(30) NOT NULL, `pais` varchar(30) NOT NULL, `telefone_residencial` varchar(11) NOT NULL, `celular` varchar(11) NOT NULL, `email` varchar(50) NOT NULL, `cargo` varchar(30) NOT NULL, `sexo` varchar(12) NOT NULL, `estado_civil` varchar(12) NOT NULL, `data_nascimento` date NOT NULL) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1; a coluna abaixo, no cadastro de clientes não precisa ser iniciada visto que de primeiro momento é só cadastro de clientes

      `titulo_id` int(11) unsigned NOT NULL, Quanto ao código php que segue abaixo, está bem básico, sei que posteriormente tenho que ver algo para consultar se os dados já existem e deixar de uma forma mais consistente, porém, de momento gostaria de entender bem este insert com tabelas relacionadas:

      <?php include "../include/conecta_banco.inc"; require_once ('../include/funcoes.php'); conexao(); //dados bancarios $banco = $_POST["bancoPF"]; $agencia = $_POST["agenciaPF"]; $conta = $_POST["contaPF"]; $tipo = $_POST["tipoBancoPF"]; $titular = $_POST["titularPF"]; $string_sql_banco = "INSERT INTO dados_bancarios_pf (banco, agencia, conta, tipo, titular) VALUES ('$banco','$agencia','$conta','$tipo','$titular')"; /*RECUPERANDO ÚLTIMO ID - TENTATIVA COM FUNÇÃO NATIVA PHP $ref_id_banco = mysql_insert_id($link); printf ("Nova gravação dos dados bancários inserida com o id %d.\n", $ref_id_banco); */ //RECUPERANDO ÚLTIMO ID - TENTATIVA COM COMANDO MYSQL $consult_last_id = "SELECT LAST_INSERT_ID()"; //CONSULTA $resultado = mysql_query($consult_last_id) or die ("PROBLEMAS COM A CONSULTA; ".mysql_error()); // CONSULTA ENVIADA AO SGBD $ref_id_banco = mysql_fetch_row($resultado); // RECUPERANDO O QUE FOR RETORNADO EM UM ARRAY - $ref_id_banco echo $ref_id_banco[0]; /* //RECUPERANDO ÚLTIMO ID - TENTATIVA 2 COM COMANDO MYSQL $consult_last_id = "SELECT LAST_INSERT_ID() AS id FROM dados_bancarios_pf"; $resultado = mysql_query($consult_last_id) or die ("PROBLEMAS COM A CONSULTA; ".mysql_error()); $ref_id_banco = mysql_result ($resultado, 0, 'id'); echo $ref_id_banco[0]; */ //dados do cliente $nome = $_POST["nomePF"]; $sobrenome = $_POST["sobrenomePF"]; $nome_completo = $_POST["nomeCompletoPF"]; $rg = $_POST["rgPF"]; $cpf = $_POST["cpfPF"]; $cep = $_POST["cepPF"]; $endereco = $_POST["enderecoResidencial"]; $bairro = $_POST["bairroPF"]; $cidade = $_POST["cidadePF"]; $estado = $_POST["estadoPF"]; $pais = $_POST["paisPF"]; $telefone_residencial = $_POST["telPF"]; $celular = $_POST["celPF"]; $email = $_POST["emailPJ"]; $cargo = $_POST["cargoPF"]; $sexo = $_POST["sexoPF"]; $estado_civil = $_POST["estadoCivilPF"]; $data_nascimento = $_POST["dataNascimentoPF"]; $string_sql_cliente = "INSERT INTO clientes_pf (id, banco_id, titulo_id, nome, sobrenome, nome_completo, cpf, rg, cep, endereco, bairro, cidade, estado, pais, telefone_residencial, celular, email, cargo, sexo, estado_civil, data_nascimento) VALUES (null,'$ref_id_banco',null,'$nome','$sobrenome','$nome_completo','$cpf','$rg','$cep','$endereco','$bairro','$cidade','$estado','$pais','$telefone_residencial','$celular','$email','$cargo','$sexo','$estado_civil','$data_nascimento')"; if (inserir($string_sql_banco)){ if (inserir($string_sql_cliente)){ echo ('Registros incluídos com sucesso! <a href="">voltar</a>'); }else{ echo('<p align=center>Erro durante a inserção de registros! - Cliente PF <a href="">voltar</a></p>'). mysql_error(); } }else{ echo('<p align=center>Erro durante a inserção de registros! - Dados Bancários <a href="">voltar</a></p>'). mysql_error(); }?> Então como podem ver constam as minhas tentativas de captura, sendo que a mais assertiva foi a "primeira tentativa com comando", pelas minhas pesquisas, ví que melhor opção seria com o comando de SQL, pois:
      Retorna sempre o último ID num sério de inserções múltiplas e é o mais seguro;
      Quero fazer esta implementação sem gambiarras usando um select para ver o último ID inserindo, quero sempre implementar com as melhores práticas possíveis para poder levar este conhecimento em qualquer cenário, agradeço muiiiiitíssmo a ajuda!
       
      Se alguém puder me dar um help?
×

Informação importante

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