View Full Version : nao inserir repetidos PHP
devil_online 07-02-2006, 04:21 boas
eu tenho este codigo para criar nomes
$firstnames = array("Peter", "John", "Francisco");
$lastnames = array("Simão", "Gustavo","Gaspar");
$name1 = $firstnames[array_rand($firstnames)]." ".$lastnames[array_rand($lastnames)];
eu gostava de inserir os nomes na base de dados sem os repetir.
como posso fazer isto em php
obg
(...) eu gostava de inserir os nomes na base de dados sem os repetir.
como posso fazer isto em php (...)
Contas as ocorrências que já lá estão...
devil_online 07-02-2006, 11:35 pra i 1s 15
o que ele queria dizer seria algo do genero
$a = mysql_num_rows(mysql_query(select * from tabela where nome = xpto))
if $a = 0 {
inserir dados
} else {
echo já existe alguem com esse nome }
( isto em código mt rebuscado, claro :P )
devil_online 07-02-2006, 12:13 a ideia é essa
porem o q keria era que tentasse nomes ate conseguir um diferente
obg
turbulence 07-02-2006, 12:58 Podes fazer uma query que procure se o nome já existe antes do o inserires, se sim, não faz nada, se não insere.
devil_online 07-02-2006, 13:10 como faria isso?
De facto penso q nao seja bem o q kero
pois ai iria dizer se o nome ja existia nao inseria e se nao existisse inseria
o meu problema é ao criar um nome q ja existe ele nao ira inserir (ate aki td bem) mas queria que ele criasse outro até achar um que nao exista. Penso que um comando 'while' talvez.
obg
podes fazer com um while ou com um for, e dentro do while poes o que o eXcept mostrou.
for($i=0; $i<$numDadosNoArray; $i++)
{
$firstnames = array("Peter", "John", "Francisco");
$lastnames = array("Simão", "Gustavo","Gaspar");
$nome= $firstnames[array_rand($firstnames)]." ".$lastnames[array_rand($lastnames)];
$queryNome = mysql_query("SELECT * FROM nomes WHERE nome='$nome'");
$numRegistos = mysql_num_rows($queryNome);
if($numRegistos==0)
{
mysql_query("INSERT INTO nomes (nome) VALUES ('$nome')");
}
}
eXcept (http://www.techzonept.com/member.php?u=4130), estava a pensar mais numa optica dum "Count(*) < 1" para não andar com registos para trás e para a frente, mas a ideia era essa.
(...) a ideia é essa
porem o q keria era que tentasse nomes ate conseguir um diferente (...)
Eu não sei quantos nomes tens à partida, mas tens de contabilizar a hipótese que poderás ficar sem novas entradas, mas no entanto a aplicação continua a tentar encontrar mais uma...
Podes fazer uma query que procure se o nome já existe antes do o inserires, se sim, não faz nada, se não insere.
Acho que não consegues fazer isso com um query...
turbulence 07-02-2006, 15:28 A que estava a referir-me era a algo tipo isto:
$queryNome = mysql_query("SELECT * FROM nomes WHERE nome='$nome'");
$numRegistos = mysql_num_rows($queryNome);
if($numRegistos==0)
{
mysql_query("INSERT INTO nomes (nome) VALUES ('$nome')");
}
Como disse o mitnick ;)
iznougud 17-02-2006, 13:01 em vez de um while podes tentar usar o "LIKE", assim carregas em memoria todos os valores parecidos, assim podes descobrir o novo nome que precisas sem estares sempre a perguntar à base de dados. O WebServer agradece :D
devil_online 17-02-2006, 13:56 qual o codigo que usaria?
obg
devil_online 17-02-2006, 16:09 desculpem a insistencia, mas alguem sabe algum codigo que de para inserir dados numa base de dados sem repetir esses dados? obg
mcog_blaster 19-02-2006, 13:45 Esses valores sao chaves primárias?
Se forem tas com sorte, ou nao...
Que versao do Mysql tas a usar?
Se estiveres a usar uma versao superior ou igual a 4.1 entao pode ser que estejas mesmo com sorte.
A partir desta versao é possivel fazer algo do tipo:
INSERT INTO <tablename> (id, data) VALUES(?, ?) ON DUPLICATE KEY UPDATE data = ?.
Se puderers usar este novo mecanismo, procura algo mais nos manuais.
Se nao, entao ja foi colocado codigo que te permite nao inserir duplicados.
O que tu precisas não tem nada a ver com php.
Na tabela onde vais inserir os dados deves criar para cada atributo que precises ser único da tabela(s) uma unique constraint :
Por exemplo:
Tens a tabela de empregados com os empregados que tem os atributos nome, morada,data_nascimento, nif, bi, pais e supõe que querias que o nif fosse único para o conjunto de empregados criavar um uk (unique key) apenas para o nif, mas se por exemplo fosse preciso que o nif fosse único para cada pais, defenias uma uk composta para os atributos (nif,pais).
Tenho a impressão que o que o devil_online quer é um query que lhe retorne todas as combinações possíveis dos nomes que ainda não foram preenchidas.... Acho que não vai ter sorte com isso. Só mesmo verificando se a combinação já está ou não inserida na tabela, e para isso não precisa de unique constraints, basta um SELECT COUNT(*) para saber se determinada combinação já está ou não registada na tabela...
Abraço.
O que percebi era que ele queria inserir nome que não existissem na tabela. Como tal se tiver as unique keys definidas, supostamente ao inserir ira receber um erro da bd. Se no entanto necessitar de guardar os nomes que não pôde inserir devido a esse erro, é fácil. Basta guardar o nome que tentou inserir sem sucesso num array ....
Aliás um dos deveres das base de dados, além do obvio que é guardar correctamente os dados é conseguir efectuar as validações de regras de negócio definidas. Deste modo poderás fácilmente mudar de tecnologia de desenvolvimento ao nivel de UI sem afacter as regras de negócio definidas...
devil_online 26-02-2006, 23:01 ja esta resolvido obg
a questão era eu podia por UNIQUE KEYS, porem ao dar o erro, teria que efectuar a criação de um nome outra vez ate dar certo ou seja mais ou menos assim:
(while ($inserir = false) {
create_name ()
}
obg
|
|