nao inserir repetidos PHP

devil_online

Power Member
boas
eu tenho este codigo para criar nomes

PHP:
$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
 
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 )
 
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
 
Última edição:
podes fazer com um while ou com um for, e dentro do while poes o que o eXcept mostrou.

PHP:
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, 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.

devil_online disse:
(...) 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...

turbulence disse:
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...
 
A que estava a referir-me era a algo tipo isto:
PHP:
$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 ;)
 
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
 
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).
 
Última edição:
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...
 
Última edição:
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
 
Back
Topo