Dodo15 0 Denunciar post Postado Janeiro 8, 2011 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
Vinicius Cruz 1 Denunciar post Postado Janeiro 8, 2011 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
Dodo15 0 Denunciar post Postado Janeiro 8, 2011 Nao funcionou, ainda da o mesmo erro Compartilhar este post Link para o post Compartilhar em outros sites
F3RR4M3N745 0 Denunciar post Postado Janeiro 8, 2011 Dodo, poderia me dizer se acontece um erro ou o script não funciona da forma esperada? Se for o erro, poste aqui, vai ajudar. Compartilhar este post Link para o post Compartilhar em outros sites
Dodo15 0 Denunciar post Postado Janeiro 8, 2011 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
F3RR4M3N745 0 Denunciar post Postado Janeiro 8, 2011 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
Dodo15 0 Denunciar post Postado Janeiro 8, 2011 Nao... sao 5 tabelas, e de acordo com oq eu seleciono no select ele vai buscar Compartilhar este post Link para o post Compartilhar em outros sites
F3RR4M3N745 0 Denunciar post Postado Janeiro 8, 2011 Tem certeza que os nomes das tabelas estão escritas de forma certa? Que existe uma coluna em todas as tabelas? Compartilhar este post Link para o post Compartilhar em outros sites
Dodo15 0 Denunciar post Postado Janeiro 8, 2011 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
Nícolas 4 Denunciar post Postado Janeiro 9, 2011 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
Dodo15 0 Denunciar post Postado Janeiro 9, 2011 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
Nícolas 4 Denunciar post Postado Janeiro 9, 2011 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
Dodo15 0 Denunciar post Postado Janeiro 9, 2011 Po, BRIGADAO CARA Você me ajudo MUITO MESMO BRIGADAOOOO!!! Compartilhar este post Link para o post Compartilhar em outros sites