Redirection PHP : URL persistantes

WRInaute impliqué
Bonsoir :)

J'ai fait un petit script de webring qui fonctionne correctement , hormis chez mon grand ami Lycos et tous les sites masquant les url ( ceux utilisant des url fr.st par exemple ) . Dans ces derniers cas l'url dans la barre de navigation reste celle du site initiateur de la redirection ...

Pour faire les redirections , j'utilise
Code:
die('<meta http-equiv="refresh" content="0;URL='.$lmurl.'">');
.
Connaissez vous un moyen pour se débarasser du javascript parasite lors de la redirection ?

Merci :)

PS : pour ceux que ça intéresserait , voici mon fichier PHP ( c'est du phpBB )
Code:
<?php

define('IN_PHPBB', true);
$real_phpbb_root_path = './';
$phpbb_root_path = './';
include($real_phpbb_root_path . 'extension.inc');
include($real_phpbb_root_path . 'common.'.$phpEx);
include($phpbb_root_path . '../robotstats/robotstats.inc.php');

$site_id = intval($HTTP_GET_VARS['site_id']);
$mode = htmlspecialchars($HTTP_GET_VARS['mode']);

if ( !$site_id || !$mode )
{
	$lmurl = 'http://lapin-malin.com/webring/';
	die('<meta http-equiv="refresh" content="0;URL='.$lmurl.'">');
}

if ( $mode == "see" )
{		
	$sql = "UPDATE " . WEBRING_TABLE . "  
		SET site_counter = site_counter + 1
		WHERE site_approved = 1
		AND site_id = $site_id ";
	if( !($result = $db->sql_query($sql)) )
	{
		message_die(GENERAL_ERROR, 'Could not query site', '', __LINE__, __FILE__, $sql);
	}


	$sql = "SELECT site_url FROM " . WEBRING_TABLE . "  
		WHERE site_id = $site_id ";
	if( !($result = $db->sql_query($sql)) )
	{
		message_die(GENERAL_ERROR, 'Could not query site', '', __LINE__, __FILE__, $sql);
	}
	$row = $db->sql_fetchrow($result);
	$lmurl = $row['site_url'];
	die('<meta http-equiv="refresh" content="0;URL='.$lmurl.'">');
}
else if ( $mode == "random" )
{
	$sql = "SELECT site_lang , site_url FROM " . WEBRING_TABLE . "  
		WHERE site_approved = 1
		AND site_id = $site_id ";
	if( !($result = $db->sql_query($sql)) )
	{
		message_die(GENERAL_ERROR, 'Could not query site', '', __LINE__, __FILE__, $sql);
	}
	$webr_lang = $db->sql_fetchrow($result);
	$site_lang = intval($webr_lang['site_lang']);
	$lmurl = $webr_lang['site_url'];

	$sql = "SELECT site_url , site_id FROM " . WEBRING_TABLE . "  
		WHERE site_approved = 1
		AND site_lang = $site_lang 
		AND site_id <> $site_id ";
	if( !($result = $db->sql_query($sql)) )
	{
		message_die(GENERAL_ERROR, 'Could not query site', '', __LINE__, __FILE__, $sql);
	}
	$sites = $db->sql_fetchrowset($result);
	$num = count($sites);
	if ( $num )
	{
		$rand_site = rand(0,$num);

		$site_id = intval($sites[$rand_site]['site_id']);
		$sql = "UPDATE " . WEBRING_TABLE . "  
			SET site_counter = site_counter + 1
			WHERE site_id = $site_id ";
		if( !($result = $db->sql_query($sql)) )
		{
			message_die(GENERAL_ERROR, 'Could not query site', '', __LINE__, __FILE__, $sql);
		}

		$lmurl = $sites[$rand_site]['site_url'];
	}
	die('<meta http-equiv="refresh" content="0;URL='.$lmurl.'">');
}
else if ( $mode == "next" )
{
	$sql = "SELECT site_lang , site_url FROM " . WEBRING_TABLE . "  
		WHERE site_approved = 1
		AND site_id = $site_id ";
	if( !($result = $db->sql_query($sql)) )
	{
		message_die(GENERAL_ERROR, 'Could not query site', '', __LINE__, __FILE__, $sql);
	}
	$webr_lang = $db->sql_fetchrow($result);
	$site_lang = intval($webr_lang['site_lang']);
	$lmurl = $webr_lang['site_url'];

	$sql = "SELECT site_url , site_id FROM " . WEBRING_TABLE . "  
		WHERE site_id > $site_id 
		AND site_lang = $site_lang
		AND site_approved = 1
		ORDER BY site_id
		ASC LIMIT 1 ";
	if( !($result = $db->sql_query($sql)) )
	{
		message_die(GENERAL_ERROR, 'Could not query site', '', __LINE__, __FILE__, $sql);
	}
	$row = $db->sql_fetchrow($result);
	if ( $db->sql_numrows($result) )
	{
		$site_id = intval($row['site_id']);
		$sql = "UPDATE " . WEBRING_TABLE . "  
			SET site_counter = site_counter + 1
			WHERE site_id = $site_id ";
		if( !($result = $db->sql_query($sql)) )
		{
			message_die(GENERAL_ERROR, 'Could not query site', '', __LINE__, __FILE__, $sql);
		}
		$lmurl = $row['site_url'];
	}
	die('<meta http-equiv="refresh" content="0;URL='.$lmurl.'">');
}
else if ( $mode == "previous" )
{
	$sql = "SELECT site_lang , site_url FROM " . WEBRING_TABLE . "  
		WHERE site_approved = 1
		AND site_id = $site_id ";
	if( !($result = $db->sql_query($sql)) )
	{
		message_die(GENERAL_ERROR, 'Could not query site', '', __LINE__, __FILE__, $sql);
	}
	$webr_lang = $db->sql_fetchrow($result);
	$site_lang = intval($webr_lang['site_lang']);
	$lmurl = $webr_lang['site_url'];

	$sql = "SELECT site_url FROM " . WEBRING_TABLE . "  
		WHERE site_id < $site_id 
		AND site_lang = $site_lang
		AND site_approved = 1
		ORDER BY site_id
		DESC LIMIT 1 ";
	if( !($result = $db->sql_query($sql)) )
	{
		message_die(GENERAL_ERROR, 'Could not query site', '', __LINE__, __FILE__, $sql);
	}
	$row = $db->sql_fetchrow($result);
	if ( $db->sql_numrows($result) )
	{
		$site_id = intval($row['site_id']);
		$sql = "UPDATE " . WEBRING_TABLE . "  
			SET site_counter = site_counter + 1
			WHERE site_id = $site_id ";
		if( !($result = $db->sql_query($sql)) )
		{
			message_die(GENERAL_ERROR, 'Could not query site', '', __LINE__, __FILE__, $sql);
		}

		$lmurl = $row['site_url'];
	}
	die('<meta http-equiv="refresh" content="0;URL='.$lmurl.'">');
}
else
{
	$lmurl = 'http://lapin-malin.com/webring/';
	die('<meta http-equiv="refresh" content="0;URL='.$lmurl.'">');
}

?>
 
WRInaute discret
Wow, Dr DLP, c'est vraiment toi ? :? Je pensais que tu t'y connaissais plus que ça :?

Bon ben soit, alors astuces:
  1. Se débarrasser du javascript pour faire des redirections, quand on a php:
    Code:
    header('Location: ' . $url);
    (éventuellement suivi d'un exit;)
  2. Tirer un élément au sort dans une base de données mysql (ça j'ai inventé tout seul comme un grand :lol:)
    Code:
    SELECT * FROM ma_table ORDER BY rand() LIMIT 1
    ;-)
  3. Ton premier if ne sert à rien puisqu'il a le même effet que le dernier
  4. la fonction empty($var) renvoie true si $var a été assigné et est différent de 0, la chaîne vide (""), FALSE ou un tableau vide (ce serait peut-être mieux pour le premier if...)
  5. Vu que tu ne te sers de $mode que pour faire des comparaisons, dans cette ligne
    Code:
    $mode = htmlspecialchars($HTTP_GET_VARS['mode']);
    le htmspecialchars ne sert à rien ;-)
  6. L'instruction switch serait peut-être mieux ?
    Code:
    switch ( $mode ) {
    case 'see':
    // ...
    break;
    case 'random':
    // ...
    break;
    case 'next':
    case 'previous':
    // ...
    break;
    default:
    header('Location: http://lapin-malin.com/webring/');
    }
    Et pour la différence qu'il y a entre next et previous, tu gagnerais 20 lignes de programmation en réunissant les deux conditions ;-)
  7. Tu supprimerais une requête sql pratiquement à chaque coup si tu passais la langue dans l'url ;-)
  8. Question: si tu n'arrives pas à incrémenter le compteur de clic, c'est vraiment important de générer une erreur ? Pourquoi ne pas rediriger simplement le visiteur ?...
  9. Au fait, pour faire ce que tu veux faire, il existe déjà le mod links, il est vraiment cool (et tu peux le tester sur mon site ;-) nb.: j'ai quand même fait moi-même la page mycircle hein...)
 
WRInaute impliqué
Le principe du webring est que les autres sites n'ont qu'à afficher un peu de HTML pour accéder au programme , cela n'a pas grand chose à voir avec des liens .
Le but est d'éviter au maximum l'accès au site générateur , et que tout soit invisible .

1) C'est le premier que j'ai utilisé , sans plus de résultats /
2) Aucune différence ....
3) Le dernier gère les $mode invalides .
4) Aucune différence non plus .
5) C'est une habitude , au cas où je déciderais d'ajouter une table de logs , je n'aime pas les failles CSS ....
6) Pourquoi ?
7) Je ne suis pas partisan des url complexes pour le HTML , c'est rebutant je trouve .
8) Effectivement , mais c'est encore une phase debug , il faut que je sache où se trouve les erreurs s'il y en a .
9) Regarde ce que je veux faire sur ma page d'accueil , tu comprendras mieux .
 
WRInaute discret
  1. Sans plus de résultats ? 8O Mais c'est sensé être le meilleur système :? C'est d'ailleurs un des exemples donnés sur php.net pour la fonction header:
    http://be.php.net/manual/fr/function.header.php
    Je ne comprends pas que ça ne marche pas :? Enfin je constate que dans les dernières versions de phpBB ils utilisent un autre truc pour les serveurs windows... enfin je sais po :?
  2. Mouais enfin, ça te permet tout de même de supprimer tout le tirage au sort fait en php et d'avoir comme résultat une seul ligne quoi :roll: Enfin, question d'optimisation de l'utilsation des ressources etc. même si ça n'en prend pas beaucoup...
  3. Ton dernier if fait la même chose que ton premier if... enfin oui évidemment le dernier ne conserne que les modes alors que le premier conserne aussi le site_id mais bon...
  4. La différence se voit surtout quand on utilise des système de tests/débuggage comme easyphp par exemple, où tous les warnings s'affichent. Par exemple, en supposant que $var ne soit pas encore déclarée,
    Code:
    !$var
    génère un warning contrairement à
    Code:
    empty($var)
    ici ton
    Code:
    intval($HTTP_GET_VARS['site_id']);
    génèrerait donc un warning si site_vars n'a pas été donné dans l'url... Ce que tu peux aussi faire (mais bon c'est inutile si tu n'as pas de warning, mais en phase de débuggage ça t'éviterait de te demander quoi), c'est:
    Code:
    intval(@$HTTP_GET_VARS['site_id']);
    puisque tu la transforme en int après...
  5. ah ok... au fait: faille CSS ? :? Pas plutôt SQL ? lol
  6. Parce que l'instruction switch a été inventée toute spécialement pour comparer pusieurs fois une même variable avec différentes valeurs constantes (entiers, chaînes, constantes et booléens aussi je suppose...)
  7. Ok, comme tu veux. Alors je propose par exemple pour next:
    Code:
    SELECT a.site_url url_orig, b.site_url, b.site_id FROM " . WEBRING_TABLE . "  a, " . WEBRING_TABLE . " b
          WHERE a.site_approved = 1 
          AND b.site_approved = 1
          AND b.site_id > $site_id 
          AND a.site_id = $site_id
          AND a.site_lang = b.site_lang
          ORDER BY b.site_id
    Ca devrait réunir deux requêtes en unes... mais pour moi le a.site_approved devrait être supprimé...
  8. -
  9. Bah ouais, mais pour un phpBB tu aurais quand même pu te baser sur ce mod et lui ajouter les fonctionnalités next previous et random :roll:
 
Discussions similaires
Haut