Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

mariohbrr

Como selecionar registros de IDs separados por vírgula?

Recommended Posts

Caros Colegas,

estou desenvolvendo um sistema em php de gerenciamento de documentos, para meu estudo, nesse sistema o administrador tem a opção de no momento da criação da página relacionar outras páginas que já estão publicadas a ela, uma especie de "Produtos Relacionados". Minha tabela MySQL possui 3 colunas: titulodocumento, id_relacionado e id. Na coluna id_relacionado é aonde faço o armazenamento das páginas relacionadas, que neste caso são IDs separados por vírgula. A página hoje esta sendo exposta da seguinte forma:

____________________________________

Título do Documento: Teste

ARQUIVOS RELACIONADOS:

255 | 644

____________________________________

Como vocês podem notar, na aba arquivos relacionados os documentos estão sendo apresentados pelos ids, o código responsável por

este trecho é o seguinte:

<?php

$idstring = array();
$idstring = explode(',', $row_usuario['id_relacionado']);
foreach ($idstring as $ids) {
$links[] = '<a href="visualizar.php?id='.trim($ids).'">'.$ids.'</a>'; 
}

$link = implode(' | ', $links);

echo $link; 


?>

Logicamente estão sendo apresentados os ids como link pois dentro da tag <a href="#">'.$ids.'</a> foi inserido a variável $ids. Exatamente este ponto que estou com dificuldades de mudar, pois ao invés de apresentar os próprios ids como link eu gostaria de apresentar o título de cada id, pois não faz sentido o usuário visualizar o id, ele não saberá do que se trata, e por dua vez este título esta localizado na coluna titulodocumento.

Para capturar este título provavelmente tenha que ser feito algo nesta lógica:

$sql1 = "SELECT titulodocumento FROM minhatabela WHERE id='" . $ids . "'";

Mas infelizmente não estou sabendo implementar, alguém poderia me dar uma força?

Grato pela atenção!

Compartilhar este post


Link para o post
Compartilhar em outros sites

É evidente que você está com um problema com a sua modelagem. Antes de tentar corrigir algo que foi criado por um problema, corrija o problema.

O tópico abaixo existe a mesma situação que a sua:

http://forum.imasters.com.br/topic/516085-artigo-com-mais-de-uma-categoria/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz alguns testes e consegui fazer aparecer o título no lugar do id, mas ele esta pegando somente o dado do último id, por exemplo tenho a string 123, 164, 198, ele apresenta somente o id 198, o código esta da seguinte forma:

<?php


$idstring = array();
$idstring = explode(',', $row_usuario['id_relacionado']);
foreach ($idstring as $ids) { 
$result_numero = "SELECT numero FROM files_table WHERE id=:ids";
$resultado_numero=$pdo->prepare($result_numero);
$resultado_numero->execute(array(
':ids'=> $ids,
)); 
$resultado_numero->execute();
}


while ($row_numero = $resultado_numero->fetch(PDO::FETCH_ASSOC)) {


$links[] = '<a href="visualizar.php?id='.trim($ids).'">'.$row_numero['numero'].'</a>';




    $link = implode(' | ', $links); 


}


    echo $link; 


?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consegui resolver utilizando o seguinte código, agora todos os títulos respectivos aos ids estão aparecendo, caso alguém tenha alguma observação, será muito bem vindo.

<?php


$idstring = array();
$idstring = explode(',', $row_usuario['id_relacionado']);
foreach ($idstring as $ids) { 
$result_numero = "SELECT numero FROM files_table WHERE id=:ids";
$resultado_numero=$pdo->prepare($result_numero);
$resultado_numero->execute(array(
':ids'=> $ids,
)); 
$resultado_numero->execute();




while ($row_numero = $resultado_numero->fetch(PDO::FETCH_ASSOC)) {


$links[] = '<a href="visualizar.php?id='.trim($ids).'">'.$row_numero['numero'].'</a>';




    $link = implode(' | ', $links); 


    }


}


    echo $link; 

?> 

Compartilhar este post


Link para o post
Compartilhar em outros sites

[...]caso alguém tenha alguma observação, será muito bem vindo.

A observação continua a mesma. Você está com um problema na modelagem. Se manter assim, terá sérios problemas no decorrer do desenvolvimento.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Gabriel, essa modelagem no caso seria eu criar uma tabela intermediária para alocar os ids relacionados? Me parece que para isso e necessário uma ferramenta específica, e como ficaria a ligação entre os dados ?

Oque você indicaria como um problema sério, que poderia acontecer ?

Grato pela atenção.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Os problemas são relativos ao seu uso. O principal deles é a perda da integridade de dados.

Por exemplo, como você garante que o registro da coluna id_relacionado realmente existe? Como você garante que um registro não está relacionado com nenhum outro e pode ser excluído? Se excluir o "registro pai", como os relacionados se comportarão? Serão excluídos? Devem permanecer?

Todas as situações acima são inerentes ao SGBD, mas você só consegue resolver através de programação.

Outro problema é a performance, esses registros não podem ser indexados da forma correta. E, também, programação com gambiarra, que foi o que você fez para "contornar" o problema.

Não precisa de nenhuma ferramenta específica, apenas a representatividade é criada com um software (nesse caso é o MySQL WorkBench). Tudo isso está definido na Normalização de Dados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok muito obrigado pelas dicas Gabriel, parte do que você indicou sobre a integridade dos dados já foi resolvido através da programação, agora sobre a estruturação do BD estarei estudando melhor pois existe casos e casos onde deve-se ou não implementar uma determinada diagramação dos dados.

Grato pela atenção.

Compartilhar este post


Link para o post
Compartilhar em outros sites

[...]parte do que você indicou sobre a integridade dos dados já foi resolvido através da programação[...]

Esse é o ponto e o problema. O SGBD já faz essa parte, de "graça" e com maestria.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Grabriel,

Estudando um pouco mais sobre a modelagem do banco de dados, fiz as seguintes modificações, criei uma outra tabela chamada relacionamentos com duas colunas, idrelacionado e id_pai e relacionei a coluna id_pai com a coluna id que se localiza na tabela file_tables onde é listado os documentos. Desta forma na tabela relacionamentos eu posso fazer a associação dos documentos já publicados em rows ao invés de armazenar os dados separados por virgula em uma coluna como estava fazendo, agora estou com algumas dúvidas, no código, como farei a associação das tabelas de forma que atenda meu intuito inicial ? e pelo que percebi também terá mais de um insert?

Grato pela atenção!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, terá mais de um insert e devem ser feitos em ordem.

Primeiro, deve inserir na tabela "pai". Após inserir na tabela pai, recupere o ID registrado com PDO::lasInsertId() e guarde-o em uma variável.

Após, insira o registro na tabela "filha" e também recupere o ID. Assim que recuperar o ID da filha, você insere na tabela de relacionamentos o "id pai" e "id filho".

Quando você for inserir o próximo registro relacionado ao pai, não terá necessidade em recuperar novamente o id da tabela pai, pois já está guardado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Gabriel,

consegui fazer este procedimento que você indicou, bem interessante realmente tudo esta fluindo melhor, quando finalizar estarei postando o código aqui. No decorrer do desenvolvimento acabei encontrando alguns probleminhas, como irei fazer o UPDATE destes registros? Pois criei uma página de edição do conteúdo e os ids relacionados ao id_pai ficam expostos em um input tag (bootstrap) ou você acha melhor eu mudar a forma de exibir esses conteúdos para edição?. Outro ponto, é que no momento de cadastrar o documento eu também utilizo um input tags para inserção dos ids relacionados, mas é inserido somente o primeiro id da lista no banco de dados.

Grato pela ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Talvez na página de edição eu irei remover o input tag e farei a exposição dos ids relacionados de uma outra forma, mas para inserção dos ids no momento da criação do documento, por enquanto irei preservar o input tag, pois achei pratico. Não estou sabendo como percorrer a array dos ids relacionados para ai inseri-los na tabela filha, até consegui inserir mais só enviava o primeiro id da array.

Se alguém puder dar uma ajuda ficarei grato.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como está o seu código no momento?

Compartilhar este post


Link para o post
Compartilhar em outros sites
Por enquanto esta desta forma:



$idrelacionado = $_POST['idrelacionado'];
$idr = count($idrelacionado);


$lastid = $pdo->lastInsertId();
for ($i=0; $i<$idr; $i++) {
$sql1 = "INSERT INTO relacionamentos(idrelacionado, id_pai) VALUES ( ?, ?)";
$stmt = $pdo->prepare($sql1);
$stmt->execute(array(


$idrelacionado[$i],
$lastid,


));
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma consideração sobre PDO, é que você pode otimizar o seu código.

Você não precisa ficar gerando o prepare a cada loop, apenas uma vez e alterando os valores, assim:

$sql1 = "INSERT INTO relacionamentos(idrelacionado, id_pai) VALUES ( ?, ?)";
$stmt = $pdo->prepare($sql1);

for ($i=0; $i<$idr; $i++) {
    $stmt->execute(array($idrelacionado[$i] , $lastid));
}

Isso pode ser realizado com qualquer "query preparada".

Sobre o update, isso fica dependente do que você vai realizar no update. O que será feito no update com os registros relacionados?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma consideração sobre PDO, é que você pode otimizar o seu código.

Você não precisa ficar gerando o prepare a cada loop, apenas uma vez e alterando os valores, assim:

$sql1 = "INSERT INTO relacionamentos(idrelacionado, id_pai) VALUES ( ?, ?)";
$stmt = $pdo->prepare($sql1);

for ($i=0; $i<$idr; $i++) {
    $stmt->execute(array($idrelacionado[$i] , $lastid));
}

Isso pode ser realizado com qualquer "query preparada".

Sobre o update, isso fica dependente do que você vai realizar no update. O que será feito no update com os registros relacionados?

Interessante observação Gabriel, porém este INSERT continua enviando somente o primeiro id da array, oque eu posso estar fazendo de errado? Dei um var_dump e ele esta retornando int(1).

Compartilhar este post


Link para o post
Compartilhar em outros sites

Utilize foreach ao invés de for. Sendo um post, os id's podem não ser sequênciais:

foreach($idrelacionado as $id)

Caso não resolver, o problema também pode ser no form, como está vindo a variável $idrelacionado?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Gabriel,

o problema realmente esta no input que recebe estas tags, pelo que estava vendo da forma que eu estou utilizando é gerado uma só string com os ids: "256, 257". Existe uma opção na na página do bootstrap que é a utilização do select, exemplo:

<select multiple data-role="tagsinput" name="idrelacionado[]"></select>

Desta forma ele esta separando os valores ["256","257"] e envia 2 strings para o bd relacionando cada um com seu id pai.

O código no momento esta desta forma:
 $idrelacionado = $_POST['idrelacionado'];
  $idr = count($idrelacionado);


   $lastid = $pdo->lastInsertId();
       $sql1 = "INSERT INTO relacionamentos(idrelacionado, id_pai) VALUES ( ?, ?)";
        $stmt = $pdo->prepare($sql1);


        foreach ($idrelacionado as $idr) {
              $stmt->execute(array($idr , $lastid));
        }


       $stmt->closeCursor();


        
       <select multiple data-role="tagsinput" name="idrelacionado[]"></select>

Aparentemente tudo esta funcionando corretamente, mas será que é desta forma mesmo? e no caso ao invés de ser string não deveria ser int?

Grato pela atenção!

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por violin101
      Caros amigos, saudações.
       
      Por favor, me permita tirar uma dúvida com os amigos.

      Tenho um Formulário onde o Usuário digita todos os Dados necessários.

      Minha dúvida:
      --> como faço após o usuário digitar os dados e salvar, o Sistema chamar uma Modal ou mensagem perguntando se deseja imprimir agora ?

      Grato,
       
      Cesar
    • Por Carcleo
      Tenho uma abela de usuarios e uma tabela de administradores e clientes.
      Gostaria de uma ajuda para implementar um cadastro
       
      users -> name, login, passord (pronta) admins -> user_id, registratiom, etc.. client -> user_id, registratiom, etc...
      Queria ajuda para extender de user as classes Admin e Client
      Olhem como estáAdmin
      <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Admin extends User {     use HasFactory;            protected $fillable = [         'name',         'email',         'password',         'registration'     ];      private string $registration;     public function create(         string $name,          string $email,          string $password,         string $registration     )     {         //parent::create(['name'=>$name, 'email'=>$email, 'password'=>$password]);         parent::$name = $name;         parent::$email = $email;         parent::$password = $password;         $this->registration = $registration;     } } User
      <?php namespace App\Models; // use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Illuminate\Database\Eloquent\Relations\BelongsToMany; class User extends Authenticatable {     /** @use HasFactory<\Database\Factories\UserFactory> */     use HasFactory, Notifiable;     static string $name;     static string $email;     static string $password;     /**      * The attributes that are mass assignable.      *      * @var list<string>      */     protected $fillable = [         'name',         'email',         'password',     ];          /**      * The attributes that should be hidden for serialization.      *      * @var list<string>      */     protected $hidden = [         'remember_token',     ];     /**      * Get the attributes that should be cast.      *      * @return array<string, string>      */     protected function casts(): array     {         return [             'email_verified_at' => 'datetime',             'password' => 'hashed',         ];     }          public function roles() : BelongsToMany {         return $this->belongsToMany(Role::class);     }       public function hasHole(Array $roleName): bool     {                 foreach ($this->roles as $role) {             if ($role->name === $roleName) {                 return true;             }         }         return false;     }         public function hasHoles(Array $rolesName): bool     {                 foreach ($this->roles as $role) {             foreach ($rolesName as $rolee) {             if ($role->name === $rolee) {                 return true;             }          }         }         return false;     }         public function hasAbility(string $ability): bool     {         foreach ($this->roles as $role) {             if ($role->abilities->contains('name', $ability)) {                 return true;             }         }         return false;     }     } Como gravar um Admin na tabela admins sendo que ele é um User por extensão?
      Tentei assim mas é claro que está errado...
      public function store(Request $request, Admin $adminModel) {         $dados = $request->validate([             "name" => "required",             "email" => "required|email",             "password" => "required",             "registration" => "required"         ]);         $dados["password"] =  Hash::make($dados["password"]);                  $admin = Admin::where("registration",  $dados["registration"])->first();                  if ($admin)              return                    redirect()->route("admin.new")                             ->withErrors([                                 'fail' => 'Administrador já cadastrados<br>, favor verificar!'                   ]);                            $newAdmin = $adminModel->create(                                    $dados['name'],                                    $dados['email'],                                    $dados['password'],                                    $dados['registration']                                 );         dd($newAdmin);         $adminModel->save();         //$adminModel::create($admin);                  return redirect()->route("admin.new")->with("success",'Cadastrado com sucesso');     }  
    • Por violin101
      Caros amigos, saudações.
       
      Gostaria de tirar uma dúvida com os amigos, referente a PDV.
       
      Estou escrevendo um Sistema com Ponto de Vendas, a minha dúvida é o seguinte, referente ao procedimento mais correto.

      Conforme o caixa vai efetuando a venda, o Sistema de PDV já realiza:
      a baixa direto dos produtos no estoque
      ou
      somente após concretizar a venda o sistema baixa os produtos do estoque ?
       
      Grato,
       
      Cesar
       
    • Por violin101
      Caros amigos do grupo, saudações e um feliz 2025.
       
      Estou com uma pequena dúvida referente a Teclas de Atalho.

      Quando o Caps Lock está ativado o Comando da Tecla de Atalho não funciona.
      ou seja:
      se estiver para letra minúscula ====> funciona
      se estiver para letra maiúscula ====> não funciona
       
      Como consigo evitar essa falha, tanto para Letra Maiúscula quanto Minúscula ?

      o Código está assim:
      document.addEventListener( 'keydown', evt => { if (!evt.ctrlKey || evt.key !== 'r' ) return;// Não é Ctrl+r, portanto interrompemos o script evt.preventDefault(); });  
      Grato,
       
      Cesar
    • Por ILR master
      Fala galera, tudo certo?
       
      Seguinte: No servidor A estou tentando fazer uma consulta com o servidor B, mas está dando erro.
      Estou usando o mesmo código de conexão do servidor B que funciona perfeitamente, mas no servidor A, dá erro.
      Segue código:
       
      $host = 'servidor B';
      $user = 'user';
      $pass = '********';
      $db   = 'banco';
       
      // conexão e seleção do banco de dados
      $conexao = mysqlI_connect($host, $user, $pass, $db);
      mysqlI_set_charset($conexao,"utf8");
      //print "Conexão rodando e OK!"; 
      //mysqlI_close($conexao);
       
      Alguém pode me ajudar?
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.