Jump to content


Photo

Mysql_insert_id()


  • Faça o login para participar
11 replies to this topic

#1 dilneiss

dilneiss

    Dilnei Soethe Spancerski

  • Usuários
  • 146 posts
  • Sexo:Masculino

Posted 15/07/2009, 15:53

Tenho uma dúvida usando isso..

estou com esse código:
mysql_query("
INSERT INTO isc_products 
(prodname, prodtype, prodcode, proddesc, prodsearchkeywords, prodprice, prodcostprice, prodretailprice, prodsaleprice, prodcalculatedprice, prodistaxable, prodsortorder, prodvisible, prodfeatured, prodvendorfeatured, prodrelatedproducts, prodcurrentinv, prodlowinv, prodoptionsrequired, prodwarranty, prodweight, prodwidth, prodheight, proddepth, prodfixedshippingcost, prodfreeshipping, prodinvtrack, prodratingtotal, prodnumratings, prodnumsold, proddateadded, prodbrandid, prodnumviews, prodpagetitle, prodmetakeywords, prodmetadesc, prodlayoutfile, prodvariationid, prodallowpurchases, prodhideprice, prodcatids, prodlastmodified, prodvendorid, prodhastags, prodwrapoptions) 
VALUES 
('$nome_produto_local_ok', '$tipo_venda', '$codigo_produto_local', '$descricao_produto_ok', '$prodsearchkeywords', '$precovenda_produto_local', '$precocompra_produto_local', '$prodretailprice', '$prodsaleprice', '$precovenda_produto_local', '$prodistaxable', '$prodsortorder', '$prodvisible', '$prodfeatured', '$prodvendorfeatured', '$prodrelatedproducts', '$estoque_produto_local_ok', '$prodlowinv', '$prodoptionsrequired', '$nome_garantia', '$peso_produto_local', '$prodwidth', '$prodheight', '$proddepth', '$prodfixedshippingcost', '$prodfreeshipping', '$prodinvtrack', '$prodratingtotal', '$prodnumratings', '$prodnumsold', '$proddateadded', '$prodbrandid', '$prodnumviews', '$prodpagetitle', '$prodmetakeywords', '$prodmetadesc', '$prodlayoutfile', '$prodvariationid', '$prodallowpurchases', '$prodhideprice', '$id_categoria_remota', '$prodlastmodified', '$prodvendorid', '$prodhastags', '$prodwrapoptions')
 ON DUPLICATE KEY UPDATE
`prodname` = 				'$nome_produto_local_ok',
`proddesc` = 				'$descricao_produto_ok',
`prodsearchkeywords` = 		'$prodsearchkeywords',
`prodprice` = 				'$precovenda_produto_local',
`prodcostprice` = 			'$precocompra_produto_local',
`prodcalculatedprice` = 	'$precovenda_produto_local',
`prodvisible` = 			'$prodvisible',
`prodcurrentinv` = 			'$estoque_produto_local_ok',
`prodwarranty` = 			'$nome_garantia',
`prodweight` = 				'$peso_produto_local',
`prodpagetitle` = 			'$nome_produto_local_ok',
`prodmetakeywords` = 		'$prodsearchkeywords',
`prodmetadesc` = 			'$prodmetadesc',
`prodallowpurchases` = 		'$prodallowpurchases',
`prodcatids` = 				'$id_categoria_remota',
`prodlastmodified` = 		'$prodlastmodified'
", $link_remoto);

$numero_registro_inserido = mysql_insert_id();

//Agora aqui está inserindo uma categoria para o produto.
mysql_query("INSERT INTO isc_categoryassociations (productid, categoryid) VALUES 									('$numero_registro_inserido', '$id_categoria_remota') 
 ON DUPLICATE KEY UPDATE
 `productid` = '$numero_registro_inserido',
 `categoryid` = '$id_categoria_remota'
", $link_remoto);


Como devem ter percebido, a segunda query depende da primeira para saber onde editar ou inserir..
Como posso usar corretamente essa parte sem ter problemas?

Gente estou conseguindo fazer algúma coisa aqui no modo "gambiarra"... Como eu faço para identificar o mysql_insert_id de certo insert?
Pois dentro do código, possuo 5 INSERT, como faço para no INSERT 4 identificar o insert gerado no 3 etc?
<?php
define("MELHOR_FORUM_DO_MUNDO", "Webmasters Online");
echo MELHOR_FORUM_DO_MUNDO;
?>

#2 Fábio Sciubba

Fábio Sciubba

    Turista

  • Usuários
  • 30 posts
  • Sexo:Não informado

Posted 15/07/2009, 16:36

[codebox]
$insert_usuario = mysql_query('...');
$insert_qualquer_coisa = mysql_query('...');

$id_usuario = mysql_insert_id($insert_usuario);
[/codebox]
;)

#3 Claudiobrother

Claudiobrother

    Novato no fórum

  • Usuários
  • 16 posts
  • Sexo:Não informado

Posted 15/07/2009, 20:08

Para sanar todas as suas dúvidas sobre essa função clique aqui e leia sobre mysql_insert_id()

#4 dilneiss

dilneiss

    Dilnei Soethe Spancerski

  • Usuários
  • 146 posts
  • Sexo:Masculino

Posted 15/07/2009, 22:35

estou tentando o seguinte código:
$insert_cadastro = mysql_query("INSERT INTO usuarios 
(nome, login, pergunta_secreta, resposta_secreta, email, senha, senha_temp, creditos, tipo_conta, data_cadastro, dia_nasc, mes_nasc, ano_nasc, creditos_ganho, hits, upline_n1, upline_n2, upline_n3, upline_n4, upline_n5, upline_n6, upline_n7, upline_n8, upline_n9, upline_n10, indicacoes, categorias_ver, linguagem_ver, surfs_manual, surfs_auto) 
VALUES 
('$cadastro_nome_completo', '$cadastro_usuario', '', '', '$cadastro_email', '', '$senha_temporaria', '', '0', '$dia_mes_ano_servidor', '$cadastro_dia_nasc', '$cadastro_mes_nasc', '$cadastro_ano_nasc', '0', '0', '$cadastro_upline', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '$cadastro_categoria_ver', '$cadastro_linguagem_ver', '0', '0') 
") or die(mysql_error());
$id_usuario_inserido = mysql_insert_id("$insert_cadastro");

mas está dando erro...


Warning: mysql_insert_id(): supplied argument is not a valid MySQL-Link resource in includes\formulario-enviaemail-adiciona-no-banco.php on line 13


linha 13 = $id_usuario_inserido = mysql_insert_id('$insert_cadastro');



e agora? :S
<?php
define("MELHOR_FORUM_DO_MUNDO", "Webmasters Online");
echo MELHOR_FORUM_DO_MUNDO;
?>

#5 Ferlouko x)

Ferlouko x)

    Normal

  • Usuários
  • 72 posts
  • Sexo:Masculino
  • Localidade:Guararapes
  • Interesses:PHP, OOP, DESIGN PATTERNS, mySQL, XML, (X)HTML, CSS, TABLELESS, PHP-GTK, JAVA, C++.

Posted 16/07/2009, 00:33

Concordo @Claudiobrother , leia o manual(mysql_insert_id) (y)

Mas vamos lá :assobio:

Você deve passar como argumento o link da conexão, não o da query :
$conexao = mysql_connect('server','user','pass');
/* .. */
$id = mysql_insert_id($conexao);

Atentamente leia :

Cuidado
mysql_insert_id() converte o tipo de retorno nativo da API em C do MySQL mysql_insert_id() para um tipo long (chamado int no PHP). Se a sua coluna AUTO_INCREMENT for uma coluna do tipo BIGINT, o valor retornado por mysql_insert_id() será incorreto. Ao invés, use a função SQL interna do MySQL LAST_INSERT_ID() em uma consulta SQL.


Se for o caso, então use :

SELECT LAST_INSERT_ID(`campo`) FROM `tabela` ORDER BY `campo` DESC LIMIT 1


[]'s

flws

Edição feita por: Ferlouko x), 16/07/2009, 00:35.

<?php
/**
* @author. . .Fernando Rodrigo Cardoso < ferlouko (at) gmail.com >
* @desc. . . .Desenv. PHP, (X)HTML, CSS, JS E AJAX, aprendiz JAVA, aprendiz C/C++ (...)
*/
?>

#6 dilneiss

dilneiss

    Dilnei Soethe Spancerski

  • Usuários
  • 146 posts
  • Sexo:Masculino

Posted 17/07/2009, 11:35

Concordo @Claudiobrother , leia o manual(mysql_insert_id) (y)

Mas vamos lá :assobio:

Você deve passar como argumento o link da conexão, não o da query :

$conexao = mysql_connect('server','user','pass');
/* .. */
$id = mysql_insert_id($conexao);

Atentamente leia :

Cuidado
mysql_insert_id() converte o tipo de retorno nativo da API em C do MySQL mysql_insert_id() para um tipo long (chamado int no PHP). Se a sua coluna AUTO_INCREMENT for uma coluna do tipo BIGINT, o valor retornado por mysql_insert_id() será incorreto. Ao invés, use a função SQL interna do MySQL LAST_INSERT_ID() em uma consulta SQL.


Se for o caso, então use :

SELECT LAST_INSERT_ID(`campo`) FROM `tabela` ORDER BY `campo` DESC LIMIT 1


[]'s

flws










Amigo, não estou conseguindo utilizar o código.. como faço?
Estou com um grande problema aqui quanto a isso..
<?php
define("MELHOR_FORUM_DO_MUNDO", "Webmasters Online");
echo MELHOR_FORUM_DO_MUNDO;
?>

#7 Claudiobrother

Claudiobrother

    Novato no fórum

  • Usuários
  • 16 posts
  • Sexo:Não informado

Posted 17/07/2009, 17:31

Vou deixar um exemplo pra vc e pra mais alguém que derrepente passe por aqui com dúvida nesse sentido.

Estrutura do banco para teste:
-- Banco de Dados: `test`

CREATE TABLE IF NOT EXISTS `tabela` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `nome` varchar(64) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=0 ;

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

CREATE TABLE IF NOT EXISTS `tabela_dois` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `nome` varchar(64) NOT NULL,
  `last_id` int(11) unsigned NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=0 ;

Aqui a "pagina.php" para cadastrar no bd:
<?php
$hostname = "localhost";
$database = "test";
$username = "root";
$password = "";
$connDB = mysql_pconnect($hostname, $username, $password) or trigger_error(mysql_error(),E_USER_ERROR); 

$action = $_SERVER['PHP_SELF'];
if (isset($_SERVER['QUERY_STRING'])) {
  $action .= "?" . htmlentities($_SERVER['QUERY_STRING']);
}

if ((isset($_POST["cadastro"])) && ($_POST["cadastro"] == "cadastro")) {
  
  extract($_POST);
  
  mysql_select_db($database, $connDB);
  $sql = mysql_query("INSERT INTO tabela (nome) VALUES ('$nome')") or die(mysql_error());
  
  
  
  mysql_select_db($database, $connDB);
  $sql = mysql_query("INSERT INTO tabela_dois (nome, last_id) VALUES ('$nome', LAST_INSERT_ID())") or die(mysql_error());
  
 

}
?>

<p>Simples formulario para teste</p>
<form action="<?php echo $action; ?> " method="post">
  <table>
	<tr>
	  <td>Insira um nome:</td>
	  <td><input type="text" name="nome" value="" size="32" /></td>
	</tr>
	<tr>
	  <td> </td>
	  <td><input type="submit" value="Cadastrar" /></td>
	</tr>
  </table>
  <input type="hidden" name="cadastro" value="cadastro" />
</form>

Espero que este exemplo te ajude a sanar sua dúvida. Ha, e se ainda restar alguma dúvida é só postar, blz?

#8 Ferlouko x)

Ferlouko x)

    Normal

  • Usuários
  • 72 posts
  • Sexo:Masculino
  • Localidade:Guararapes
  • Interesses:PHP, OOP, DESIGN PATTERNS, mySQL, XML, (X)HTML, CSS, TABLELESS, PHP-GTK, JAVA, C++.

Posted 17/07/2009, 18:54

só um ajuste @Claudiobrother :
INSERT INTO tabela_dois (nome, last_id) VALUES ('$nome', LAST_INSERT_ID(last_id))

extract($_POST); , istó não nem um pouco aconselhável, já que pode conter um campo no POST assim _SESSION['login'], vapt - vupt.. injection

E uma outra observação, você usou mysql_select_db duas vezes para o mesmo db.. isto é desnecessário.


[]'s

flws
<?php
/**
* @author. . .Fernando Rodrigo Cardoso < ferlouko (at) gmail.com >
* @desc. . . .Desenv. PHP, (X)HTML, CSS, JS E AJAX, aprendiz JAVA, aprendiz C/C++ (...)
*/
?>

#9 Claudiobrother

Claudiobrother

    Novato no fórum

  • Usuários
  • 16 posts
  • Sexo:Não informado

Posted 18/07/2009, 06:04

Da forma como eu postei está correta sim. Com o nome da coluna dentro da função retornaria "0"

só um ajuste @Claudiobrother :

INSERT INTO tabela_dois (nome, last_id) VALUES ('$nome', LAST_INSERT_ID(last_id))


Que tipo de "injection"? Poderia explicar melhor? Mesmo porque esse valor (_SESSION['login']) não passaria de uma string no BD.

extract($_POST); , istó não nem um pouco aconselhável, já que pode conter um campo no POST assim _SESSION['login'], vapt - vupt.. injection


Há, sem ofensa, mas procure ser mais construtivo em seus comentários.

Vou postar mais uma vez uma página de exemplo. Só que agora com função de segurança previnindo "SQL injection",
a função que resgata o último id cadastrado é "mysql_insert_id()", também fiz uma consulta no BD e no final do documento
criei uma listagem dos inserções feitas na "tabela_dois" para comprovar se a função está realmente resgatando o id do último cadastro.
<?php
$hostname = "localhost";
$database = "test";
$username = "root";
$password = "";
$connDB = mysql_pconnect($hostname, $username, $password) or trigger_error(mysql_error(),E_USER_ERROR); 

// Função de segurança contra SQL Injection
if (!function_exists("pega_valor")) {
function pega_valor($valor, $tipo, $valor_definido = "", $valor_nao_definido = "") 
{
  $valor = get_magic_quotes_gpc() ? stripslashes($valor) : $valor;
  $valor = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($valor) : mysql_escape_string($valor);
  
  switch ($tipo) {
	case "text": $valor = ($valor != "") ? "'" . $valor . "'" : "NULL";
	  break; 
	case "long":
	case "int": $valor = ($valor != "") ? intval($valor) : "NULL";
	  break; 
	case "double": $valor = ($valor != "") ? "'" . doubleval($valor) . "'" : "NULL";
	  break; 
	case "date": $valor = ($valor != "") ? "'" . $valor . "'" : "NULL";
	  break; 
	case "defined": $valor = ($valor != "") ? $valor_definido : $valor_nao_definido;
	  break;
  }
  return $valor;
}
}

if ((isset($_POST["cadastro"])) && ($_POST["cadastro"] == "cadastro")) {

  extract($_POST);   
  
  mysql_select_db($database, $connDB);
  $sql = sprintf ("INSERT INTO tabela (nome) VALUES (%s)", pega_valor($nome, "text"));
  $query = mysql_query($sql, $connDB) or die(mysql_error());
  
  $sql = sprintf ("INSERT INTO tabela_dois (nome, last_id) VALUES (%s, %s)", 
		 pega_valor($nome, "text"), 
		 pega_valor(mysql_insert_id(), "int"));
  
  $query = mysql_query($sql, $connDB) or die(mysql_error());

}

// Variavel que define o "action" do formulário
$action = $_SERVER['PHP_SELF'];
if (isset($_SERVER['QUERY_STRING'])) {
  $action .= "?" . htmlentities($_SERVER['QUERY_STRING']);
}


mysql_select_db($database, $connDB);
$sql = "SELECT * FROM tabela_dois ORDER BY id DESC ";
$query = mysql_query($sql, $connDB) or die(mysql_error());

?>

<p>Simples formulario para teste</p>
<form action="<?php echo $action; ?> " method="post">
  <table>
	<tr>
	  <td>Insira um nome:</td>
	  <td><input type="text" name="nome" value="" size="32" /></td>
	</tr>
	<tr>
	  <td> </td>
	  <td><input type="submit" value="Cadastrar" /></td>
	</tr>
  </table>
  <input type="hidden" name="cadastro" value="cadastro" />
</form>
<p>
<?php
while ($repete = mysql_fetch_assoc($query)):
  extract($repete);
  echo "Nome: ".$nome."<br/>";
  echo "LAST_ID: ".$last_id."<br/>";
  echo "<br/>";
endwhile;
?>
</p>

Lembrando que isso é só um exemplo que funciona e muito bem. A estrutura do BD é a mesma do post anterior.
A minha intenção é de apenas contribuir com a comunidade. Sugestões sobre como melhorar o código, serão bem-vindas!

#10 Ferlouko x)

Ferlouko x)

    Normal

  • Usuários
  • 72 posts
  • Sexo:Masculino
  • Localidade:Guararapes
  • Interesses:PHP, OOP, DESIGN PATTERNS, mySQL, XML, (X)HTML, CSS, TABLELESS, PHP-GTK, JAVA, C++.

Posted 18/07/2009, 14:49

@Claudiobrother sobre a injection foi um dos efeitos indesejados sobre o uso extract() em $_POST, se discorda de mim , pense mais um pouco, se tiver uma chave 'database' ou se não 'connDB' na superglobal $_POST, vejamos só :
extract($_POST);
  mysql_select_db($database, $connDB);
  $sql = mysql_query("INSERT INTO tabela (nome) VALUES ('$nome')") or die(mysql_error());

Entendeu agora?

Outra coisa

Há, sem ofensa, mas procure ser mais construtivo em seus comentários.


Eu apenas sugestionei em meu post que tal coisa surtia efeito indesejado, inclusive sugestionei o uso de mysql_select_db() apenas uma vez para um mesmo banco.

Acho melhor deixarmos de lado está discussão já que estaríamos fugindo do assunto.

até mais .
[]'s
<?php
/**
* @author. . .Fernando Rodrigo Cardoso < ferlouko (at) gmail.com >
* @desc. . . .Desenv. PHP, (X)HTML, CSS, JS E AJAX, aprendiz JAVA, aprendiz C/C++ (...)
*/
?>

#11 Fábio Sciubba

Fábio Sciubba

    Turista

  • Usuários
  • 30 posts
  • Sexo:Não informado

Posted 27/07/2009, 17:49

estou tentando o seguinte código:

$insert_cadastro = mysql_query("INSERT INTO usuarios 
(nome, login, pergunta_secreta, resposta_secreta, email, senha, senha_temp, creditos, tipo_conta, data_cadastro, dia_nasc, mes_nasc, ano_nasc, creditos_ganho, hits, upline_n1, upline_n2, upline_n3, upline_n4, upline_n5, upline_n6, upline_n7, upline_n8, upline_n9, upline_n10, indicacoes, categorias_ver, linguagem_ver, surfs_manual, surfs_auto) 
VALUES 
('$cadastro_nome_completo', '$cadastro_usuario', '', '', '$cadastro_email', '', '$senha_temporaria', '', '0', '$dia_mes_ano_servidor', '$cadastro_dia_nasc', '$cadastro_mes_nasc', '$cadastro_ano_nasc', '0', '0', '$cadastro_upline', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '$cadastro_categoria_ver', '$cadastro_linguagem_ver', '0', '0') 
") or die(mysql_error());
$id_usuario_inserido = mysql_insert_id("$insert_cadastro");

mas está dando erro...


Warning: mysql_insert_id(): supplied argument is not a valid MySQL-Link resource in includes\formulario-enviaemail-adiciona-no-banco.php on line 13



e agora? :S



Não sei pra que complicar tanto...

troque
$id_usuario_inserido = mysql_insert_id("$insert_cadastro");
por
$id_usuario_inserido = mysql_insert_id($insert_cadastro);


linha 13 = $id_usuario_inserido = mysql_insert_id('$insert_cadastro');

Edição feita por: Fábio Sciubba, 27/07/2009, 17:51.


#12 Felipe Pena

Felipe Pena

    O temor do Senhor é o princípio da sabedoria

  • Ex-Admins
  • 6441 posts
  • Sexo:Masculino

Posted 02/08/2009, 00:12

Companheiros, o parâmetro que pode ser opcionalmente (caso você esteja usando mais de uma conexão provavelmente você precisará) fornecido para a função mysql_insert_id(), é a variável que recebeu o retorno da mysql_connect() (ou mysql_pconnect()). :-)

Está escrito isso na doc., leia sobre o parâmetro.

http://docs.php.net/mysql-insert-id
Felipe Pena
[...] ó terra, terra, terra; ouve a palavra do Senhor. — Jeremias 22:29




0 user(s) are reading this topic

0 membro(s), 0 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq