web-dev-qa-db-pt.com

Criando um módulo para pesquisar no banco de dados e exibir os resultados

Eu tenho uma tabela no banco de dados chamada #__magazines, contém dados para revistas (data de publicação, número da edição etc.). Eu criei um Componente, Plugin e Módulo que é para o Joomla 3.x, quero que o módulo exiba variáveis ​​(vamos usar Datas Publicadas como exemplo) que, se elas forem escolhidas e o botão "Pesquisar" for clicado, o módulo irá para o banco de dados e trará de volta todos os resultados correspondentes à data escolhida e exibirá os resultados em uma nova página.

Eu segui os tutoriais do Joomla, mas não consigo exercitar a melhor maneira de consultar o #__magazines tabela e, em seguida, exiba os resultados.

ATUALIZAÇÃO

Agora, o plug-in de pesquisa está funcionando corretamente; portanto, se eu pesquisar um título de revista (que eu sei que está no banco de dados), ele aparecerá nos resultados da pesquisa.

O que eu quero saber, no entanto, é como eu posso exibir todas as diferentes variáveis ​​da tabela de banco de dados de #__magazines e mostre-os como menus suspensos em um módulo de pesquisa, mas sem duplicatas. Por exemplo, se houver um title chamado June 2014 e ele está no banco de dados duas vezes, eu só quero que ele seja exibido no menu suspenso Selecionar opção uma vez, se for escolhido e o botão "Pesquisar" clicar em que o usuário será direcionado para a página de resultados, onde a versão múltipla do Os detalhes de "junho de 2014" são mostrados.

3
RustyJoomla

Corrigi isso usando o seguinte no arquivo default.php dentro do módulo:

// Get a db connection.
$db = JFactory::getDbo();

// Published dates
$query = $db->getQuery(true);
$query->select($db->quoteName(array('publishedDate')));
$query->from($db->quoteName('#__magazines'));
$query->order('publishedDateASC');
$query->group('publishedDate');
$db->setQuery($query);

// Load dates
$dates = $db->loadObjectList();

// Input
$input = JFactory::getApplication()->input;

<label for="publisheddate">Departure Date:</label>
            <select id="publisheddate" name="publisheddate">
                <option selected="selected" value="A">Choose Date</option>
                <?php $dateInput = $input->get('publisheddate', null, 'string'); ?>
                <?php foreach ($dates as $result): ?>
                <option value="<?php echo $result->publishedDate; ?>"<?php echo $dateInput == $result->publishedDate ? ' selected="selected"' : ''; ?>>
                    <?php echo $result->publishedDate; ?>
                </option>
                <?php endforeach; ?>
            </select>

Isso foi para a tabela #__magazines, recuperou um de cada publishDate e preencheu a tabela com ele!

2
RustyJoomla

Atualização: para modificar meu snippet para uso dinâmico para uma variedade de possíveis valores de variáveis ​​de entrada, suponho que você possa simplesmente declarar uma "lista de permissões" de nomes de colunas e verificar se o $column A ser consultado é válido.

Por exemplo, $column = "publishedDate"

Você só precisa refazer publishedDate com $column No meu script e chamar $db->qn() a cada vez para garantir sua segurança.

... e use strtolower() para preparar a variável para declarações de atributo dom.


Código testado:

$db = JFactory::getDBO();
try {
    $query = $db->getQuery(true)
                ->select("DISTINCT publishedDate")
                ->from("#__magazines")
                ->order("publishedDate");
    // echo $query->dump();  // uncomment if you want to see what is generated
    $db->setQuery($query);
    if ($dates = $db->loadColumn()) {
        $user_date = JFactory::getApplication()->input->get('publisheddate', null, 'string');
    }
} catch (Exception $e) {
    $dates = array();
    // echo "Syntax Error" , $e->getMessage();
}

echo "<label for=\"publisheddate\">Departure Date:</label>";
echo "<select id=\"publisheddate\" name=\"publisheddate\">";
    echo "<option value=\"A\">Choose Date</option>";
    foreach ($dates as $date) {
        echo "<option" , ($user_date == $date ? " selected" : "") , ">{$date}</option>";
    }
echo "</select>";

Explicações:

  • Um bloco try {} catch {} É uma maneira limpa de verificar se há erros e controlar o desempenho do seu código após um possível erro de sintaxe da consulta.
  • Eu sou "método encadeado" de getQuery() para que $query Seja gravado apenas uma vez ao criar a consulta.
  • Na maioria dos casos, sua consulta é melhor escrita como um SELECT DISTINCT Em vez de GROUP BY. Aqui está m post de suporte .
  • Seu método select() não precisa receber uma matriz - uma string funcionará perfeitamente. Como publishedDate não [~ # ~] precisa que [~ # ~] seja embalado em backtick, poupe a função qn() chamada de método e deixe-a como uma sequência não citada, sem implicações de segurança.
  • ORDER BY Usará ASC como a direção padrão, portanto, não há necessidade de declarar isso explicitamente. E você precisava de um espaço antes do seu ASC, mas isso pode ter sido apenas um erro de digitação.
  • loadColumn() é a chamada mais apropriada quando você deseja gerar uma matriz unidimensional a partir de um único conjunto de resultados da coluna.
  • Estou procurando apenas $user_date Se a matriz $dates Não estiver vazia. O condicional está fazendo duas coisas: 1. declarando $dates E 2. verificando um valor que não seja falsey (uma matriz vazia é falsey). Se não houver elementos em $dates, Se o usuário enviou ou não $_GET['publisheddate'] É discutível.
  • Se houver um erro de sintaxe na sua consulta, estou declarando $dates Como uma matriz vazia para que o loop foreach() não possa iterar.
  • Nunca mostre $e->getMessage() ao público.
  • Minha preferência pessoal é usar um eco para exibir cada linha de código, em vez de entrar e sair do php ou escrever strings de várias linhas.
  • Não sei por que a primeira opção/padrão tem um valor de A. Assumirei que isso significa "Todos" e você exibirá todos os registros nos resultados da pesquisa, o que parece ser um recurso razoável.
  • Não é necessário escrever selected="selected" No primeiro <option>. Se nenhuma outra opção for selecionada, ela será exibida como a opção selecionada.
  • Os valores do conjunto de resultados são declarados como $date Dentro do loop foreach() e nenhuma sintaxe de objeto (->) É necessária.
  • Ao escrever <option> Valores idênticos ao texto visível, não há necessidade de declarar o atributo value. Poupe o inchaço do código; o texto será enviado como o valor.
  • Os colchetes em torno de $date São meu estilo de codificação preferido - não é necessário neste caso.
0
mickmackusa