ugrás a tartalomhoz

php értelmező hiba?

PiG · 2011. Júl. 11. (H), 12.20
Sziasztok!

Van egy if-else szerkezet, nagyjából a következő:

if ( --- akarmi ---){
  //itt történnek dolgok
}
else{
  echo 'Nincs a keresésnek megfelelő termékkkk!';
  $kifejezes = 'HIBA';
  $egyeb = 'HIBA';
  $firephp->log($kifejezes);
		
  $sql = 'INSERT INTO keresesek VALUES(
  NULL,
  "'.$kifejezes.'",
  "",
  "'.mysql_real_escape_string(getIP()).'",
  "'.mysql_real_escape_string($_SERVER['HTTP_USER_AGENT']).'",
  NOW(),
  0,
  "'.$egyeb.'"
  )';			
  mysql_query($sql);
  echo $sql;
  include_once('main.inc.php');
}
A problémám a következő:
Az if ágban levő dolog, ahol 'történik valami', megtörténik, DE megcsinálja az else ágban levő mysql_query-t is. Mindezt azzal fűszerezve, hogy semelyik else ágban levő echo, log nem ír ki sehová semmit. Error reporting bekapcsolva, nem ír ki még notice-t sem. Ugyanakkor az adatbázisba meg beszúrásra kerül 5 darab sor, pedig semmilyen ciklusban nincs benne ez a kódrészlet!
Segítsen már valaki lécci, hogy mi lehet a gond, mert már tegnap este óta szenvedek, és szó szerint mindjárt elsírom magam.
Köszi, sziasztok!
 
1

if ágban

Poetro · 2011. Júl. 11. (H), 12.25
Akkor kérlek áruld el, mi van az if ágban, hogy reprodukálni tudjuk a hibát. Lehet, hogy abban van valami, aminek nem kellene ott lenni. Sőt, az is lehet, hogy vannak az oldalon olyan hivatkozások, amiket a böngésző betölt / előtölt, és azok egyike fut bele az else ágba. Érdemes lenne megnézni a HTTP forgalmat is pl. Firebug-gal, HTTPFox-szal, Fiddler-rel stb.
2

if-ben

PiG · 2011. Júl. 11. (H), 12.34
Az if ágban van kb 150 sor, ami jó sok egymásba ágyazott if-elseif-else-t tartalmaz. Minden dolgot megcsinál rendesen, ami ott van. Ennyi sort nem másolok inkább ide.
A fő rejtély, hogy az említett else ágban semmilyen ciklus nincs, és mégis 5 darab sor kerül beszúrásra.
6

Vegyük például a következő

Poetro · 2011. Júl. 11. (H), 12.45
Vegyük például a következő kódot:
<?php
foreach (range(0, 5) as $value)
  if (true) {
    if (false) {
      echo 'Nem fut le.';
  }
  else {
    echo "Lefut ötször.\n";
  }
}
?>
Meglepő lehet, ám a kimenet:
Lefut ötször.
Lefut ötször.
Lefut ötször.
Lefut ötször.
Lefut ötször.
9

Mondjuk, valamiért lefut

PiG · 2011. Júl. 11. (H), 13.10
Mondjuk, valamiért lefut ötször, de akkor az echo, meg a firebug log miért nem hajtódik végre egyszer sem?
11

Mint láthatod, a fenti kódban

Poetro · 2011. Júl. 11. (H), 13.16
Mint láthatod, a fenti kódban is megvannak a zárójel párok, csak nem úgy van formázva, ahogy elvárható lenne.
A fenti kódot így kellene formázni:
foreach (range(0, 5) as $value)
  if (true) {
    if (false) {
      echo 'Nem fut le.';
    }
    else {
      echo "Lefut ötször.\n";
    }
  }
Az, hogy a Firebug log nem úgy működik csak mellékes kérdés, mivel nem feltétlen megbízható minden környezetben.
Ezen kívül utána jártál a másik tanácsomnak is?
12

Esetleg nem is az fut le,

H.Z. v2 · 2011. Júl. 11. (H), 13.17
Esetleg nem is az fut le, csak az $sql változód értékét egyszer beállítod, elfelejted átírni és ugyanaz az SQL fut le több példányban, de máshol, másik mysql hívásnál. Ehhez tényleg kellene a teljes kód.

Egyébként ettől függetlenül: ha van rá lehetőséged, érdemes lenne átállni legalább a mysqli használatára és az escape-elés helyet a prepare-t részesíteni előnyben.
14

Ez fut le

PiG · 2011. Júl. 11. (H), 13.30
Az biztos, hogy ez az sql lekérdezés fut le. Már írtam bele különböző próba adatokat is, hogy lássam.
Poetro-nak:
A rosszul/félreérthetően formázott else blokkról itt nem lehet szó, hiszen egy blokkon belül van egy echo, meg a lekérdezés is. A lekérdezés lefut 5x, az echo meg egyszer sem. ÍRtad, hogy a firephp nem megbízható, de azért egy echoval való kiírásnak csak működni kéne...
15

Megjelenés

Poetro · 2011. Júl. 11. (H), 13.39
Az lehet, hogy lefut az echo, de attól még nem biztos, hogy látod is. Tegyük fel, hogy az oldalon van öt kép, amit valamilyen oknál fogva a te fenti kódod kezel le (mondjuk hibás beállításokból adódóan). Ekkor nem fogod látni az echo kimenetét, mivel az csak a kép adataiban látszódna (de mivel a kép mivel nem tartalmaz valós képadatot, nem jelenik meg). Ugyanez a helyzet az előtöltéssel. Mivel az előtöltött adat nem jelenik meg, ezért nem fogod látni a kimenetét.
16

debug

Poetro · 2011. Júl. 11. (H), 13.43
Másik dolog, amivel segíteni tudnád a hiba felderítését, hogy használsz valami debuggert (pl. xdebug), és hogy a 150 soros kódodat felbontod függvényekre, és hasonlóan teszel az else ágban levő kóddal is. Ez már csak azért is fontos, hogy az abban létrejött változók ne szennyezzék be a globális névteret, ezáltal megjósolhatatlan működést okozzanak például az include-olt fájl esetén (amiben szintén elérhető lesz például a $sql változód, amit valószínűleg nem is szeretnél).
5

olyan hivatkozások, amiket a

H.Z. v2 · 2011. Júl. 11. (H), 12.39
olyan hivatkozások, amiket a böngésző betölt / előtölt, és azok egyike fut bele az else ágba

Előtöltés dinamikus oldalaknál is létezik?
Hm. Egyre izgalmasabb ez a webes világ...
7

Dinamikus oldalak

Poetro · 2011. Júl. 11. (H), 12.52
Mit jelent az, hogy dinamikus oldalak? És a böngésző hogy tudja megállapítani a különbséget a nem dinamikus és dinamikus oldal között?
Egyes böngészők csak a megfelelő link elemmel megjelölt oldalakat töltik be (pl. <link rel="next" href="next.html">), mások pedig a gyorsabb élmény miatt előtöltenek.
8

Pl. abból, hogy van az

H.Z. v2 · 2011. Júl. 11. (H), 12.58
Pl. abból, hogy van az URL-ben egy kérdőjel... (de az is igaz, hogy ez rég nem igaz ( :) ), bármilyen URL mögött állhat dinamikus oldal)

Dinamikus alatt értem a valamilyen szkripttel előállított, nem statikus lapokat, pl. a PHP-vel előállítottakat.
10

Ott van értelme

Poetro · 2011. Júl. 11. (H), 13.11
Hiszen pont ott van értelme az előtöltésnek. Tegyük fel, hogy van egy keresési oldalad találati listája (?q=keresettszo). Ekkor érdemes lehet előtölteni a következő oldalt (?q=keresettszo&page=1), ezáltal gyorsítani az eredmények áttekintését a felhasználó szemszögéből.
3

Első körben keresnék egy

H.Z. v2 · 2011. Júl. 11. (H), 12.34
Első körben keresnék egy olyan szövegszerkesztőt, ami megmutatja a zárójel párokat.
Abból, amit írtál, arra tippelnék, hogy az else előtt eggyel kevesebb, mögötte meg eggyel több kapcsos zárójel van, mint kellene...
4

szerkesztő

PiG · 2011. Júl. 11. (H), 12.37
Aptana Studioban csinálom, megvannak a párok, megnéztem, Notepad++-al is, szépen összeköti az összetartozókat.
13

Használsz RewriteRule-t a

deejayy · 2011. Júl. 11. (H), 13.26
Használsz RewriteRule-t a .htaccess-ben?
17

Rewrite igen

PiG · 2011. Júl. 11. (H), 14.29
Használok, és nézegettem is:

csak ennyi van egyébként:
RewriteRule ^(.*) index.php?rewrite=$1 [QSA]
innentől kezdve egy php file kezel le minden url-t
18

Ebből adódik

Poetro · 2011. Júl. 11. (H), 14.43
Ebből adódik a probléma, hogy mivel mindent az index.php-d lát el, lehet, hogy olyat is amit nem szeretnél, ez eredményezheti az öt lekérést, amit az fog kiszolgálni, ezáltal megtörténik az adatbázisba írás.
19

content-type

atxatx · 2011. Júl. 11. (H), 15.38
Tegyél a kimenet elé egy content type beállítást. Ha ez nincs a böngésző megpróbálja valamilyen kódolással megjeleníteni, aztán ha lesz valami karakter ami nem jó abban a kódolásban lesz egy refresh.
header('Content-type: text/html; charset="iso-8859-2"');
20

Asszem sikerült kibogozni!

PiG · 2011. Júl. 11. (H), 19.52
A "hiba" természetesen tök máshol volt, mint hittem.
Végigbogarászva az error logot, és megfogadva deejayy és Poetro tanácsait a rewrite és httpfox kapcsán a bűnös a favicon lett.

<link rel="shortcut icon" href="/favicon.ico" />
<link rel="icon" type="image/ico" href="/favicon.ico" />


/ jel hiányzott a hrefben.

Most már úgy tűnik jó...
Hogy miért pont 5x hajtódott végre a témanyitóban említett kód, az egyelőre rejtély, valószínű a böngésző annyiszor próbálta - sikertelenül - letölteni a favicon-t.

Mindenkinek köszi a segítséget, remélem, most már minden ok lesz, mert ráment a tegnap estém, meg nagyjából az egész mai napom.