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 ILR master
      Tudo bem pessoal?
       
      No código abaixo, estou fazendo uma consulta nas tabelas, banners e banners_referencia
      Meu objetivo é trazer resultados com valores iguais ao nome da cidade declarada na $cidade ou resultados com a referencia Total.
      O problema é que está trazendo todos os resultados. Tenho 10 linhas, 1 com o nome da cidade e duas com o valor Total, então o resultado teria que ser de apenas 3 linhas, mas mostra tudo.
       
      $banner = "SELECT A.*, B.* FROM banners A, banners_referencia B WHERE B.cod_referencia = A.cod_referencia AND A.cidade = '$cidade' OR B.referencia = 'Total' ORDER BY RAND()";
      $banner = mysqli_query($conexao, $banner) or die ("Banner não encontrado");
      while($busca= mysqli_fetch_array($banner)){
          print $busca['cidade'].'<br>';
      };
       
      Alguém consegue me ajudar?
    • Por Rafael_Ferreira
      Não consigo carregar a imagem do captcha do meu formulário. Foi testado com o xampp e easyphp. Também não carregou a imagem de outros captcha. 
       
       
    • Por luiz monteiro
      Olá, tudo bem?
       
      Estou melhorando meu conhecimento em php e mysql e, me deparei com o seguinte. A tabela da base de dados tem um campo do tipo varchar(8) o qual armazena números. Eu não posso alterar o tipo desse campo. O que preciso é fazer um select para retornar o números que contenham zeros a direita ou a esquerda.
      O que tentei até agora
       
      Ex1
      $busca = $conexao->prepare("select campo form tabela where (campo = :campo) ");
      $busca->bindParam('campo', $_REQUEST['campo_form']);
       
      Se a direita da string $_REQUEST['campo_form'] termina ou inicia com zero ou zeros, a busca retorna vazio.
      Inseri dados numéricos, da seguinte maneira para testar: 01234567;  12345670: 12345678: 12340000... entre outros nessa coluna. Todos os valores que não terminam ou não iniciam com zero ou zeros, o select funciona.
       
       
      Ex2
      $busca = $conexao->prepare("select campo form tabela where (campo = 0340000) ");
      Esse número está cadastrado, mas não retorna.
       
      Ex3
      $busca = $conexao->prepare("select campo form tabela where (campo = '02340001' ) ");
      Esse número está cadastrado, mas não retorna.
       
       
      Ex4
      $busca = $conexao->prepare("select campo form tabela where (campo like 2340000) ");
      Esse número está cadastrado, mas não retorna.
       
      Ex5
      $busca = $conexao->prepare("select campo form tabela where (campo like '12340000') ");
      Esse número está cadastrado, mas não retorna.
       
      Ex6
      $busca = $conexao->prepare("select campo form tabela where (campo like '"12340000"' ) ");
      Esse número está cadastrado, mas não retorna.
       
       
      Ex7
      $busca = $conexao->prepare("select campo form tabela where (campo like :campo) ");
      $busca->bindParam('campo', $_REQUEST['campo_form'])
      Não retorna dados.
       
      O  $_REQUEST['campo_form'] é envio via AJAX de um formulário. 
      Usei o gettype para verificar o post, e ele retorna string.
      Fiz uma busca com número 12345678 para verificar o que o select retorna, e também retrona como string.
       
      Esse tipo de varchar foi usado porque os números que serão gravados nesse campo,  terão zeros a direita ou na esquerda. Os tipos number do mysql não gravam zeros, então estou usando esse. O problema é a busca.
      Agradeço desde já.
       
       
    • Por daemon
      Boa tarde,
       
      Eu tenho uma rotina que faz uma leitura do arquivo .xml de vários sites.

      Eu consigo pegar o tópico e a descrição, e mostrar a imagem que esta na pagina do link.
      Para isso utilizo esta função:
      function getPreviewImage($url) { // Obter o conteúdo da página $html = file_get_contents($url); // Criar um novo objeto DOMDocument $doc = new DOMDocument(); @$doc->loadHTML($html); // Procurar pela tag meta og:image $tags = $doc->getElementsByTagName('meta'); foreach ($tags as $tag) { if ($tag->getAttribute('property') == 'og:image') { return $tag->getAttribute('content'); } } // Se não encontrar og:image, procurar pela primeira imagem na página $tags = $doc->getElementsByTagName('img'); if ($tags->length > 0) { return $tags->item(0)->getAttribute('src'); } // Se não encontrar nenhuma imagem, retornar null return null; } // Uso: $url = "https://example.com/article"; $imageUrl = getPreviewImage($url); if ($imageUrl) { echo "<img src='$imageUrl' alt='Preview'>"; } else { echo "Nenhuma imagem encontrada"; }  
      Mas estou com um problema, esta funcão funciona quando coloco em uma pagina de teste.php. Preciso mostrar em uma página inicial diversas fotos de todos os links. (No caso acima só funciona 1).
×

Informação importante

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