ouvrir un pop up avant un header

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : ouvrir un pop up avant un header

par choubix » 20 nov. 2007, 14:46

hello,

je voulais seulement dire que LES MIENS ne servaient a rien ;)
je suis parti a la chasse dans mes scripts: en train de tout refaire et de tester... O joie ;)

en attendant: c'est bien cool de votre part de prendre du temps pour aider...
merci!

par Ryle » 20 nov. 2007, 13:59

ok: donc my real_escape ne sert donc a rien :(
olah olah... pas de raccourcis syntaxiques aussi abrupt :)

La fonction mysql_real_escape_string() permet d'échapper les chaines afin de protéger les apostrophes et d'éviter les injections sql. C'est la façon dont tu l'as utilisé dans le sprintf qui est innefficace :)

Comme je le disais plus haut, tu peux l'utiliser soit dans ta chaine en concatenant les valeurs :
$query = "UPDATE clients SET counter = counter + 1  
  WHERE email = '".mysql_real_escape_string($email)."'  
  AND password = md5('".mysql_real_escape_string($password)."')"; 
ou bien avec un sprintf en "codant" les variables dans la chaine et en spécifiant ensuite les valeurs à utiliser :
$query = sprintf("UPDATE clients SET counter = counter + 1 WHERE email = '%s' AND password = md5('%s')",  
  mysql_real_escape_string($email),  
  mysql_real_escape_string($password)  
);
C'est donc juste une petite rectification à faire dans tes requêtes, ça ne remet nullement en cause l'intérêt de la fonction, bien au contraire, comme tu vois je l'utilises dans les deux cas :)

par choubix » 20 nov. 2007, 13:26

ok: donc my real_escape ne sert donc a rien :(

super... je dois bien avoir ca dans une dizaine de pages...
je crois que je capte un peu miexu comment ca marche la...

les %s et %d s'appliquent qu'a sprintf?

ici ca va:?
$id_gifts = (isset($_GET['id_gifts']))?$_GET['id_gifts']:'';
$id_gifts = mysql_real_escape_string(htmlentities($id_gifts, ENT_QUOTES)); 

par Ryle » 20 nov. 2007, 12:49

Tout pareil que Calimero! :) "cot' cot' pareil qué miguel" (pour ceux qui comprendront ;))
par contre je ne comprends pas bien le probleme avec sprintf
j'ai suivi ce qu'il y a dans la doc anglaise pourtant.
En fait, le principe de sprintf est justement de sortir tes variables de la chaine. Tu construis une chaine dans laquelle les variables sont remplacées par des glyphes abscons du genre %s (string), %d (decimal), etc. qui seront remplacées par les valeurs que tu spécifies ensuite.

Donc si dans ta chaine tu colles directement la valeur comme tu le faisais au lieu d'utiliser des %s, les valeurs spécifiées ensuite ne sont pas utilisées (et du coup tes variables n'étaient pas échappées avec le real_escape :))

En complément de la réponse de Calimero, il faut savoir ceci : les variables dans une chaine entre guillemets sont interprétées (la chaine est parsée, les variables identifiées et remplacées). Entre apostrophes, elles ne le sont pas. En clair :
$var = 'monde';
echo "Bonjour le $var"; // affiche : Bonjour le monde
echo 'Bonjour le $var'; // affiche : Bonjour le $var
echo "Bonjour le ".$var; // affiche : Bonjour le monde 
// Nota : la chaine "Bonjour le" est parsée pour vérifier si elle contient des variables
echo 'Bonjour le '.$var; // affiche : Bonjour le monde 
// Nota : la chaine n'est pas parsée, donc plus rapide à exécuter
Bon, ça se compte en pouièmes de micro-secondes, donc pas vraiment significatif, mais inconsciement on se sent mieux :) (non ? ah...... ;))
Ca rend effectivement le code plus lisible (on repère 'achement plus vite les variables avé les couleurs) et cela t'évitera effectivement des erreurs le jour (qui ne tardera pas à arriver) où tu auras des chaines contenant des guillemets et que tu préfèreras utiliser les apostrophes plutôt que de tout backslasher :) :
echo '<input type="text" name="toto" value="'.$toto.'" />';
// est quand même plus lisible que :
echo "<input type="text" name="toto" value="$toto" />";

par Calimero » 20 nov. 2007, 11:46

par ailleurs: sortir les "variables des chaines" (que j'ai entendu a plusieurs reprises ;) ) reste peu clair pour moi. mon code marche tres bien sans rajouter des points entre les variables. qu'est ce que ca change?? (c'est une vraie question: je n'ai absolument aucune idee de ce que ca fait...)
- C'est plus performant

- Ca t'évitera des bugs

- Ca te permet de bénéficier de la coloration syntaxique, sur ce site et également dans ton éditeur de code préféré.

Donc il faut le faire, point. Namého :D

par choubix » 20 nov. 2007, 11:41

salut Ryle,

pour ce qui est de $recommend je l'ai corrige, ca marche nickel (j'envois un index.php?referral=1 dans le header si la variable $recommend est "true" puis dans index4.php je lance la pop up si referral=1)

par contre je ne comprends pas bien le probleme avec sprintf
j'ai suivi ce qu'il y a dans la doc anglaise pourtant.

par ailleurs: sortir les "variables des chaines" (que j'ai entendu a plusieurs reprises ;) ) reste peu clair pour moi. mon code marche tres bien sans rajouter des points entre les variables. qu'est ce que ca change?? (c'est une vraie question: je n'ai absolument aucune idee de ce que ca fait...)

merci :)

par Ryle » 20 nov. 2007, 11:09

Ce qu'il te faut bien comprendre, c'est qu'un header, c'est du php, ça se fait donc en premier sur le serveur. L'ouverture d'une nouvelle fenêtre, c'est géré par le navigateur, via du javascript côté client, donc ça intervient après l'exécution de php.


Par ailleurs :

Ton utilisation de sprintf() n'est pas bonne. Soit tu construit une chaine normalement, simplement, proprement (en sortant les variables !!), soit tu utilises sprintf (qu'est franchement pas clair à mon sens) avec les %s, %d et compagnie qui correspondent aux variables passées ensuite (attention à l'ordre :
// Au lieu de 
$query = sprintf("UPDATE clients SET counter = counter + 1 WHERE email = '$email' AND password = md5('$password')", 
                  mysql_real_escape_string($email), 
                mysql_real_escape_string($password) 
                ); 

// Tu peux faire (qui est à mon sens le plus lisible) :
$query = "UPDATE clients SET counter = counter + 1 
  WHERE email = '".mysql_real_escape_string($email)."' 
  AND password = md5('".mysql_real_escape_string($password)."')";

// ou bien :
$query = sprintf("UPDATE clients SET counter = counter + 1 WHERE email = '%s' AND password = md5('%s')", 
  mysql_real_escape_string($email), 
  mysql_real_escape_string($password) 
); 
if (recommend == true) // Notice : la constante "recommend" n'est pas définie ;)

par h0_noMan » 20 nov. 2007, 10:21

Au lieu d'un header('location : ') pourquoi tu n'utiliserais pas <META http-equiv="Refresh" content="10;URL=../index4.php">

par Invité » 20 nov. 2007, 09:55

salut Victor!

ca fait 2 nouvelles fonctions a decouvrir pour moi!
j'ai regarde le manuel. l'utilisation ne m'a pas encore saute aux yeux (l'exemple montre comment remplacer une chaine de caractere par une autre)

bon: je n'ai fait que le manuel en anglais.

en attendant je suis sur que ca doti etre pratique pour pas mal de choses
je creuse donc :)

merci!

par Victor BRITO » 20 nov. 2007, 00:55

As-tu jeté un coup d'œil du côté des fonctions ob_start() et ob_end_flush() ? :wink:

ouvrir un pop up avant un header

par choubix » 19 nov. 2007, 23:29

hello,

est ce uq'i lest possible d'ouvrir un pop up ET un header en meme temps svp?

j'ai un script ou A recommande a B le site. je cree un compte temporaire pour B.
si B vient sur le site son compte est active A recoit des points.

le truc c'est que quand B vient sur le site son compte n'est pas complet. aussi je voudrais le rediriger vers la page centrale du site ET ouvrir un pop up avec une explication et un formaulaire assez court pour completer son profil.

j'ai essaye le code suivant mais ca ne passe pas:
	  //check that client has been recommended + that points have not been attributed to the referring client
	  if($referral !== "0" && $confirmation == "0")
	  {
	  $query = "SELECT id_clients FROM grids_clients WHERE id_clients = '$_SESSION[id_clients]'";
	  $result = mysql_query($query) or die('Query failed. ' . mysql_error());
	  
		  if (mysql_num_rows($result) > 1)
		  {
		  $query = "UPDATE clients SET confirmation = 1 WHERE id_clients = '$_SESSION[id_clients]'";
		  mysql_query($query) or die ('Invalid query: ' . mysql_error());
		  
		  //give away 1000 points per registered user
		  $query = sprintf("UPDATE clients SET points = points + 1000 WHERE id_clients = '$referral'",
		  			mysql_real_escape_string($referral)
					); 
		  mysql_query($query) or die ('Invalid query: ' . mysql_error());
		  
		  $recommend = true;
		  }	  
	  }	  	  
      switch($data["level"])
	  {
	  case "0":
	  //user mode
	  
	  //update visit counter
	  $query = sprintf("UPDATE clients SET counter = counter + 1 WHERE email = '$email' AND password = md5('$password')",
	  			mysql_real_escape_string($email),
				mysql_real_escape_string($password)
				); 
	  mysql_query($query) or die ('Invalid query: ' . mysql_error());
	  
	  if (recommend == true)
	  {	  
	  print "<script type=\"text/javascript\">
	  window.open(\"http://www.monsite.com/temp/index2.php\");
	  </script>";
	  
      header('Location: ../index4.php');
	  exit();
      break;
	  }
	  else
	  {
      header('Location: ../index4.php');
	  exit();
      break;
	  }
est ce que vous pensez qu'il y a une meilleur emethode que ca (qui ne marche pas pour le moment...)

merci