Jack Oliveira 1 Denunciar post Postado Novembro 4, 2017 OLA PESSOAL ALGUEM AI PODERIA ME DAR UMA EXPLICAÇÃO BEM SIMPLES E FACIL DE MIM COMPREENDER DE COMO FAZER A URL AMIGAVEL PARA ESTE MEU SISTEMA A URL DELE ESTA : minhaloja.com/produtos/catalogo.php?id=200 quero que ele fica assim minhaloja.com/produtos/HD-SAMSUNG-500-GB OU UM DESTE DOIS minhaloja.com/produtos/HD-SAMSUNG-500-GB.html minhaloja.com/produtos/200/HD-SAMSUNG-500-GB eu ja olhei varios tuturial mais aind fiquei meio perdido ou seja perdido de como montar eles em cada parte, deste do CLICAR NA IMAGEM E DIRECIONAR ELE PARA A PAGINA Q ESTA O catalogo.php para gera a URL AMIVAGEL ////////////////////////////////////////////////////////////////////////////////////////// PEGUEI ESTA BASE AQUI DA INTERNET FIZ DO JEITO Q FALOU AI MAIS AI DAVA ERRO NO ARQUIVO CATALOGO.PHP EU MUDAVA AS FORMA AI APARECIA ERROS NAS LINHAS E O CATALOGO VAZIO ME DIZER AI COMO FAZER ELE E ELE FUNCIONAR SEM ERRO NO E NAO VIM AS TABELAS VAZIAS DB... // ----------- URL AMIVAGEL DA INTERNET ---- ESTE E O LINK DA PAGINA https://www.webdevbr.com.br/urls-amigaveis-com-php-htaccess-apache-e-nginx ////////////// //configuro os formatos de URL que eu quero $route->add('/{prefix}/{modulo}{acao}/{id}'); $route->add('/{modulo}/{id}/{titulo}'); $route->add('/{titulo}'); //pego as informações da URL $params = $route->params($url); if (isset($params['prefix']) and $params['prefix'] == 'admin') { //logica para carregar a administração do site //posso usar includes ou autoload, ou o que quiser include 'carrega_admin.php'; die(); } $modulos_disponiveis = [ 'categorias', 'paginas', 'usuarios' ]; if (isset($params['modulo']) and in_array($params['modulo'], $modulos)) { //logica para carregar um modulo do site //(listagem de categorias por exemplo) include 'carrega_modulo.php'; die(); } if (isset($params['titulo'])) { //logica para carregar paginas do site //(página de contato por exemplo) include 'carrega_pagina.php'; die(); } echo 'Página não encontrada'; Este seria um arquivo "bootstrap" do site, ou seja, iria carregar a aplicação, cada item entre chaves ({}) nas rotas se torna um nó no array $params, assim na linha abaixo: $route->add('/{prefix}/{modulo}{acao}/{id}'); Teriamos um array neste formato: $params['prefix']; $params['modulo']; $params['acao']; $params['id']; Muito mais simples de trabalhar não? O $SERVER['PATHINFO'] Pra encontrar a URL vamos usar $_SERVER['PATH_INFO'] em vez de GET, no exemplo acima teriamos: $url = '/'; if (isset($_SERVER['PATH_INFO'])) $url = $_SERVER['PATH_INFO']; //configuro os formatos de URL que eu quero $route->add('/{prefix}/{modulo}{acao}/{id}'); $route->add('/{modulo}/{id}/{titulo}'); $route->add('/{titulo}'); //pego as informações da URL $params = $route->params($url); //restante do código A variável $_SERVER['PATH_INFO'] retorna todo valor digitado usando '/' após um arquivo PHP, por exemplo: www.seusite.com.br/index.php/categorias/1 Neste caso teriamos /categorias/1 como valor de $_SERVER['PATH_INFO'], acontece que se nada for passado a variável não existe, por isso passei um valor padrão $url = '/'; e verifiquei a existência com isset() logo na sequência. Mas e essa classe $route, como ela funciona? Trabalhando com as rotas Eu criei um arquivo em src/Router/Router.php com o seguinte conteúdo: <?php namespace WebDevBr\Router; class Router { private $routes = []; /** * Adiciona uma nova rota * * @param String $route */ public function add($route) { preg_match_all('{\{[a-z][a-zA-Z0-9_]*}', $route, $variable); preg_match_all('{[^\{][a-z][a-zA-Z0-9_]*}', $route, $static); $variable[0] = $this->trimArray('{', $variable[0]); $static[0] = $this->trimArray('/', $static[0]); $this->routes[$route]['variable'] = $variable[0]; $this->routes[$route]['static']['order'] = $static[0]; $this->routes[$route]['static']['values'] = array_diff($static[0], $variable[0]); } /** * Retorna os parâmetros configurados da rota * Ou null caso não seja encontrada uma rota válida * * @param String $url [description] */ public function params($url) { $result = []; $clean = ltrim ($url, '/'); $params = explode('/', $clean); foreach ($this->routes as $route) { $params = array_diff($params, $route['static']['values']); if (count($params) == count($route['variable'])) { return array_combine($route['variable'], $params); } } } /** * Remove um ou mais caracteres de strings em um array * em um ambiente ideal isso seria um trait ou arquivo * de funções */ protected function trimArray($str, $data) { $array_fill = array_fill(0, count($data), $str); return array_map( function($v, $str) {return ltrim($v, $str);}, $data, $array_fill ); } } Tentei manter o código o mais limpo possível, Nosso exemplo completo com o carregamento do nosso novo objeto. //Carrego minha classe Router include __DIR__.'src/Router/Router.php'; $route = new WebDevBr\Router\Router; $url = '/'; if (isset($_SERVER['PATH_INFO'])) $url = $_SERVER['PATH_INFO']; //configuro os formatos de URL que eu quero $route->add('/{prefix}/{modulo}{acao}/{id}'); $route->add('/{modulo}/{id}/{titulo}'); $route->add('/{titulo}'); //pego as informações da URL $params = $route->params($url); //restante do código Prontinho, nosso exemplo agora deve funcionar. Removendo a index.php da URL Com Apache e Htaccess: <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] </IfModule> Com Nginx: location / { try_files $uri $uri/ /index.php?$args; } O PHP Built-in Server não precisa de nenhuma configuração especial, ele já trabalha corretamente se omitirmos a index.php da rota. // --------- ESTE É SYS.PHP QUERO SABER ONDE QUE EU COLOCO AQUI PARA PUXAR A URL E O QUE POR A MAIS AQUI OU MUDAR ETC..--------- ///////// <!--- ENVIANDO OS DADOS DA TABELA PARA O CATALOGO.PHP ---> <?php require_once 'database/DB.php'; require_once 'database/class.php'; $con = new conexao(); $con->connect(); $getId = $_GET['id']; if($getId){ //se existir recupera os dados e tras os campos preenchidos $consulta = mysql_query("SELECT * FROM produtos WHERE id = + $getId"); $dados = mysql_fetch_array($consulta); //Busca na tabela o numero de vezes que a página ja foi visitada $busca = "Select * FROM produtos WHERE id = {$getId}"; $exe = mysql_query($busca); $resultado = (mysql_fetch_array($exe)); //Pega o numero de visistas que consta na tabela, adiciona mais um e atualiza $visitantes = $resultado['visitas'] + 1; $altera = "UPDATE produtos SET visitas = '{$visitantes}' WHERE id = '{$getId}'"; $exe1 = mysql_query($altera); //Faz uma nova busca e retorna o numero de visitas depois da atualização $exe = mysql_query($busca); $total = (mysql_fetch_array($exe)); $visitas = $total['visitas']; } if(isset ($_POST['editar'])){ // Edita $nome = $_POST['nome']; // NAME $telefone = $_POST['telefone']; // NAME $facebook = $_POST['facebook']; // NAME $cargo = $_POST['cargo']; // NAME $valor = $_POST['valor']; $data1 = $_POST['data1']; $categoria = $_POST['categoria']; $post = $_POST['post']; $cliente = $_POST['cliente']; // NAME $imagem = $_POST['imagem']; $visitas = $_POST['visitas']; $mapa = $_POST['mapa']; $descricao = $_POST['descricao']; $crud = new crud('produtos'); // instancia classe com as operaçoes crud, passando o nome da tabela como parametro $crud->atualizar("nome='$nome',telefone='$telefone',facebook='$facebook',cargo='$cargo',valor='$valor',visitas='$visitas',data1='$data1',categoria='$categoria',post='$post',cliente='$cliente',imagem='$imagem',mapa='$mapa',descricao='$descricao'", "id='$getId'"); } ?> // ------ ESTE É O DO CATALOGO.PHP ----- QUE ESTA A ASSIM minhaloja.com/produtos/catalogo.php?id=200 E QUERO QUE QUANDO CLICAR NA IMAGEM OU ALGUM BOTAO PARA DIRECIONAR PARA ESTE CATALOGO.PHP e ela ficar assim minhaloja.com/produtos/HD-SAMSUNG-500-GB ------- /////// OBS: NÃO COLOQUEI O CODIGO COMPLETO ATE O FINAL PRA NAO FICAR MUITO LOGO Q JA ESTA <!-- ESTE AQUI ONDE RECEBE TODOS OS DADOS DA TABELA SQL PARA O CATALOGO - O QUE TENHO QUE MUDAR AQUI TBM? --> <?php require_once 'assest/public/sys.php'; ?> <!DOCTYPE html> <html lang=pt-br class=no-js> <head> <meta http-equiv=content-type content="text/html; charset=UTF-8"> <meta name=theme-color content="#bf0e0e"/> <meta charset=utf-8> <meta name=language content=pt-br> <meta name=viewport content="width=device-width, initial-scale=1, maximum-scale=1"> <title><?php echo $dados["nome"]; ?></title> <meta name=description content="<?php echo $dados["nome"]; ?>"/> <meta name=keywords content="<?php echo $dados["cargo"]; ?>"/> <meta property=og:site_name content="notícias"/> <meta property=og:type content=article /> <meta content="<?php echo DadosSession('base_url'); ?>produtos/catalogo.php?id=<?php echo $dados["id"]; ?>" property=og:url> <meta content="<?php echo DadosSession('base_url'); ?>img/cat/<?php echo $dados["imagem"]; ?>" property=og:image> <meta content="<?php echo $dados["nome"]; ?>" property=og:title> <meta content="<?php echo $dados["descricao"]; ?>" property=og:description> <script type='text/javascript'> window.mod_pagespeed_start = Number(new Date()); </script> <link href="<?php echo DadosSession('base_url'); ?>img/cat/<?php echo $dados["imagem"]; ?>" rel=image_src /> <meta property=og:image:type content="image/jpeg"> <meta property=og:image:width content=400> <meta property=og:image:height content=400> <link rel=stylesheet href="https://fonts.googleapis.com/icon?family=Material+Icons"/> <link rel=stylesheet href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css"> <link href="css/bootstrap.min.css" rel=stylesheet> <link href="css/owl.carousel.css" rel=stylesheet> <link href="css/owl.theme.default.min.css" rel=stylesheet> <link href="css/animate.min.css" rel=stylesheet> <link href="css/animsition.css" rel=stylesheet> <link rel=stylesheet type="text/css" href="css/gridGallery.css"> <link rel=stylesheet type="text/css" href="css/uploadify.css"> <link href="css/plugins.min.css" rel=stylesheet> <link href="css/material-kit.css" rel=stylesheet /> <link href="css/component.css" rel=stylesheet media=screen> <link href="css/style.css" rel=stylesheet> <link rel="shortcut icon" href="<?php echo DadosSession('base_url'); ?>img/img_site/afc4e973ce.jpg" /> <script type="text/javascript" src="js/ajax_votacao.js"></script> <script src="js/modernizr.custom.js"></script> <script src="js/jquery.min.js"></script> <script src="js/jquery.flexslider.js"></script> <script src="js/material.min.js"></script> <script src="js/material-kit.js"></script> <script src="js/jquery.maskedinput.js"></script> <script type="text/javascript" src="js/jquery.uploadify.min.js"></script> <style> #menu-topo{background-color:#eee}#menu-topo li a{color:#333}.top-wrap,.sb-icon-search,.sb-search.sb-search-open .sb-icon-search,.no-js .sb-search .sb-icon-search{background-color:#bf0e0e}#menu-topo .sociais a{color:#ccc}.cor-bg{background:#c62d2d}.cor{color:#c62d2d}.busca{background:url(<?php echo DadosSession('base_url'); ?>/arquivos/template/794a3559ef930d8b7900a9c4b3c894eb.jpg) #EEE no-repeat center center / cover} .busca-interna{background:url(<?php echo DadosSession('base_url'); ?>/img/img_site/fundo.png) #EEE no-repeat center center / cover}.nav>li>a:focus,.nav>li>a:hover{background-color:#333}#footer{background-color:#222}#footer .btmFooter{background-color:#181818;color:#7f7f7f}#footerapp{background-color:#181818;position:absolute;bottom:0;left:0;right:0;padding:30px}.footer li a{#7f7f7f}</style> </head> <body id=top> <div class=scroller> <div class=scroller-inner> <header> <div class=col-md-1> <li> <div class="col-md-2 pull-right row"> <div id=categ> <ul class=menu> <li class=dropdown> </div> </div> </div> </div> <!--PC--> <div class="header ocultar"> <div class=container> <div class=row> <div class="col-sm-4 ocultar"> <a href="<?php echo DadosSession('base_url'); ?>"> <script data-pagespeed-no-defer>//<![CDATA[ (function(){var g=this;function h(b,d){var a=b.split("."),c=g;a[0]in c||!c.execScript||c.execScript("var "+a[0]);for(var e;a.length&&(e=a.shift());)a.length||void 0===d?c[e]?c=c[e]:c=c[e]={}:c[e]=d};function l(b){var d=b.length;if(0<d){for(var a=Array(d),c=0;c<d;c++)a[c]=b[c];return a}return[]};function m(b){var d=window;if(d.addEventListener)d.addEventListener("load",b,!1);else if(d.attachEvent)d.attachEvent("onload",b);else{var a=d.onload;d.onload=function(){b.call(this);a&&a.call(this)}}};var n;function p(b,d,a,c,e){this.h=b;this.j=d;this.l=a;this.f=e;this.g={height:window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight,width:window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth};this.i=c;this.b={};this.a=[];this.c={}}function q(b,d){var a,c,e=d.getAttribute("data-pagespeed-url-hash");if(a=e&&!(e in b.c))if(0>=d.offsetWidth&&0>=d.offsetHeight)a=!1;else{c=d.getBoundingClientRect();var f=document.body;a=c.top+("pageYOffset"in window?window.pageYOffset:(document.documentElement||f.parentNode||f).scrollTop);c=c.left+("pageXOffset"in window?window.pageXOffset:(document.documentElement||f.parentNode||f).scrollLeft);f=a.toString()+","+c;b.b.hasOwnProperty(f)?a=!1:(b.b[f]=!0,a=a<=b.g.height&&c<=b.g.width)}a&&(b.a.push(e),b.c[e]=!0)}p.prototype.checkImageForCriticality=function(b){b.getBoundingClientRect&&q(this,b)};h("pagespeed.CriticalImages.checkImageForCriticality",function(b){n.checkImageForCriticality(b)});h("pagespeed.CriticalImages.checkCriticalImages",function(){r(n)});function r(b){b.b={};for(var d=["IMG","INPUT"],a=[],c=0;c<d.length;++c)a=a.concat(l(document.getElementsByTagName(d[c])));if(0!=a.length&&a[0].getBoundingClientRect){for(c=0;d=a[c];++c)q(b,d);a="oh="+b.l;b.f&&(a+="&n="+b.f);if(d=0!=b.a.length)for(a+="&ci="+encodeURIComponent(b.a[0]),c=1;c<b.a.length;++c){var e=","+encodeURIComponent(b.a[c]);131072>=a.length+e.length&&(a+=e)}b.i&&(e="&rd="+encodeURIComponent(JSON.stringify(t())),131072>=a.length+e.length&&(a+=e),d=!0);u=a;if(d){c=b.h;b=b.j;var f;if(window.XMLHttpRequest)f=new XMLHttpRequest;else if(window.ActiveXObject)try{f=new ActiveXObject("Msxml2.XMLHTTP")}catch(k){try{f=new ActiveXObject("Microsoft.XMLHTTP")}catch(v){}}f&&(f.open("POST",c+(-1==c.indexOf("?")?"?":"&")+"url="+encodeURIComponent(b)),f.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),f.send(a))}}}function t(){var b={},d=document.getElementsByTagName("IMG");if(0==d.length)return{};var a=d[0];if(!("naturalWidth"in a&&"naturalHeight"in a))return{};for(var c=0;a=d[c];++c){var e=a.getAttribute("data-pagespeed-url-hash");e&&(!(e in b)&&0<a.width&&0<a.height&&0<a.naturalWidth&&0<a.naturalHeight||e in b&&a.width>=b[e].o&&a.height>=b[e].m)&&(b[e]={rw:a.width,rh:a.height,ow:a.naturalWidth,oh:a.naturalHeight})}return b}var u="";h("pagespeed.CriticalImages.getBeaconData",function(){return u});h("pagespeed.CriticalImages.Run",function(b,d,a,c,e,f){var k=new p(b,d,a,e,f);n=k;c&&m(function(){window.setTimeout(function(){r(k)},0)})});})();pagespeed.CriticalImages.Run('/mod_pagespeed_beacon','<?php echo DadosSession('base_url'); ?>produtos/catalogo.php?id=<?php echo $dados["id"];?>','yW9MLzz7Mf',true,false,'CnL4BB8euv4'); //]]></script><img src="<?php echo DadosSession('base_url'); ?>img/<?php echo $dados["imagem"]; ?>" data-pagespeed-url-hash=1547057666 onload="pagespeed.CriticalImages.checkImageForCriticality(this);"/> </a> </div> <div class="col-sm-8 banner" align=right> <div class=row> <div class=col-md-12> <div class=flexslider> <ul class=slides> <!-- ESTE AQUI QUE TRAZ A BUSCA DA TABELA E NA PESQUISA - ESTE AQUI É O QUE LINK PARA O CATALOGO <a href='/produtos/catalogo.php?id=<?php echo $dados['id']; ?></a></font><small>Ver Produto Completo</small></strong></font></div></td> BOM A PERGUNTA TBM SERIA O QUE TENHO QUE POR AQUI TBM PARA QUE ELA LEVA ESTE LINK JA COM A URL QUE EU QUERO --> <title></title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <script language="JavaScript" type="text/JavaScript"> <!-- function MM_reloadPage(init) { //reloads the window if Nav4 resized if (init==true) with (navigator) {if ((appName=="Netscape")&&(parseInt(appVersion)==4)) { document.MM_pgW=innerWidth; document.MM_pgH=innerHeight; onresize=MM_reloadPage; }} else if (innerWidth!=document.MM_pgW || innerHeight!=document.MM_pgH) location.reload(); } MM_reloadPage(true); //--> </script> <body bgcolor="#FFFFFF"> <div id="fb-root"></div> <script>(function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0]; if (d.getElementById(id)) return; js = d.createElement(s); js.id = id; js.src = "//connect.facebook.net/pt_BR/sdk.js#xfbml=1&version=v2.0"; fjs.parentNode.insertBefore(js, fjs); }(document, 'script', 'facebook-jssdk'));</script> <?php $host = "localhost"; // Host do Mysql $user = "root"; // Usuário do Mysql $pass = ""; // Senha do Mysql $banco = "produtos"; // Nome do Banco no Mysql $pesquisar = $_POST['pesquisar']; $con = mysql_connect($host,$user,$pass); $db = mysql_select_db($banco,$con); mysql_query("SET NAMES 'utf8'"); mysql_query('SET character_set_connection=utf8'); mysql_query('SET character_set_client=utf8'); mysql_query('SET character_set_results=utf8'); $sql = "SELECT* FROM produtos WHERE nome LIKE '%$pesquisar%' OR valor LIKE '%$pesquisar%' order by id_categoria LIMIT 60"; $resultado = mysql_query($sql)or die (mysql_error()); while ($dados=mysql_fetch_array($resultado)) { ?> <table width="585" border="0" align="center" bgcolor="#FFFFFF"> <tr bgcolor="#FFFFFF"> <td width="31" height="27"><div align="left"><strong><font color="#FF0000" size="4"><img src="img/ico.png" width="30" height="25" border="0" align="top"></font></strong></div></td> <td width="370"><strong><font color="#FF0000" size="4" face="Arial, Helvetica, sans-serif"> <?php echo $dados['nome']; ?> </font></strong></td> <td width="172" rowspan="5" background="img/fundo2.jpg" bgcolor="#F7F7F7"><div align="center"><strong><font color="#FF0000" size="4"><a href=/produtos/catalago.php?id=<?php echo $dados['id']; ?> target="_blank"><img src="<?php echo $dados['imagem']; ?>" alt="" width="172" height="150" border="0" align="top"></a></font></strong></div></td> </tr> <tr bgcolor="#FFFFFF"> <td height="27" valign="middle"> <div align="left"><strong><font color="#FF0000" size="5" face="Verdana, Arial, Helvetica, sans-serif"><img src="img/telefonesemfundo.png" width="30" height="25"> </font> </strong> </div></td> <td height="27" valign="middle"><table width="370" border="0"> <tr> <td width="245" bgcolor="#F4F4F4"><strong><font color="#009500" size="2,5" face="Verdana, Arial, Helvetica, sans-serif"> <?php echo $dados['valor']; ?></font> </strong></td> <td width="115" height="25" background="img/detalhes.png"><div align="left"> <font size="2"><strong><font color="#FFFFFF" face="Verdana, Arial, Helvetica, sans-serif"><a href='/produtos/catalogo.php?id=<?php echo $dados['id']; ?></a></font><small>Ver Produto Completo</small></strong></font></div></td> </tr> </table></td> </table> <hr width="550" color="#FF0000"> </table> <?php }?> <div align="center"></div> ACHO QUE CONSEGUEM ENTENDER AI CERTO? DESDE JÁ A AGRADEÇO AI Compartilhar este post Link para o post Compartilhar em outros sites