Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Boa tarde galera,
Por favor, me ajudam a desenvolver uma lógica para meu script.
Tenho um campo no BD que conterá várias palavras separadas por , (virgula). Estou usando explode para exibi-las separadamente, por array. Até ai esta tudo ok.
Precisaria, porém, que ao cadastrar novas palavras, neste mesmo campo ele verificasse se já não existe uma palavra igual. Ex:
CAMPO PALAVRAS CONTÉM CARRO, MOTO, BICICLETA
Vou cadastrar novas palavras neste mesmos campo: CAVALO, CARRO. Neste cadastro apenas inseriria a palavra CAVALO, considerando já existir a palavra carro.
Obrigado!!
Cara eu não gostaria de criar uma nova tabela para incluir apenas palavras chaves, acho que é muita coisa pra minha finalidade.
Nesse caso, dependerá de como você irá tratar. Fazer o certo ou a gambiarra?
Você até pode fazer por PHP, mas estará perdendo perfomance e integridade (além de ser uma gambiarra e um "pecado" com o SGBD). E, na realidade, com o PHP também será mais complexo do que ter uma boa modelagem de dados.
Com o PHP:
-
Retornar dados;
-
explode;
-
verificar se o registro já existe;
-
inserir o registro caso não existe.
Com SGBD + cláusula UNIQUE:
-
Inserir no SGBD (se o registro já existir, será avisado).
Entendeu a diferença?
Você pode fazer uma gambiarra:
<?php
class Registros
{
private $valoresBanco;
private $novoValor;
private $erro;
private $inserir;
public function receberValores() {
$this->setValoresBanco("BICICLETAS,CARROS,MOTOS,AVIÕES,VANS,ANIMAIS,PESSOAS");
$this->setNovoValor("CARROS");
}
public function separarValores() {
$this->setValoresBanco(explode(",", $this->getValoresBanco()));
}
public function dispararErro() {
$this->setErro(1);
}
public function verificarValores() {
for ($x = 0; $x < count($this->getValoresBanco()); $x++) {
if ($this->getNovoValor() == $this->getValoresBanco()[$x]) {
$this->dispararErro();
}
}
$this->inserirNovoValor();
}
public function inserirNovoValor() {
if ($this->getErro()) {
echo "Este valor já existe!";
} else {
array_push($this->valoresBanco, $this->getNovoValor());
}
}
public function setValoresBanco($v) {
$this->valoresBanco = $v;
}
public function getValoresBanco() {
return $this->valoresBanco;
}
public function setNovoValor($n) {
$this->novoValor = $n;
}
public function getNovoValor() {
return $this->novoValor;
}
public function setInserir($i) {
$this->inserir = $i;
}
public function getInserir() {
return $this->inserir;
}
public function setErro($e) {
$this->erro = $e;
}
public function getErro() {
return $this->erro;
}
}
$valores = new Registros();
$valores->receberValores();
$valores->separarValores();
$valores->verificarValores();
Lembrando que você terá que sempre adicionar um novo valor após virgula e até quando a aplicação vai continuar sem bugs? Até quando você vai ter 5 valores?
Aconselho você criar uma tabela CATEGORIAS e adicionar as mesmas lá.
Para verificar da maneira correta:
<?php
$this->setPdo($this->con->prepare("SELECT * FROM......"));
$this->execute();
if ($this->getPdo()->rowCount() > 0) {
return false; return true;
}
// SE FOR FALSO ELE NÃO INSERE, SE FOR VERDADEIRO ELE INSERE...
Veja a diferença :)
Se eu entendi o que você quer, me parece bem simples!
$palavrasDoBanco = 'São Paulo,Rio de Janeiro,Minas';
$novaPalavra = 'Parana';
if (!strpos($palavrasDoBanco, $novaPalavra)) {
$palavrasDoBanco .= ',' . $novaPalavra;
}
echo $palavrasDoBanco; // Ira exibir: São Paulo,Rio de Janeiro,Minas,Parana
Muito obrigado pelas dicas galera. A dica do Edcesar funcionou certinho!
Sua modelagem está pecando pela normalização de dados.
Para verificar alguns exemplos de como resolver, leia os seguintes tópicos:
http://pt.stackoverflow.com/questions/178342/para-cada-resultado-uma-nova-linha-no-php