Ir para conteúdo

POWERED BY:

Arquivado

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

Dodo15

[Resolvido] Paginaçao nao funciona direito...

Recommended Posts

Boa tarde..

Eu fiz um sistema de busca com o paginator e com o select para escolher o banco de dados que ira pesquisar...

mas quando eu pesquiso aparecem as paginas de "proximo" e "anterior" e quando clico nelas fala que o banco de dados nao existe...

 

como poderia resolver isso?

 

Meu codigo do busca.php é esse:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> 
<title>Busca</title>
<link href="style.css" rel="stylesheet" type="text/css">
</head>

<body>
<p>Resultados:</p>
<?php
$host = 'localhost';
$user = 'root';
$pass = '';
$con = mysql_connect($host,$user,$pass);
$db = 'busca';
mysql_select_db($db,$con) or print mysql_error();

mysql_select_db("busca");

$criterio = $_POST['busca'];

$nome = $_POST['select'];
$criterio    = $_POST['busca'];

$_pagi_sql = "SELECT * FROM `{$nome}` WHERE descricao LIKE '%$criterio%'";

$_pagi_cuantos = 10; // Itens por página


// ESTES 5 ÚLTIMOS SÃO VALORES EXTRAS, NÃO PRECISA COLOCA-LOS A MENOS QUE QUEIRA ALTERAR NOME DA ESCRITA OU ADICIONAR ALGUMA CLASS A TAG QUE CONTERÁ A PAGINAÇÃO
$_pagi_nav_anterior = "<< Anterior"; // Titulo texto link página anterior
$_pagi_nav_siguiente = "Próxima >>"; // Titulo texto link próxima página
$_pagi_nav_primera = ""; // Texto link primeira página
$_pagi_nav_ultima = ""; // Texto link última página
$_pagi_nav_estilo = "Paginacao"; // Classe para estilo css


// Aqui incluimos a biblioteca que carregará todos os valores setados acima.
include("paginator.class.php");

// While com a variavel especial $_pagi_result
while ($campo = mysql_fetch_assoc($_pagi_result)){
 ?>
 <div id="pai">
   <div id="codigo"><?php echo $campo['id']; ?></div>
   <div id="descricao"><?php echo $campo['descricao']; ?></div>
   <div id="emb"><?php echo $campo['emb']; ?></div>
   <div id="un"><?php echo $campo['un']; ?></div>
   <div id="preco">R$<?php echo $campo['preco']; ?></div>
 </div>
 <?php
}
// Aqui ele exibe a paginação
echo $_pagi_navegacion;

?>
<br />
<a href="index.php">VOLTAR</a>
</body>
</html> 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Existe duplicação de mysql_select_db e de variável $criterio.

 

Organize seu código. Você ganha em legibilidade e fica mais fácil pra identificar o problema.

 

O erro está na variável $nome e $criterio. Ele define os valores de nome da tabela e do termo buscado com um conteúdo de um POST. Quando você passa para a próxima página, as variáveis estarão vazias. Logo, seu SQL final será "SELECT * FROM `` WHERE descricao LIKE '%%'"

 

<?php
$con = mysql_connect('localhost','root','');
mysql_select_db('busca',$con) or print mysql_error();

//Quando passar para próxima página, essas variáveis ficarão vazias
$criterio = $_POST['busca'];
$nome = $_POST['select'];

$_pagi_sql = "SELECT * FROM `{$nome}` WHERE descricao LIKE '%$criterio%'";

 

Sugestão: o nome da tabela é definido dinamicamente? Se não for, insira no código, removendo a variável $nome

 

O termo critério é uma palavra-chave buscada? Caso sim, altere o method para $_GET. Assim, quando passar para a próxima página, ele repassará essa informação para a outra página.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O escript funciona, eu pesquisa aparece o resultado e a paginaçao em baixo

mas quando eu clico para ir para a proxima pagina aparece isso:

 

Erro de contagem de registros: SELECT COUNT(*) FROM `` WHERE descricao LIKE '%%'. Mysql informa: Incorrect table name ''

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esse

$nome = $_POST['select'];

 

É um valor único? Se for retire a variavel $nome e coloque o nome da tabela mesmo, se não coloque aqui o nome que a variavel $nome pode assumir.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim

Quando ele pesquisa funciona perfeitamente, aparece os resultados

O problema é passar para outra pagina, ae mostra que nao existe a tabela

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara primeiro de tudo.

 

Nunca exponha sua query a informações sem serem tratadas.

 

Lembre sempre dos riscos de uma SQL Injection.

 

O cara pode facilmente provocar um caos no seu banco de dados se você expõem seu código dessa forma.

 

Digamos que sua select seja esta:

<select name="select">
<option value="noticias">Notícias</option>
<option value="materias">Matérias</option>
<option value="artigos">Artigos</option>
<option value="usuario">Usuários</option>
<option value="extra">Extras</option>
</select>

 

Por mais que seja dentro de um select este valor ele seja "inalterado", a qualquer usuário leigo.

 

Qualquer usuário que entende um pouco de programação pode utilizar algumas extensões do firefox e converter este select em um input text e ele colocar o valor que ele quiser exemplo.

noticias' ; DROP TABLE noticias; --

noticias' ; DROP DATABASE nomedoseuBD; --

 

Tua query ficaria:

SELECT * FROM noticias' ; DROP DATABASE nomedoseuBD; -- WHERE descricao LIKE '%$criterio%'

 

Ou seja buscaria todos os dados da tabela noticias, apagaria seu banco de dados e tudo que estivesse a frete dos dois hifens em vermelho -- neste caso WHERE descricao LIKE '%$criterio%' seria comentado, não dando nenhum erro na execução.

 

 

Resumindo, ele consegue apagar a sua tabela, ou pior, seu banco de dados inteiro.

 

E ele nem precisa de extensão, ele pode muito bem criar um formulário no próprio computador com os campos que você utiliza para busca.

 

E preencher o valor que ele quiser no input que ele criou em um html na área de trabalho do pc dele.

 

Mudando apenas o action da tag form para a mesma action que seu formulário está apontando, ele envia a requisição que ele quiser para a sua página.

 

Ou seja.

 

noticias' ; DROP TABLE noticias; --

noticias' ; DROP DATABASE nomedoseuBD; --

 

O que te dou como sugestão é colocar valores que você irá selecionar e tratar em seguida

 

<select name="select">
<option value="1">Notícias</option>
<option value="2">Matérias</option>
<option value="3">Artigos</option>
<option value="4">Usuários</option>
<option value="5">Extras</option>
</select>

 

 

E no seu PHP você trataria.

 

$nome = $_POST['select'];

switch ($nome){
   default;
   case '1';   $tabela = 'noticias';      break;
   case '2';   $tabela = 'materias';      break;
   case '3';   $tabela = 'artigos';      break;
   case '4';   $tabela = 'usuario';      break;
   case '5';   $tabela = 'extra';      break;
}



$_pagi_sql = "SELECT * FROM $tabela WHERE descricao LIKE '%$criterio%'";

 

Dessa forma você já se proteje, mas não se esqueça que a variavel $criterio também pode sofrer SQL Injection.

 

Então procure tratar sempre valores que entraram nas suas querys.

 

 

Quanto ao erro.

 

Tenta debugar o código.

 

Adicione estas alterações ao teu código:

 

$host = 'localhost';

$user = 'root';

$pass = '';

$con = mysql_connect($host,$user,$pass);

$db = 'busca';

mysql_select_db($db,$con) or print mysql_error();

 

// mysql_select_db("busca"); - APAGUE ESTA LINHA, NÃO HÁ NECESSIDADE DELA

 

$criterio = $_POST['busca'];

 

$nome = $_POST['select'];

$criterio = $_POST['busca'];

 

$_pagi_sql = "SELECT * FROM `{$nome}` WHERE descricao LIKE '%$criterio%'";

 

echo "Nome da DB:". $db ." <br />";

echo "Query:". $_pagi_sql ." <br />";

 

 

Veja o que retorna nestas duas linhas, quando você faz a busca, e também quando você passa de página.

 

Vai te ajudar melhor a perceber o que é.

 

Mas o erro é simples.

 

Quando você faz a pesquisa é enviado a informação via POST da tabela que deve ser pesquisada.

 

Já quando você clica em próxima página este valor é perdido.

 

Para este tipo de coisa o ideal é você utilizar GET.

 

Pois ai você pode passar o nome da tabela por uma variável no link de próximo, e anterior.

 

Para isso basta que você deixe o valor na sua url.

 

http://www.seusite.com/pesquisa.php?select=1&criterio=palavrabuscada

 

E receba esse valor via $_GET ao invés de $_POST

 

Resumindo, básicamente o que nosso amigo Vinicius Cruz falou.

 

=)

Compartilhar este post


Link para o post
Compartilhar em outros sites

DEU CERTO, MUITOOOOOO OBRIGADO!!!!

 

Agora o codigo ficou assim:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> 
<title>Busca</title>
<link href="style.css" rel="stylesheet" type="text/css">
</head>

<body>
<p>Resultados:</p>
<?php
$host = 'localhost';
$user = 'root';
$pass = '';
$con = mysql_connect($host,$user,$pass);
$db = 'busca';
mysql_select_db($db,$con) or print mysql_error();


$criterio = $_GET['busca'];

$nome = $_GET['select'];
$criterio = $_GET['busca'];

$_pagi_sql = "SELECT * FROM `{$nome}` WHERE descricao LIKE '%$criterio%'";

$criterio = $_GET['busca'];

$nome = $_GET['select'];

switch ($nome){
   default;
   case '1';   $tabela = 'tinta';      break;
   case '2';   $tabela = 'eletrica';      break;
   case '3';   $tabela = 'ferragens';      break;
   case '4';   $tabela = 'hidraulica';      break;
   case '5';   $tabela = 'promocoes';      break;
}

$_pagi_sql = "SELECT * FROM $tabela WHERE descricao LIKE '%$criterio%'";

$_pagi_cuantos = 10; // Itens por página


// ESTES 5 ÚLTIMOS SÃO VALORES EXTRAS, NÃO PRECISA COLOCA-LOS A MENOS QUE QUEIRA ALTERAR NOME DA ESCRITA OU ADICIONAR ALGUMA CLASS A TAG QUE CONTERÁ A PAGINAÇÃO
$_pagi_nav_anterior = "<< Anterior"; // Titulo texto link página anterior
$_pagi_nav_siguiente = "Próxima >>"; // Titulo texto link próxima página
$_pagi_nav_primera = ""; // Texto link primeira página
$_pagi_nav_ultima = ""; // Texto link última página
$_pagi_nav_estilo = "Paginacao"; // Classe para estilo css


// Aqui incluimos a biblioteca que carregará todos os valores setados acima.
include("paginator.class.php");

// While com a variavel especial $_pagi_result
while ($campo = mysql_fetch_assoc($_pagi_result)){
 ?>
 <div id="pai">
   <div id="codigo"><?php echo $campo['id']; ?></div>
   <div id="descricao"><?php echo $campo['descricao']; ?></div>
   <div id="emb"><?php echo $campo['emb']; ?></div>
   <div id="un"><?php echo $campo['un']; ?></div>
   <div id="preco">R$<?php echo $campo['preco']; ?></div>
 </div>
 <?php
}
// Aqui ele exibe a paginação
echo $_pagi_navegacion;

?>
<br />
<a href="index.php">VOLTAR</a>
</body>
</html>

Tem alguma coisa que prejudique a segurança e pode ser alterada?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeiro de tudo para facilitar a manutenção, elimine códigos duplicados, e adicione a conexão do seu banco de dados em um arquivos externo ex: config.php

 

E é bom também criar uma função para tratar os dados de SQL Injection (Créditos ao Leozitho).

 

 

De forma bem básica e grosseira seria isso.

 

config.php

<?php
$host = 'localhost';
$user = 'root';
$pass = '';
$con = mysql_connect($host,$user,$pass);
$db = 'busca';
mysql_select_db($db,$con) or print mysql_error();
?>

 

 

funcoes.php

<?php
function anti_injection($str){
    // verifica se o valor da string é somente numérico 
    if (!is_numeric($str)) { 
        //verifica se o magic_quotes está habilitado, se sim tira o escape da string, caso não mantem o valor digitado.
       $str = get_magic_quotes_gpc() ? stripslashes($str) : $str;  
       // verifica se a função mysql_real_escape_string está habilitada, se sim roda ela, se não usa o mysql_escape_string
       $str = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($str) : mysql_escape_string($str);
    }
    // retorna o valor tratado 
    return $str;

}
?>

 

<?php
// INCLUI ARQUIVO DE CONFIGURAÇÃO
require_once "config.php";

// INCLUI ARQUIVO DE FUNÇÕES
require_once "funcoes.php";
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> 
<title>Busca</title>
<link href="style.css" rel="stylesheet" type="text/css">
</head>

<body>
<p>Resultados:</p>
<?php

$nome = $_GET['select'];
$criterio = anti_injection($_GET['busca']); // TRATA O VALOR DO CRITÉRIO COM A FUNÇÃO PARA EVITAR SQL INJECTION

// TRATA O VALOR VINDO DO $_GET['select']
switch ($nome){
   default;
   case '1';   $tabela = 'tinta';      break;
   case '2';   $tabela = 'eletrica';      break;
   case '3';   $tabela = 'ferragens';      break;
   case '4';   $tabela = 'hidraulica';      break;
   case '5';   $tabela = 'promocoes';      break;
}


// GERA QUERY A SER PESQUISADA
$_pagi_sql = "SELECT * FROM $tabela WHERE descricao LIKE '%$criterio%'";

// CONFIGURAÇÕES DA CLASS PAGINATOR
$_pagi_cuantos = 10; // Itens por página
$_pagi_nav_anterior = "<< Anterior"; // Titulo texto link página anterior
$_pagi_nav_siguiente = "Próxima >>"; // Titulo texto link próxima página
$_pagi_nav_primera = ""; // Texto link primeira página
$_pagi_nav_ultima = ""; // Texto link última página
$_pagi_nav_estilo = "Paginacao"; // Classe para estilo css


// INCLUI BIBLIOTECA PAGINATOR
include("paginator.class.php");

// LOOP DOS DADOS VINDOS DO BANCO
while ($campo = mysql_fetch_assoc($_pagi_result)){
 ?>
 <div id="pai">
   <div id="codigo"><?php echo $campo['id']; ?></div>
   <div id="descricao"><?php echo $campo['descricao']; ?></div>
   <div id="emb"><?php echo $campo['emb']; ?></div>
   <div id="un"><?php echo $campo['un']; ?></div>
   <div id="preco">R$<?php echo $campo['preco']; ?></div>
 </div>
 <?php
}

// EXIBE A PAGINAÇÃO DOS DADOS
echo $_pagi_navegacion;

?>
<br />
<a href="index.php">VOLTAR</a>
</body>
</html>

 

 

------------

EDITANDO

 

E tem um detalhe:

 

Se a opção do seu PHP.INI short_open_tags estiver como ON você ainda pode deixar teu código mais simples.

 

Abrindo tags PHP assim:

<? ?>

 

Ao invés de assim:

<?php ?>

 

E dando a vantagem de dar um echo direto no HTML assim:

<?=$variavel?>

 

Ao invés de assim

<?php echo $variavel; ?>

 

 

Ou seja seu código ficaria assim:

 

 

config.php

<?
$host = 'localhost';
$user = 'root';
$pass = '';
$con = mysql_connect($host,$user,$pass);
$db = 'busca';
mysql_select_db($db,$con) or print mysql_error();
?>

 

 

funcoes.php

<?
function anti_injection($str){
    // verifica se o valor da string é somente numérico 
    if (!is_numeric($str)) { 
        //verifica se o magic_quotes está habilitado, se sim tira o escape da string, caso não mantem o valor digitado.
       $str = get_magic_quotes_gpc() ? stripslashes($str) : $str;  
       // verifica se a função mysql_real_escape_string está habilitada, se sim roda ela, se não usa o mysql_escape_string
       $str = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($str) : mysql_escape_string($str);
    }
    // retorna o valor tratado 
    return $str;

}
?>

 

<?
// INCLUI ARQUIVO DE CONFIGURAÇÃO
require_once "config.php";

// INCLUI ARQUIVO DE FUNÇÕES
require_once "funcoes.php";
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> 
<title>Busca</title>
<link href="style.css" rel="stylesheet" type="text/css">
</head>

<body>
<p>Resultados:</p>
<?

$nome = $_GET['select'];
$criterio = anti_injection($_GET['busca']); // TRATA O VALOR DO CRITÉRIO COM A FUNÇÃO PARA EVITAR SQL INJECTION

// TRATA O VALOR VINDO DO $_GET['select']
switch ($nome){
   default;
   case '1';   $tabela = 'tinta';      break;
   case '2';   $tabela = 'eletrica';      break;
   case '3';   $tabela = 'ferragens';      break;
   case '4';   $tabela = 'hidraulica';      break;
   case '5';   $tabela = 'promocoes';      break;
}


// GERA QUERY A SER PESQUISADA
$_pagi_sql = "SELECT * FROM $tabela WHERE descricao LIKE '%$criterio%'";

// CONFIGURAÇÕES DA CLASS PAGINATOR
$_pagi_cuantos = 10; // Itens por página
$_pagi_nav_anterior = "<< Anterior"; // Titulo texto link página anterior
$_pagi_nav_siguiente = "Próxima >>"; // Titulo texto link próxima página
$_pagi_nav_primera = ""; // Texto link primeira página
$_pagi_nav_ultima = ""; // Texto link última página
$_pagi_nav_estilo = "Paginacao"; // Classe para estilo css


// INCLUI BIBLIOTECA PAGINATOR
include("paginator.class.php");

// LOOP DOS DADOS VINDOS DO BANCO
while ($campo = mysql_fetch_assoc($_pagi_result)){
 ?>
 <div id="pai">
   <div id="codigo"><?=$campo['id']?></div>
   <div id="descricao"><?=$campo['descricao']?></div>
   <div id="emb"><?=$campo['emb']?></div>
   <div id="un"><?=$campo['un']?></div>
   <div id="preco">R$<?=$campo['preco']?></div>
 </div>
 <?
}

// EXIBE A PAGINAÇÃO DOS DADOS
echo $_pagi_navegacion;

?>
<br />
<a href="index.php">VOLTAR</a>
</body>
</html>

 

=)

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

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