Jump to content


Photo

Sequencia De Numeros


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

#1 raphaelmelo

raphaelmelo

    Turista

  • Usuários
  • 52 posts
  • Sexo:Masculino
  • Localidade:São Gotardo
  • Interesses:Desenvolvimento de paginas, PHP, HTML, Javascript...

Posted 14/12/2006, 19:18

Olá,
Estou tentando inserir no banco de dados um numero em sequencia como se fosse id, só que ele tem que ler o numero da linha anterior e colocar o proximo em seguencia.

Tentei fazer isso com o id primary key e auto increment só que quando apago um registro, ele salta alguns números e não fica na sequência correta.

Desde já agradeço,


Raphael Melo
Raphael Melo
Host Group Hospedagem de Sites
http://www.hgservers.com.br/
Excelência em Hospedagem!

#2 wesley.tome

wesley.tome

    24 Horas

  • Usuários
  • 422 posts
  • Sexo:Masculino

Posted 14/12/2006, 21:54

Faz um if, se houver registros ele pega o último e soma +1 senão registro_id=1.
.................

#3 Paulo Freitas

Paulo Freitas

    ××××××× LRU #456504 ××××××× ××××××× LRM #364686 ×××××××

  • Ex-Admins
  • 5612 posts
  • Sexo:Masculino
  • Localidade:Campinas - SP

Posted 14/12/2006, 22:57

Tentei fazer isso com o id primary key e auto increment só que quando apago um registro, ele salta alguns números e não fica na sequência correta.

Qual o problema não ficar na sequência correta? Sua aplicação será afetada por isso? :rolleyes:

Identificadores são feitos para serem únicos. Não importa se o registro foi modificado ou apagado, um dia ele existiu, e você sempre terá conhecimento disto por esta razão. A partir do momento que identificadores mudam, não há razão em utilizá-los. ;)

[]’s :DAté mais

#4 ursolouco

ursolouco

    Normal

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

Posted 15/12/2006, 07:35

<?php
function max(){
	conexao();
	$q	  = "SELECT MAX(campo) AS max FROM tabela;";
	$r	  = mysql_query($q);
	$reg	= mysql_fetch_array($r);
	$max	= (int) $reg['max'];
	if(!$max) $max = 1;
	return $max;
}
function inserir_novo_registro($sequencia, $valor){
	conexao();
	$sequencia++;
	$q	  = "INSERT INTO tabela SET
						   campo_id = '{$sequencia}',
						   campo	= '{$valor}';";
	mysql_query($q);
}
while($i < 10){
	inserir_novo_registro(max(), $i);
	$i++;
}
?>

Veja se pode lhe ajudar

[]s
Boa Programação!
-------------------------------------------------------------------------------------
http://www.desenvolvendosites.com

#5 fly2k

fly2k

    Super Veterano

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

Posted 15/12/2006, 09:01

Complementando o que o paulo disse, você quer algo que ordene sua tabela com apenas as posições existentes sem deixar pular uma posição, adicione um campo chamado posição!

Afinal, identificador é uma coisa, posição, que é o que você quer é outra. Agora apenas repense se esta informação é realmente necessária para sua aplicação.
Quer aprender PHP? -> www.manjaphp.com.br
Tutoriais, código colaborativo (pastebin), curso de PHP, artigos e etc.

#6 raphaelmelo

raphaelmelo

    Turista

  • Usuários
  • 52 posts
  • Sexo:Masculino
  • Localidade:São Gotardo
  • Interesses:Desenvolvimento de paginas, PHP, HTML, Javascript...

Posted 15/12/2006, 12:53

Qual o problema não ficar na sequência correta? Sua aplicação será afetada por isso?


sim fica afetada pois esse numero seria o numero de inscrição que eu jogo na busca. tem que ficar na sequencia correta sem pular nenhum numero.

<?php
function max(){
	conexao();
	$q	  = "SELECT MAX(campo) AS max FROM tabela;";
	$r	  = mysql_query($q);
	$reg	= mysql_fetch_array($r);
	$max	= (int) $reg['max'];
	if(!$max) $max = 1;
	return $max;
}
function inserir_novo_registro($sequencia, $valor){
	conexao();
	$sequencia++;
	$q	  = "INSERT INTO tabela SET
						   campo_id = '{$sequencia}',
						   campo	= '{$valor}';";
	mysql_query($q);
}
while($i < 10){
	inserir_novo_registro(max(), $i);
	$i++;
}
?>

Veja se pode lhe ajudar

[]s


tentei colocar assim

<?php
include("config.php");
mysql_connect ("$host", "$usuariodb", "$senhadb") or die ('Não foi possivel conectar com o usuario: ' . mysql_error());
mysql_select_db ("$db") or die("não foi possivel");

function max(){	
	 conexao();	
	 $q	  = "SELECT MAX(id) AS max FROM cadastros;";	
	 $r	  = mysql_query($q);	
	 $reg	= mysql_fetch_array($r);	
	 $max	= (int) $reg['max'];	
	 if(!$max) $max = 1;	
	 return $max;
}
function inserir_novo_registro($sequencia, $valor){	
	conexao();	
	$sequencia++;	
	$q	  = "INSERT INTO cadastros SET						   
							id = '{$sequencia}',						   
							campo	= '{$valor}';";	
	mysql_query($q);
}
while($i < 10){	
	 inserir_novo_registro(max(), $i);	
	 $i++;}
	 
?>

mas dá esse erro aqui Fatal error: Cannot redeclare max() in /home/remote/ftp_cesg/public_html/inscricao/soma.php on line 6

Edição feita por: raphaelmelo, 15/12/2006, 12:55.

Raphael Melo
Host Group Hospedagem de Sites
http://www.hgservers.com.br/
Excelência em Hospedagem!

#7 MarkApollo

MarkApollo

    Turista

  • Usuários
  • 44 posts
  • Sexo:Não informado
  • Localidade:Viana

Posted 15/12/2006, 13:22

experimente mudar a linha:
$q = "SELECT MAX(id) AS max FROM cadastros;";
mara
$q = "SELECT MAX(id) AS maximo FROM cadastros;";

"Cannot redeclare max" - Não é possível receclarar max...

té mais

Edição feita por: MarkApollo, 15/12/2006, 13:23.


#8 raphaelmelo

raphaelmelo

    Turista

  • Usuários
  • 52 posts
  • Sexo:Masculino
  • Localidade:São Gotardo
  • Interesses:Desenvolvimento de paginas, PHP, HTML, Javascript...

Posted 15/12/2006, 13:55

tentei fazer o que o fly2k disse adicionaei um novo campo é tentei fazer este script aqui para ler o campo anterior e inserir mais um ficando as linhas na sequencia 1,2,3..., mas tá faltando alguma coisa...

ele não está lendo a linha anterior está apenas inserindo um novo registro = 1
o que é?

<?
include("config.php");
mysql_connect ("$host", "$usuariodb", "$senhadb") or die ('Não foi possivel conectar com o usuario: ' . mysql_error());
mysql_select_db ("$db") or die("não foi possivel");


$sel = mysql_query ("SELECT posicao FROM cadastros");

if ($sel){
$sequencia++;
mysql_query ("INSERT INTO cadastros SET posicao='$sequencia'");
echo "posição inserida com sucesso";
}
else { echo "não foi possivel";
};

?>

valew

Edição feita por: raphaelmelo, 15/12/2006, 14:26.

Raphael Melo
Host Group Hospedagem de Sites
http://www.hgservers.com.br/
Excelência em Hospedagem!

#9 Celão

Celão

    Marcelo Santino

  • Usuários
  • 525 posts
  • Sexo:Masculino
  • Localidade:Rio de Janeiro

Posted 17/12/2006, 18:56

raphael, você já experimentou dar "echo $sel" após a execução da query?

Se você fizer, verificará que isso não retorna o valor do campo "posicao" e sim um Resourcd id #xx que indica o resultado da query que você executou.

A sua verificação do if() trata esseretorno como booleano, ou seja, só não vai vai entrar nesse if() se ocorrer algum erro de execução da query ( erro de sintaxe, por exemplo) que aí sim, retorna false.

Você deverá tratar esse retorno ($sel) com um fetch_array para pegar o valor do campo e aí sim, verificar seu conteúdo.

E o erro que deu pra você "cannot redeclare max()" é porque o nome de sua função (max) não pode ser assim.
Existe uma função do php com esse mesmo nome, e por isso dá erro.

Mude o nome da mesma e ve se adianta em algo aí...

Uma sugestão:
Não sei se o mysql permite execuções de subquerys (uso postgre e o mesmo permite) então, no seu caso eu usaria assim:
INSERT INTO cadastro (nome, posicao) VALUES ('nome do cara', (SELECT MAX(posicao) FROM cadastro)+1)

Qualquer coisa falaeee...
Marcelo Santino - DBA SQL Server/Oracle
Banco de dados e Tecnologia: www.bau-de-dev.com

#10 raphaelmelo

raphaelmelo

    Turista

  • Usuários
  • 52 posts
  • Sexo:Masculino
  • Localidade:São Gotardo
  • Interesses:Desenvolvimento de paginas, PHP, HTML, Javascript...

Posted 18/12/2006, 13:41

raphael, você já experimentou dar "echo $sel" após a execução da query?

Se você fizer, verificará que isso não retorna o valor do campo "posicao" e sim um Resourcd id #xx que indica o resultado da query que você executou.

A sua verificação do if() trata esseretorno como booleano, ou seja, só não vai vai entrar nesse if() se ocorrer algum erro de execução da query ( erro de sintaxe, por exemplo) que aí sim, retorna false.

Você deverá tratar esse retorno ($sel) com um fetch_array para pegar o valor do campo e aí sim, verificar seu conteúdo.

E o erro que deu pra você "cannot redeclare max()" é porque o nome de sua função (max) não pode ser assim.
Existe uma função do php com esse mesmo nome, e por isso dá erro.

Mude o nome da mesma e ve se adianta em algo aí...

Uma sugestão:
Não sei se o mysql permite execuções de subquerys (uso postgre e o mesmo permite) então, no seu caso eu usaria assim:
INSERT INTO cadastro (nome, posicao) VALUES ('nome do cara', (SELECT MAX(posicao) FROM cadastro)+1)

Qualquer coisa falaeee...


valew Celão mas já consegui, usei o mysql_fetch_assoc para ler a linha anterior...

aqui está o código para quem precisar...
<?
include("config.php");
mysql_connect ("$host", "$usuariodb", "$senhadb") or die ('Não foi possivel conectar com o usuario: ' . mysql_error());
mysql_select_db ("$db") or die("não foi possivel");


$sel = mysql_query ("SELECT * FROM cadastros");
$sell = mysql_fetch_assoc($sel);


$posicao = $sell["posicao"]; //O Objetivo é que a nova linha seja a coluna considerada primaria.
$nid = $posicao + 1;
$sql = "INSERT INTO cadastros (posicao) VALUES ('$nid')";
mysql_query($sql);


echo "ok";
?>

Raphael Melo
Host Group Hospedagem de Sites
http://www.hgservers.com.br/
Excelência em Hospedagem!




0 user(s) are reading this topic

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

IPB Skin By Virteq