Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
E aí pessoal, tudo certo?
Estou tendo um problema aqui com o PHP.
Eu estou desenvolvendo um sistema de encurtador de links, que até agora está na reta final.
Já está até no ar, caso queiram verificar: www.gfans.cc.
Porém, estou tendo um problema com reenvio de dados.
O problema é simples: se eu encurto um link e atualizo na hora de pegar o link, ele encurta o mesmo novamente.
Esse é um problema e tanto, pois podemos dizer que é meio que um spam, não?
Fiquem a vontade para acessar o site e testar esse problema.
Já procurei diversos tutoriais na internet, alguns falando de session_start(); com session_destroy(); ou alguns falando sobre unset($_POST); e outros exemplos. No entretanto, nenhum supriu minha necessidade, ou então eu não soube utilizar da maneira correta.
Alguém de vocês podem me ajudar a solucionar esse problema?
<?
include("config.php");
if (strstr($_SERVER['HTTP_REFERER'], $root));
else { header ("Location: $rooturl"); }
$ip = $_SERVER['REMOTE_ADDR'];
$url = mysql_real_escape_string($_POST['url']);
if(preg_match('|^http(s)?://[a-z0-9-]+(\.[a-z0-9-]+)(:[0-9]+)?(/.)?$|i', $url)) {
if (empty($_POST['tag'])) {
$query = mysql_query("INSERT INTO $table (ip,url) VALUES ('$ip','$url')") or die('MySQL error: '.mysql_error());
$qs = mysql_insert_id();
} else {
if (ereg('^[a-zA-Z0-9]+[a-zA-Z0-9]+$', $_POST['tag'])) {
$tag = mysql_real_escape_string($_POST['tag']);
$query = mysql_query("select * from $table where `tag` = '$tag';") or die('MySQL error: '.mysql_error());
if (mysql_num_rows($query) != 0)
die("<script>alert('Seu valor pr\u00e9-definido j\u00e1 est\u00e1 em uso. Por favor, tente outro ou deixe em branco para que o sistema gere um automaticamente.');history.go(-1) </script>");
else {
$query = mysql_query("insert $table (ip,url,tag) VALUES ('$ip','$url','$tag')") or die('MySQL error: '.mysql_error());
$qs = $tag;
}
} else
die("<script>alert('Seu valor pr\u00e9-definido contem caracteres inv\u00e1lidos. Apenas n\u00fameros e letras do alfabeto s\u00e3o permitidos. Por favor, reveja os dados e tente novamente.');history.go(-1) </script>");
}
$link = $destination . $qs;
require 'create_template.php';
} else {
echo "<script>alert('Por favor, digite uma URL v\u00e1lida. Reveja os dados e tente novamente.');history.go(-1) </script>"; }
mysql_close();
?>
Fico tremendamente agradecido.
Forte abraço!
;)
Opa Bruno, boa noite.
Eu passei pelo seu tutorial uma vez.
Ele realmente funciona.
Ao enviar o formulário fica post, e ao atualizar ele fica refresh.
Porém, não consegui adequar ao meu sistema de upload.
A única coisa que eu quero é que, se for atualizado a página, que ocorra um header('Location: /'); sem enviar mais nada para o banco de dados.
Caso ele queira encurtar o mesmo link, ele poderá, mas acessando pela página inicial.
Você poderia me ajudar, ou dizer o que devo fazer?
Forte abraço!
;)
Tem um jeito facil de fazer isso, você cria uma página php aparte onde só efetuará o processo de upload e essa página não irá ter conteudo nenhum, e coloca no final do código um header('Location: URL');
Aqui vai um exemplo:
create.php
<?php
//CODIGO
// AQUI...
header('Location: /view/' . $code);
?>
e depois você cria a regra no .htaccess para facilitar esse url, o arquivo na verdade vai funcionar "view.php?code=$code" mas com o metodo dos url amigaveis você pode facilitar o url (o que dá para prevenir contra ataques sql injection), mas esse processo é opcional, depois no view.php ficará aquela pág. q exibirá o URL encurtado, ex:
view.php
<?php
$code = $_GET['code'];
echo 'http://gfans.cc/'.$code;
?>
Mais alguma dúvida?
Espero ter ajudado :)
Entendi.
Porém, o create.php ele já é apenas o código (pode ver que não tem CSS nem nada).
Todo o estilo, inclusive o campo para mostrar a URL, está no create_template.php, mas rodando no create.php
Você propõe então que, em vez de require create_template, que eu faça um header?
E ele por acaso vai puxar mesmo o campo?
As dúvidas são muitas amigo.
Valeu o/
@Luciano Junior_164434,
Para usar a minha dica dali de cima, vc precisa se basear nas informações informadas pelo usuário.
Quais são as informações que o usuário preenche?
tag e url ?
Mostre a sua tentativa e o problema q vc teve.
Sim, eu vou dar mais umas explicações.
O usuário tem que inserir a URL completa e, caso desejar, a TAG.
Caso ele não deseje a tag, o sistema mesmo vai no banco de dados e cria uma tag numérica para tal.
No sistema, a $tag é o ($_POST['tag']) e a $url é o ($_POST['url']);
Aí, quando esse dado é cadastrado, retorna para a página create (agora a chamo de view, pois segui a dica do amigo e mexi um pouco com URL amigáveis) e é exibido com echo http://www.gfans.cc/"."$qs" que no caso o $qs é tanto a TAG que ele selecionou como o número gerado pelo banco. Ou seja, $qs = $tag.
É aí que chega o problema. Não consegui adaptar o seu código ao meu.
O $_POST['url'] é a URL completa e a $_POST['tag'] é a TAG que ele colocou.
Por fim, existe um $link = $destination . $qs;
:sick:Pelo o que eu busquei, o mais viável seria redirecionar para outra página.
Todavia, ao redirecionar, ele não puxa o dado que foi cadastrado no outro arquivo.
O que eu devo fazer?
Obs: quando eu uso novamente outro header, ele dá erro.
Grato até o momento.
Uma forma:
http://wbruno.com.br/php/diferenciar-refresh-f5-de-postsubmit/