Modugno 4 Denunciar post Postado Novembro 12, 2013 Galera, estou criando um sistema de blog com um framework que venho desenvolvendo (nem sei se posso chama-lo de framework). Eu estava pegando os valores dos singles via id. Ficando assim a url: localhost/blog/post/id/2Ficou muito complexo, então fiz com que ele pega-se com slug: localhost/blog/post/titulo-do-post o metodo para criar slug eu ja fiz implementei (inclusive aprendi aqui a faze-lo hahaha). Porem, eu não gostaria que ao inserir o slug no banco de dados, eles se repetissem, pois isso daria um enorme erro, mas não sei como fazer isso no sql D: Se possivel, gostaria que fosse assim por exemplo: O cara via cadastrar "Sao Paulo" no banco, dae o slug sera sao-paulo, dae vamos supor que depois de sei la, uns 3 meses ele va add de novo um post com o mesmo titulo e cria o slug sao-paulo novamente, eu gostaria que add um numero no final, para diferenciar um do outro. exemplo: sao-paulo-2 e assim por diante. Alguém saberia me dizer? Compartilhar este post Link para o post Compartilhar em outros sites
raonibs 64 Denunciar post Postado Novembro 12, 2013 Defina o campo como UNIQUE trate o erro quando for inserido um campo duplicado da seguinte forma if( mysql_errno() == 1586) { // Retorna msg de erro dizendo que o titulo ja existe } else { // continua a execução do script } Não tenho certeza se o numero do erro para caso é 1586, teste isso. Compartilhar este post Link para o post Compartilhar em outros sites
Modugno 4 Denunciar post Postado Novembro 12, 2013 Estou usando PDO.. Tipo, o campo unique eu ja criei la, só falta a regra no php. Mas na verdade não gostaria de informar um erro, e sim de incrementar um numero no final.. exemplo ja existem 10 slugs iguais la, então ficaria. titulo-do-post titulo-do-post-2 titulo-do-post-3 titulo-do-post-4 ... e assim por diante. hm Compartilhar este post Link para o post Compartilhar em outros sites
raonibs 64 Denunciar post Postado Novembro 12, 2013 No caso de PDO usaria uma estrutura try / catch para tratar o erro. ----------------------------------------- Na situação que você quer: 1) Adicione mais uma coluna na tabela que sera o incremento do titulo. 2) Antes do "Insert" procure todas as outras ocorrências e teste nelas qual tem o campo incremento maior. 3) Adicione +1 no próximo registro e salve no bd. 4) Concatene a url com o incremento ex.: "titulo-1", "titulo-2" etc... Ficaria uma tabela assim: url incremento titulo-repetido 1 titulo-repetido 2 titulo-repetido 3 Esta coluna extra tem a vantagem da desambiguação caso o usuário use uma url com um numero no final como "camisa-10" o sistema vai ser suficientemente inteligente para não confundir o incremento com o titulo ficando assim "camisa-10-1", "camisa-10-2", etc... Na consulta destes dados você saberá que sempre vai haver um valor numerico "-x" que deve ser eliminado antes da mesma. No caso se o titulo for único ele igualmente vai que ter um numero no final como titulo-do-post-1 para não gera ambiguidade. Imagine a url anterior "camisa-10" o sistema devera buscar a url camisa com o incremento 10 ou a url "camisa-10"? Será ainda pior se os dois casos existirem no banco de dados. Compartilhar este post Link para o post Compartilhar em outros sites
CerebroVasconcelos 2 Denunciar post Postado Novembro 12, 2013 É só você marcar campo como unique no seu SGBD (pelo menos eu faço assim no MySQL) e antes de salvar da um select com like e o título, mais ou menos assim: $query =mysql_query("select titulo from posts where titulo like '$titulo%';"); sendo que o valor da variável $titulo é seu atual título com espaços substituídos por "_" (undeline), aí depois você conta quantas linhas o array retornado do DB, exemplo: $quantidadeDeTitulosSemelhantes = 0; while(mysql_fetch_array($query)) { $quantidadeDeTitulosSemelhantes++; } caso existam 3 títulos com o prefixo igual ao seu atual título o valor da variável $quantidadeDeTitulosSemelhantes será 3, entã faça o seguinte no seu código: if($quantidadeDeTitulosSemelhantes == 0) { $url = // seu título seu nenhum número de incremento no final } else { $url = $quantidadeDeTitulosSemelhantes + 1; } ps: você também pode substituir os espaços em branco por - (traço) e ç por c ã por a... Compartilhar este post Link para o post Compartilhar em outros sites
Modugno 4 Denunciar post Postado Novembro 12, 2013 Então na verdade eu estou incrementando certinho o numero no final. porem, acho que meu erro deva estar na hora de buscar o valor no banco.. por que tipo se eu encontro "titulo-do-post" eu concateno -1. e da certo. Porem se eu tentar cadastrar novamente o valor ele vai cadastrar -1 de novo, talvez eu tenha que dar um like e procurar exatamente o que o usuario esta solicitando, por que ae eu faço a contagem e acrescento um número né? tipo o que o CerebroVasconcelos disse, usando um like. like "$slug%"; depois do um count. pelo que estou vendo aqui no link do imasters, eles concatenam um número antes do titulo do post. Seria o ID do post? Sera que seria mais eficaz fazer isso? $id . $slug ? por que ae eu conseguiria pegar o id com PDO::lastInsertId(); Compartilhar este post Link para o post Compartilhar em outros sites
raonibs 64 Denunciar post Postado Novembro 12, 2013 Pra evitar isso de ele colocar repetido -1-1... faça como eu disse antes separe em duas colunas no bd e retire o UNIQUE da coluna do slug. O que considero ideal é usar post-tile/id ou id/post-title ou ainda mandar o tratamento de volta para o usuário para que ele mesmo altere para para um slug inexistente, Simplesmente deixar que o sistema concatene um numero qualquer descaracteriza a slug e pode gerar slugs cômicas e constrangedoras. ex.: o usuário cria um post "Comer Bem" e a slug fica "20-comer-bem". Compartilhar este post Link para o post Compartilhar em outros sites
Modugno 4 Denunciar post Postado Novembro 13, 2013 Galera, valeu, enfim consegui! Na verdade era mais simples do que eu imaginava! Eu user um Like pra buscar o conteudo no final da string, e deu certinho. Segue o script pra quem quiser usar ae. Valeu a ajuda galera :D class SlugHelper extends Model { public $model; public function __construct() { $this->model = new Model(); } public function set($title) { $slug = preg_replace("/-$/", "", preg_replace('/[^a-z0-9]+/i', "-", strtolower($title))); $result = $this->model->read("blog", "COUNT(*) AS increment", "slug LIKE '$slug%'"); foreach ($result as $rs): $increment = $rs->increment; endforeach; return ($increment > 0) ? ($slug . '-' . $increment) : $slug; } } Compartilhar este post Link para o post Compartilhar em outros sites
CerebroVasconcelos 2 Denunciar post Postado Novembro 13, 2013 Uma característica minha é de não concatenar, eu faço assim: dominio.com.br/posts/12/titulo_do_troco e como o meu framework trata tudo depois de / com .htaccess no controller eu pego a variável referente ao id do post neste caso contem o valor 12 converto pra inteiro só pra evitar injeção de .SQL ou um erro de PDO, enfim algma gracinha do usuário mal intencionado $idDoPost = (int) $variavelQueVeioPeloUrl; // nesse caso o 12 e agora faço a busca pelo id = $idDoPost se existir mando pra tela caso contrário $erro = "Post não encontrado"; e não uso o título do post para identifica-lo apenas para melhorar o trabalho de SEO Compartilhar este post Link para o post Compartilhar em outros sites
Modugno 4 Denunciar post Postado Novembro 13, 2013 Então, é que na verdade mostrar o titulo facilita pro Google buscar seu site. Eu também usava busca pelo ID. Mas agora to mudando tentando por titulo.. vamos ver no que da! hehehehe Abraço Compartilhar este post Link para o post Compartilhar em outros sites