Ir para conteúdo
Fórum Script Brasil
  • 0

URL Amigável com SQL (Ajuda)


aivanlins

Pergunta

Oi pessoal, tudo certo?
 

Sou novo em programação e criei um site de restaurante e coloquei URL Amigável dela tudo ok. Mas na hora que eu fui clicar em um link de pagina cuja as informações vem do BD o mesmo deu ERRO.

O link esta:
http://meu-site.com.br/informativo_descricao&id=13
 

e eu gostaria que ficasse assim ou mais próximo disso:
http://meu-site.com.br/mais-esperanca-para-voce

 

Bom, segue o que tenho aqui:

.htaccess

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]
RewriteRule   ^post/([0-9]+)/(.*)?$   posts.php?id=$1   [NC,L]

 

Index.php

<?php
$modulo = Url::getURL( 0 );

if( $modulo == null )
$modulo = "home";

if( file_exists( "pages/" . $modulo . ".php" ) )
require "pages/" . $modulo . ".php";
else
require "pages/404.php";
?>

Pagina:

<?
$query = "select * from tbl_informativo order by id desc";
$rs = mysql_query($query);
while($row = mysql_fetch_array($rs)){
?>
	<div class="mix col-md-12 col-lg-12 col-sm-12 col-xs-12 single-menu <?= $row["categoria"] ?> "  >
		<div class="event-img">
			<img src="<?= $row["capa"] ?>" width="300" height="200" alt="">
		</div>
		<div class="event-details">
			<h3><a href="<?php echo URL::getBase(); ?>informativo_descricao&id=<? echo "$row[id]"; ?>"><? echo "$row[titulo]"; ?></a></h3>
		</div>
	</div>
<? } ?>    

 

Banco de Dados

CREATE TABLE `tbl_informativo` (
  `id` int(11) NOT NULL,
  `capa` text CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL,
  `titulo` text CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL,
  `slug` text CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL,
  `categoria` text CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL,
  `texto` text CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL,
  `data` varchar(15) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL,
  `codigo` text CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

--
-- Extraindo dados da tabela `tbl_informativo`
--

INSERT INTO `tbl_informativo` (`id`, `capa`, `titulo`, `slug`, `categoria`, `texto`, `data`, `codigo`) VALUES
(13, '/upload/files/Sem%20T%C3%ADtulo-1.png', 'MAIS ESPERANÇA PARA VOCÊ', 'mais-esperanca-para-voce', 'NOVIDADE', '<p>Para um restaurante um cl&aacute;ssico &eacute; algo que, por alguma raz&atilde;o, cai no gosto do p&uacute;blico, quase que por unanimidade.</p>\r\n\r\n<p>Todos os domingos no jantar (a partir de junho iremos homenagear os nossos cl&aacute;ssicos).<br />\r\nE quem sai ganhando &eacute; voc&ecirc;!<br />\r\nConvide amigos e a cada 2 pratos voc&ecirc; paga somente um. &Eacute; uma diferen&ccedil;a de 50% nos pratos! Que tal?</p>\r\n\r\n<p>(Promo&ccedil;&atilde;o v&aacute;lida somente para consumo no restaurante. N&atilde;o &eacute; v&aacute;lida para entrega)\r\n', '26/05/2019', '9968e41f26b710780d4785ca460ede5b');

Url.php

<?php
class Url
{
    private static $url = null;
    private static $baseUrl = null;
    
    public static function getURL( $id )
    {
        if( self::$url == null )
        // Verifica se a lista de URL já foi preenchida
            self::getURLList();
        
        // Valida se existe o ID informado e retorna.
        if( isset( self::$url[ $id ] ) )
            return self::$url[ $id ];
        
        // Caso não exista o ID, retorna nulo
        return null;
    }
    
    public static function getBase()
    {
        if( self::$baseUrl != null )
            return self::$baseUrl;

        global $_SERVER;
        $startUrl = strlen( $_SERVER["DOCUMENT_ROOT"] );
        $excludeUrl = substr( $_SERVER["SCRIPT_FILENAME"], $startUrl, -9 );
        if( $excludeUrl[0] == "/" )
            self::$baseUrl = $excludeUrl; 
        else
            self::$baseUrl = "/" . $excludeUrl;
        return self::$baseUrl;
    }
    
    private static function getURLList()
    {
        global $_SERVER;
        
        // Primeiro traz todos as pastas abaixo do index.php
        $startUrl = strlen( $_SERVER["DOCUMENT_ROOT"] ) -1;
        $excludeUrl = substr( $_SERVER["SCRIPT_FILENAME"], $startUrl, -10 );
        
        // a variável$request possui toda a string da URL após o domínio.
        $request = $_SERVER['REQUEST_URI'];
        
        // Agora retira toda as pastas abaixo da pasta raiz
        $request = substr( $request, strlen( $excludeUrl ) );
        
        // Explode a URL para pegar retirar tudo após o ?
        $urlTmp = explode("?", $request);
        $request = $urlTmp[ 0 ];
        
        // Explo a URL para pegar cada uma das partes da URL
        $urlExplodida = explode("/", $request);
        
        $retorna = array();

        for($a = 0; $a <= count($urlExplodida); $a ++)
        {
            if(isset($urlExplodida[$a]) AND $urlExplodida[$a] != "")
            {
                array_push($retorna, $urlExplodida[$a]);
            }
        }
        self::$url = $retorna;
    }
}
?>

 

Não sei se precisa dessa informação toda, mas de qualquer forma esta ai. Obrigado desde já!

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

Desde 1990 que venho fugindo do tópico classe, mas em 2022 decidi estudar o Laravel para ver se eu aprendo um pouco de classe. Por enquanto, ainda nada.

O seu tópico é interessante, pois o núcleo do seu trabalho envolve uma classe chamada url.

Assim, eu decidi estudá-la, mas o resultado foi desastre.

Primeiro chamei de public tudo o que é private. A seguir fui ver o valor de url::getURLList, e obtive null. Então, desmontei a função getURLList para ver se eu chegava no mesmo resultado, mas não consegui:
 

astudy.php

<?php
include('url.php');
var_dump(url::getURL(0)); // study.php
var_dump(url::getBase()); // /astudy/a
var_dump(url::getURLList()); // null
var_dump(strlen( $_SERVER["DOCUMENT_ROOT"] )-1); // 12
$startUrl = strlen( $_SERVER["DOCUMENT_ROOT"] ) -1;
var_dump($_SERVER['DOCUMENT_ROOT']); // C:/wamp64/www
var_dump($_SERVER['REQUEST_URI']); // /astudy/astudy.php
$request = $_SERVER['REQUEST_URI'];
var_dump($_SERVER['SCRIPT_FILENAME']); // C:/wamp64/www/astudy/astudy.php
$excludeUrl = substr( $_SERVER["SCRIPT_FILENAME"], $startUrl, -10 );
$request= substr($request,strlen($excludeUrl));
var_dump($request); // study.php
$urlTmp = explode("?", $request);
var_dump($urlTmp); // array 0 => study.php
$request = $urlTmp[ 0 ];
var_dump($request); // study.php
$urlExplodida = explode("/", $request);
var_dump($urlExplodida); // array 0 => study.php
$retorna = array();
var_dump($retorna); // array empty
for($a = 0; $a <= count($urlExplodida); $a ++){
    if(isset($urlExplodida[$a]) AND $urlExplodida[$a] != ""){
       array_push($retorna, $urlExplodida[$a]);}}
var_dump($retorna); // array 0 => study.php
url::$url = $retorna;
var_dump(url::$url); // array 0 => study.php

Esse é um trabalho bem difícil. Para mim, a classe é ainda um mistério. Não sei ainda como depurar uma classe.

Screenshot_1.png

Link para o comentário
Compartilhar em outros sites

  • 0

Outra forma que eu vi para fazer auditoria é isolando a função num código a parte, assim:

<?php
class teste {
public static $url = null;
public static function getURLList(){
    global $_SERVER;
    $startUrl = strlen( $_SERVER["DOCUMENT_ROOT"] ) -1;
    $excludeUrl = substr( $_SERVER["SCRIPT_FILENAME"], $startUrl, -10 );
    $request = $_SERVER['REQUEST_URI'];
    $request = substr( $request, strlen( $excludeUrl ) );
    $urlTmp = explode("?", $request);
    $request = $urlTmp[ 0 ];
    $urlExplodida = explode("/", $request);
    $retorna = array();
    for($a = 0; $a <= count($urlExplodida); $a ++){
        if(isset($urlExplodida[$a]) AND $urlExplodida[$a] != ""){
            array_push($retorna, $urlExplodida[$a]);}}
    self::$url = $retorna;}
}
var_dump(teste::getURLList()); // null

Dessa vez deu null, quando o meu primeiro teste deu 'study.php'. Claro que o meu teste não é válido, pois não sei como emular a função "self::$url" fora do contexto de uma classe.

Por outro lado, se você respirar fundo, e lembrar do curso de programação, onde o professor ensinou que toda função retorna um valor, você notará que a função getURLList não segue a orientação do professor. Eu acrescentei nesse código uma instrução assim "return self::$url;" e assim consegui chegar no mesmo valor que eu apurei na unha.

E assim hoje eu aprendi um pouco de classe, basta lembrar do curso de função.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...