Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá galera!!
Estou com um problema: tenho a seguinte url http://www.site.com....eria/shakira/1/
onde:
artista = shakira
idartista = 1
queria retirar a referencia do idartista=1 e passar a url com nome do artista http://www.site.com....ateria/shakira/
mas quando o nome do artista possui espaço como ivete sangalo. passando para url amigavel http://www.site.com..../ivete-sangalo/
não repassa o valor so funciona se a url ficar e deixar a url so com http://www.site.com....s/bateria/ivete sangalo/
como resolver?
outra pergunta e se eu revolver deixar por idartista http://www.site.com....eria/shakira/1/ quando o usuario digita
http://www.site.com....eria/shakira/2/
substituindo o 1 pelo 2 ela vai para o artista referente so que a url fica com o nome do artista anterior.
>
http://forum.imasters.com.br/index.php?/topic/203965-urls-amigaveis/
http://www.dourado.net/2009/06/25/como-fazer-urls-amigaveis-com-htaccess-e-php/
essa referencia são para criar as url amigaveis...eu que e otimizar.. corrigir algumas coisas do tipo citado.. ou quando o usuario digita a url errada
Se o usuário digitar a url errada, você tem que dizer pra ele que digitou errado. É, basicamente, o problema dele.
Se quiser pode fazer o tratamento da string pra pegar os espaços e tratá-los como quiser.
Tá tudo expliacado em todos os tutoriais de Url's amigáveis.
Boa sorte.
>
Se o usuário digitar a url errada, você tem que dizer pra ele que digitou errado. É, basicamente, o problema dele.
Se quiser pode fazer o tratamento da string pra pegar os espaços e tratá-los como quiser.
Tá tudo expliacado em todos os tutoriais de Url's amigáveis.
Boa sorte.
e quero quando o usuario resolver modificar a url no navegador www.site.com.br/shakira/1/ para www.site.com.br/shakira/2/
ele vai para o artista de id=2 mais o nome do artista na url continua o mesmo ou se o id digitado for 1000 e nao existir no banco de dados essa quantidade de artistas a pagina aparece normalmente mais sem os dados.
ex: http://www.cifraclub.com.br/c4-faccao-ideologica/nao-se-entregue/tabs-bateria/
se eu retirar ou acrescenta uma letra na url ele vai retornando para pasta de maior relevancia
http://www.cifraclub.com.br/c4-faccao-ideologica/nao-se-entregue/tabs-bateri/
retirei o "a" de bateria, ele retorna para http://www.cifraclub.com.br/c4-faccao-ideologica/
Só um exemplo:
$nomeArtista = $_GET['artista'];
$idArtista = ($_GET['id']) ? $_GET['id'] : '';
Trate, então, o redirecionamento:
if( $idArtista == '' ) {
header("Location: seusite.com.br/index.php?artista={$nomeArtista}");
} else {
header("Location: seusite.com.br/index.php?artista={$nomeArtista}&idArtista={$idArtista}");
}
Adapte à metodologia de URL's amigáveis e veja como fica.
Cara resolva seu problema com o seguinte:
Crie um campo na tabela com o nome tituloAmigavel.
Na hora de gravar o artista na tabela pegue o nome dele e trate na função abaixo:
public function remove_acentos($string, $slug = false) {
$string = strtolower($string);
// Código ASCII das vogais
$ascii['a'] = range(224, 230);
$ascii['e'] = range(232, 235);
$ascii['i'] = range(236, 239);
$ascii['o'] = array_merge(range(242, 246), array(240, 248));
$ascii['u'] = range(249, 252);
// Código ASCII dos outros caracteres
$ascii['b'] = array(223);
$ascii['c'] = array(231);
$ascii['d'] = array(208);
$ascii['n'] = array(241);
$ascii['y'] = array(253, 255);
foreach ($ascii as $key=>$item) {
$acentos = '';
foreach ($item AS $codigo) $acentos .= chr($codigo);
$troca[$key] = '/['.$acentos.']/i';
}
$string = preg_replace(array_values($troca), array_keys($troca), $string);
// Slug?
if ($slug) {
// Troca tudo que não for letra ou número por um caractere ($slug)
$string = preg_replace('/[^a-z0-9]/i', $slug, $string);
// Tira os caracteres ($slug) repetidos
$string = preg_replace('/' . $slug . '{2,}/i', $slug, $string);
$string = trim($string, $slug);
}
return $string;
}
Estou considerando que estamos dentro de uma classe
// o segundo parametro da função é o separador, ou melhor o substituto dos espaços em brancos e caracteres acentuados.
$this->tituloAmigavel = $this->remove_acentos( $this->nome, '-' );
Depois de tratado você tem o seu tituloAmigavel ( Jô Soares = jo-soares ) daí é só você grava-lo na tabela
Na hora de efetuar a busca, você procura por:
$sql = "SELECT * FROM {$this->_table} WHERE tituloAmigavel LIKE {$this->tituloAmigavel};";
Assim não tem a necessidade de passar id, e o número que você usava como id você pode usar para paginação.
>
Cara resolva seu problema com o seguinte:
Crie um campo na tabela com o nome tituloAmigavel.
Na hora de gravar o artista na tabela pegue o nome dele e trate na função abaixo:
public function remove_acentos($string, $slug = false) {
$string = strtolower($string);
// Código ASCII das vogais
$ascii['a'] = range(224, 230);
$ascii['e'] = range(232, 235);
$ascii['i'] = range(236, 239);
$ascii['o'] = array_merge(range(242, 246), array(240, 248));
$ascii['u'] = range(249, 252);
// Código ASCII dos outros caracteres
$ascii['b'] = array(223);
$ascii['c'] = array(231);
$ascii['d'] = array(208);
$ascii['n'] = array(241);
$ascii['y'] = array(253, 255);
foreach ($ascii as $key=>$item) {
$acentos = '';
foreach ($item AS $codigo) $acentos .= chr($codigo);
$troca[$key] = '/['.$acentos.']/i';
}
$string = preg_replace(array_values($troca), array_keys($troca), $string);
// Slug?
if ($slug) {
// Troca tudo que não for letra ou número por um caractere ($slug)
$string = preg_replace('/[^a-z0-9]/i', $slug, $string);
// Tira os caracteres ($slug) repetidos
$string = preg_replace('/' . $slug . '{2,}/i', $slug, $string);
$string = trim($string, $slug);
}
return $string;
}
Estou considerando que estamos dentro de uma classe
// o segundo parametro da função é o separador, ou melhor o substituto dos espaços em brancos e caracteres acentuados.
$this->tituloAmigavel = $this->remove_acentos( $this->nome, '-' );
Depois de tratado você tem o seu tituloAmigavel ( Jô Soares = jo-soares ) daí é só você grava-lo na tabela
Na hora de efetuar a busca, você procura por:
$sql = "SELECT * FROM {$this->_table} WHERE tituloAmigavel LIKE {$this->tituloAmigavel};";
Assim não tem a necessidade de passar id, e o número que você usava como id você pode usar para paginação.
tem um problema aii!!!
e que no banco de dados ja possuem mais de 40.000 dados
eu teria que editar uma por uma..
Não tem problema nenhum aí.
Faça um script bem simples, em um laço de repetição, utilizando a instrução UPDATE e tratando os nomes como o colega recomendou.
Você tem sua tabela totalmente atualizada em questão de milésimos de segundos.
vou pesquisar a respeito, pois sou iniciante...
se me der muito trabalho vou deixar como estava mesmo..
em relação a função limpa url ja utilizo nas urls.
Cara que trabalho?
Saca só, em 3 minutos faço o que você quer:
$sqlConsulta = "SELECT * FROM {$this->_table}";
// é o mesmo que mysql_fetch_assoc(); Retorna um array de dados associativos;
$dados = $this->getAdaptador()->carregarDados( $sqlConsulta );
foreach( $dados as $linha ) {
$tituloAmigavel = $this->remove_acentos( $linha['nomeDoArtista'], '-' );
$sqlUpdate = "UPDATE {$this->_table} SET tituloAmigavel = '{$tituloAmigavel}' WHERE id = '{$linha['id']}'";
$this->getAdaptador()->executa_query( $sqlUpdate );
}
Pronto, tudo atualizado.
http://forum.imasters.com.br/index.php?/topic/203965-urls-amigaveis/
http://www.dourado.net/2009/06/25/como-fazer-urls-amigaveis-com-htaccess-e-php/