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

retrojex
Invité n'ayant pas de compte PHPfrance

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

Mammouth du PHP | 2278 Messages

19 mars 2015, 09:52

Une situation dans ce genre?
if (cond1)
{

}
else
{

}

if (cond2)
{

}
else
{

}
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

ynx
Mammouth du PHP | 586 Messages

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
	}
}

retrojex
Invité n'ayant pas de compte PHPfrance

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.

Petit nouveau ! | 5 Messages

20 mars 2015, 12:55

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

Mammouth du PHP | 2278 Messages

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;
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Petit nouveau ! | 5 Messages

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.

Mammouth du PHP | 2278 Messages

20 mars 2015, 14:52

Ton lien ne donne rien
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Petit nouveau ! | 5 Messages

20 mars 2015, 15:01

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

Normalement le lien remarche :)

Mammouth du PHP | 2278 Messages

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 ?
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Petit nouveau ! | 5 Messages

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 ?

Mammouth du PHP | 2278 Messages

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
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Petit nouveau ! | 5 Messages

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.

Mammouth du PHP | 2278 Messages

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>"
?>
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD