Empêcher une condition if/else de s'exécuter plusieurs fois d'affilés

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 : Empêcher une condition if/else de s'exécuter plusieurs fois d'affilés

Re: Empêcher une condition if/else de s'exécuter plusieurs fois d'affilés

par sirakawa » 22 mars 2015, 14:56

Je me suis amusé à ça:
<?PHP
function estdate ($texte)
{
	$pattern = "/[a-zA-Z]{3}\/[0-3][0-9]\/[0-9]{4}\s\-\s[0-2][0-9]:[0-5][0-9]\s(am|pm)/";
	$resultat = preg_match($pattern, $texte);
	return ($resultat == 1) ? True: False;
}
$data = array(
	"Mar/21/2015 - 08:00 am", 
	"Glee (06x12)",
	"Grimm (04x14)",
	"Mar/21/2015 - 09:00 am",
"The Big Bang Theory (08x15)",
"Mer/22/2015 - 08:00 am", 
);
$nb = count ($data);
$i = 0;
$liste = array();
$k=0;
$l = 0;
while ($i < $nb)
{
	
	$donnee = $data[$i];
	if (estdate($donnee))
	{
		$j = $i+1;	
		$donnee1 = isset($data[$j]) ? $data[$j]: '' ;
		$nondate = estdate ($donnee1);	
$k = $l+1;
		while (($j < $nb) and ($nondate == false))
		{
			$liste[$k] = $donnee;
			$donnee1 = $data[$j];
			$liste[$l++] = $donnee1;
			$nondate = estdate ($donnee1);	
			$j++;
			$i = ($nondate === false)? $i++:$i;
		}
		
	}
	$i++;

}
foreach ($liste as $z)
print "$z<br>"
?>

Re: Empêcher une condition if/else de s'exécuter plusieurs fois d'affilés

par retrojex » 20 mars 2015, 18:05

A la base, le flux donne la date sous cette forme: - Mar/21/2015 - 08:00 am, l'heure change selon la date d'upload et donc je reçois les infos de bases sous cette forme:

- Mar/21/2015 - 08:00 am
- Glee (06x12)
- Grimm (04x14)

- Mar/21/2015 - 09:00 am
- The Big Bang Theory (08x15)


Etc, c'est un exemple mais c'est les infos de base sont de ce type.

Re: Empêcher une condition if/else de s'exécuter plusieurs fois d'affilés

par sirakawa » 20 mars 2015, 18:01

Tu reçois une ligne:
21/Mar/2015
puis:
Glee (06x12)
Grimm (04x14)
Last Man Standing (04x19)

ou sous une autre forme

Re: Empêcher une condition if/else de s'exécuter plusieurs fois d'affilés

par retrojex » 20 mars 2015, 16:47

Le lien c'est ce que je reçois sous là forme où je le reçois. Cependant, tu as surement vu que certaines dates étaient "vides" de noms de séries. Je voudrais que ces dates disparaissent et que seules celles ayant une liste de séries (une ou plusieurs) en dessous s'affichent.

Tu vois ce que je veux dire ?

Re: Empêcher une condition if/else de s'exécuter plusieurs fois d'affilés

par sirakawa » 20 mars 2015, 16:07

Montre ce que tu reçois sous la forme où tu le recois.
Le lien c'est ce que tu voudrais obtenir ou à peu près ?

Re: Empêcher une condition if/else de s'exécuter plusieurs fois d'affilés

par retrojex » 20 mars 2015, 15:01

Désolé, j'ai un problème avec mon hébergeur...

Normalement le lien remarche :)

Re: Empêcher une condition if/else de s'exécuter plusieurs fois d'affilés

par sirakawa » 20 mars 2015, 14:52

Ton lien ne donne rien

Re: Empêcher une condition if/else de s'exécuter plusieurs fois d'affilés

par retrojex » 20 mars 2015, 14:02

Oui j'ai eu cette idée aussi mais la date ne va pas rentrer dans la première boucle if, c'est ça mon problème.
Le flux RSS est de type

Code : Tout sélectionner

<?xml version="1.0"?> <rss version="2.0"> <channel> <title>titre</title> ------> Renvoies les noms de séries et les dates. <link>lien</link> <description>desc</description> </channel> </rss>
Du coup, $article['title'] renvoie une date lorsque <title>date</title> et $article['title'] renvoie un nom de série lorsque <title>Nom de série</title>.

Je sais pas si c'est très clair mais voilà un apercu de ce que ça donne en vrai:

http://retrojex.comuf.com/try/rss-liens.php

Je voudrais éliminer les dates sous lesquels, il n'y a pas de shows.

Re: Empêcher une condition if/else de s'exécuter plusieurs fois d'affilés

par sirakawa » 20 mars 2015, 13:44

// Expression régulière de type date + heure  Mois(3 lettres)/dd/aaaa - hh:mm (am|pm)
$reg = "/[a-zA-Z]{3}\/[0-3][0-9]\/[0-9]{4}\s\-\s[0-2][0-9]:[0-5][0-9]\s(am|pm)/"; 
$try = preg_match($reg, $article['title']);
$tor = ""; // déplacé assure qu'il existe toujours        
if ($try != 1) //____________________________________________________Le titre n'est pas une date
{//1
	// il y a plus bas reze qui a l'air identique            
    $rezer = substr($article['title'], 2);
    //plus simple avec str_replace
	$text3 = str_replace(
		[
		'(',')',
		'{','+',
		'[',
		']'],
		['','','','','','',''], 
		$rezer);
            	
	// Sélectionne le nom dans la DB où la colonne Name = $text3
	$req = 'SELECT Name FROM *** WHERE Name="'. $text3 .'"'; 
	$rs_query = mysqli_query($acdb,$req); // exécute la requête
	$rs = mysqli_num_rows($rs_queri);
                  
     if($rs >= 1) //____Il existe au moins une série satisfaisant la requete dans la BDD
	 {//2
	      $tor= "<li><p class='show_reg'>$rezer</p></li>\n";
	  }
	  else //________________Il n'existe pas de série satisfaisant la requete dans la BDD    
      {//2
       	// Sélectionne le nom dans la DB où la colonne Name2 = $text3
        $req = 'SELECT Name2 FROM **** WHERE Name2= "'.$text3.'" '; 
		 $rs_query = mysqli_query($acdb,$req); // exécute la requête
		 $rst = mysqli_num_rows($rs_query); // Nombre de lignes satisfaisant la requête.
		        
		 if($rst >= 1)//_____une série au moins satisfait la requete dans la BDD
         {//3
         	$tor = "<li><p class='show_verif'>$rezer</p></li>\n";
          }//3
                           
         //2}
         // C'est ici qu'il faut traiter la date
 
 }//1
 $page .= $tor;

Re: Empêcher une condition if/else de s'exécuter plusieurs fois d'affilés

par retrojex » 20 mars 2015, 12:55

Personne n'a d'idée pour mon problème ? je prends toutes les réponses ;)

Re: Empêcher une condition if/else de s'exécuter plusieurs fois d'affilés

par retrojex » 19 mars 2015, 16:32

Tout d'abord merci pour vos réponses, mais je pense plus que ma configuration est celle que ynx expose:

Je vous mets mon code:

Code : Tout sélectionner

$reg = "/[a-zA-Z]{3}\/[0-3][0-9]\/[0-9]{4}\s\-\s[0-2][0-9]:[0-5][0-9]\s(am|pm)/"; // Expression régulière de type date + heure Mois(3 lettres)/dd/aaaa - hh:mm (am|pm) $try = preg_match($reg, $article['title']); if ($try != 1) // Test si le titre n'est pas une date { $rezer = substr($article['title'], 2); $text = preg_replace('#\(\s*[a-z0-9]*\s*\)*\s*#i', '', $rezer); // Enlèce les parenthèses () $text2 = preg_replace('#\[\s*[a-z0-9]*\s*\]*\s*#i', '', $text); // Enlève les crochets [] $text3 = preg_replace('#\{\s*[a-z0-9]*\s*\}*\s*#i', '', $text2); // Enlève les accolades {} $req = 'SELECT Name FROM *** WHERE Name="'. $text3 .'"'; // Sélectionne le nom dans la DB où la colonne Name = $text3 $rs_queri = mysqli_query($acdb,$req); // Teste la requête $rs = mysqli_num_rows($rs_queri); if($rs >= 1) // Test si la Série est dans la BD { $reze = substr($article['title'], 2); // Enlève les 2 premiers caractères $tor= "<li><p class='show_reg'>$reze</p></li>\n"; $page .= $tor; } if($rs === 0) { $reqr = 'SELECT Name2 FROM **** WHERE Name2= "'.$text3.'" '; // Sélectionne le nom dans la DB où la colonne Name = $te $rs_query = mysqli_query($acdb,$reqr); // Teste la requête $rst = mysqli_num_rows($rs_query); // Nombre de fois que la requête existe. if($rst >= 1) { $reze = substr($article['title'], 2); // Enlève les 2 premiers caractères $tor = "<li><p class='show_verif'>$reze</p></li>\n"; $page .= $tor; } else { $tor = ''; $page .= $tor; } } } else { $tr = substr($article['title'], -8); // Garde les 8 derniers caractères de la chaine if($tr != "08:00 pm") // Test si les 8 derniers caractères sont différents à "08:00 pm" { $tar=""; $page .= $tar; // Ne marque rien si le test est valide } else // Sinon il écrit la date { $title = substr($article['title'], 0, -11); $ex = explode("/", $title); $day = intval($ex[1]); $month = $ex[0]; $year = intval($ex[2]); $date2 = array(++$day, $month, $year); $date3=implode("/", $date2); $tar = "<center><span class='date'>$date3</span></center>\n"; $page .= $tar; } }
En faite, c'est un lecteur RSS qui affiche un calendrier de série, sauf que la variable $article['title'] revoie dès fois une date et dès fois le nom de la série. Donc mes deux grandes parties IF / ELSE testent si la variable est de type date ou de type nom de série.

Ce que je voudrais c'est que la date s'affiche uniquement s'il y a un ou des titres de séries à afficher en dessous, vous voyez ?

Je suis désolé le code est un peu long et pas vraiment bien indenté. Mais il vérifie aussi que le nom des séries soient dans la BD, etc.

Merci d'avance pour les futures renseignements.

Re: Empêcher une condition if/else de s'exécuter plusieurs fois d'affilés

par ynx » 19 mars 2015, 15:09

Salut,

Ou quelque chose comme ceci ?
$autoriseElse = false;

if (cond1) {
	// on passe dans le if au moins une fois
	$autoriseElse = true;
	
} else {
	if ($autoriseElse) {
		// on passe ici seulement si on est passé dans le if une fois
	}
}

Re: Empêcher une condition if/else de s'exécuter plusieurs fois d'affilés

par sirakawa » 19 mars 2015, 09:52

Une situation dans ce genre?
if (cond1)
{

}
else
{

}

if (cond2)
{

}
else
{

}

Empêcher une condition if/else de s'exécuter plusieurs fois d'affilés

par retrojex » 19 mars 2015, 00:17

Bonjour,

Alors je m'explique, dans mon code j'ai deux grande conditions if / else, je voudrais savoir s'il y avait un moyen d'interdire l'exécution de la partie else si la partie if n'a pas été faite avant au moins une fois ?

Croyez-vous que c'est possible ?

Merci d'avance