Autor Zpráva
Hooonza
Profil
Hezký den, poradíte mi prosím, proč nefunguje podmínka
if (!(in_array($ipadr, $silent)) || (preg_match($googlebot_reg,$ipadr)))

ani
if ((!in_array($ipadr, $silent)) || (!preg_match($googlebot_reg,$ipadr)))

zatímco

if (!in_array($ipadr, $silent)) { 
    if (!preg_match($googlebot_reg,$ipadr))     {

funguje? Asi jsem nepochopil ten operátor ||, jak napsat ANI ... ANI, jak to je správně? Dík!
kazlik
Profil
if(!in_array($ipadr, $silent) && !preg_match($googlebot_reg,$ipadr)){

Operátor || znamená NEBO a operátor && znamená A ZÁROVEŇ. (doufám, že to není blbě)
Tori
Profil
Hooonza:
/* První NEBO druhá NEBO obě podmínky jsou splněny. Negace ovlivní vyhodnocení jedné podmínky, nikoli celku. */
if ($a || $b)
  $c=true;
// je ekvivalentni s:
if ($a)
  $c=true;
else
  if ($b)
    $c = true;

/* Prvni I druhá podmínka jsou splněny. */
// $a i $b jsou true
if ($a && $b)
  $c=true;
// $a i $b jsou false, což se dá říct i jako "ani $a ani $b není true"
if (!$a && !$b)
  $c=true;
Hooonza
Profil
Jasně, tam nemá být "a". Stačí mi, když bude nesplněná jedna podmínka, aby vyhodnocení prošlo (konkrétně: skript hlídá návštěvníky stránky a pošle jejich IP mailem, kdyby to chtěl někdo zneužívat, ať ho zablokuji. Hlášení ale nepotřebuji poslat, pokud tu stránku otevřu já - $silent obsahuje moje IPčka a taky to nepotřebuji, když tam přijde googlebot, ten ať si chodí, to vědět nemusím. Jenže googlebot má IP pokaždé jinou, takže si ho do $silent těžko přidám, zdá se ale, že všechny jeho IP začínají stejnou sekvencí, bota tedy vyhodnotím regulárním výrazem). Tedy bych čekal, že

if ((!in_array($ipadr, $silent)) || (!preg_match($googlebot_reg,$ipadr)))


bude fungovat, tam by se snad mohla vyhodnocovat každá závorka zvlášť? Jak píše Tori, první možnost. Jenže to nefunguje, mail přijde i v případě, že regulární výraz projde jako shodný (to mám otestováno dalším skriptem).
Tori
Profil
Hooonza:
Ale vždyť lidskou řečí jste to napsal jako &&:
Hlášení ale nepotřebuji poslat, pokud tu stránku otevřu já [...] a taky to nepotřebuji, když tam přijde googlebot.
U OR (||) stačí, aby byla splněná alespoň jedna podmínka, a všechny následující se rovnou přeskočí. Takže IP není vaše => podmínka splněna => googlebota nekontroluju => celé IF je vyhodnoceno jako true => mail se odešle (a závorky navíc v podmínce to nezmění). Vizte [#2].

edit: ↓↓xmark: Díky, to jsem nevěděla jak jednoduše vysvětlit. :)
Hooonza
Profil
Ano napsal jsem to:
Já nepotřebuji, abych zároveň navštívil stránku já se svou IP i s IP adresou googlebota :-) Chci, když navštívím stránku já nebo když přijde googlebot, aby podmínka prošla... :-)
&& znamená a zároveň polidsku, žejo?
xmark
Profil
Hooonza:
Může ti pomoct, když budeš vypisovat AND, OR.
A ještě jedna finta, která se může hodit:

(!$a AND !$b) rovná se !($a OR $b)
(!$a OR !$b) rovná se !($a AND $b)
Hooonza
Profil
Aha, tohle by možná nějak prošlo, ale s počítačema se o logiku hádat nebudu, kašlu na to, chtěl jsem to mít kvůli přehlednosti :-) Řeším to 1 proměnnou nastavenou na true a 1 rozhodováním navíc,

if ((in_array($ipadr, $silent)) || (preg_match($googlebot_reg,$ipadr))) $sendmail = false;

a pak krásně
if ($sendmail) 

funguje jak má. Mockrát díky všem za pomoc i trpělivost... ! :-)
Toto téma je uzamčeno. Odpověď nelze zaslat.