Moro,
Osui eteen todella outo bugi johon en löydä virhettä, minkä takia skripti tekisi niin kuin se tekee.. Koodia:
<?php $luokka = $_GET["luokka"]; $mista = $_GET["mista"]; $hakusanat = $_GET["hakusanat"]; echo "DEBUG: luokka = ".$luokka." & mista = ".$mista."<br>\n"; if($luokka == 0 && $mista == 0){ echo "DEBUG: Using VapaasanaHaku();<br>\n"; $kirjasto->VapaasanaHaku($hakusanat); } else { $kirjasto->Haku($luokka, $mista, $hakusanat); } echo $kirjasto->LuoHTMLLista(); ?>
Yllä olevan koodinpätkän olisi tarkoitus käyttää vapaasanahaku -funktiota jos luokka ja mista muuttujat ovat 0. Näin se myös tekee. Mutta sitten jos luokka ja/tai mista ei ole 0 vaan jotain muuta (merkkijono) niin sen olisi tarkoitus käyttää haku -funktiota. Näin se ei kuitenkaan tee, vaan se käyttää jälleen tuota vapaasanahakua.
Mistähän moinen voisi johtua? Tuo debug tulostaa 0 tapauksessa 0 ja jos muuttujassa on merkkijono, se tulostaa sen oikein, mutta käyttää silti vapaasanahakua.
Demoa löytyy: http://lazu.ath.cx/projektit/Kirjasto/
Veikkaan että homman sotkee vähäsulkeinen if, kokeile korvata iffi rivillä
if( ($luokka == 0) && ($mista == 0) ) { // Tai if( ( (int) $luokka === 0 ) && ( (int) $mista === 0 ) ) {
Tosin jälkimmäisestä en ole varma, käsittääkseni typecast kirjaimille palauttaa 1.
Kiitos vastauksesta, harmi vain ettei kumpikaan noista korjannut ongelmaa.
Kokeile kirjoittaa ehto näin:
if($luokka == "0" && $mista == "0"){
Entä miten koodi käyttäytyy käänteisesti? Eli
if($luokka != 0 || ($luokka == 0 && $mista != 0)){ $kirjasto->Haku($luokka, $mista, $hakusanat); } else { echo "DEBUG: Using VapaasanaHaku();<br>\n"; $kirjasto->VapaasanaHaku($hakusanat); }
?
EDIT: Yksi kokeilemisen arvoinen vaihtoehto olisi myös empty() joka reagoi truella arvoihin "", 0, "0", null, false, array() ja var $var .
Noniin, kiitoksia Antille :) Lähti toimimaan. Olipas se helposti korjattu, ei vain tullut mieleen tuollainen.
Mielenkiintoista että löyhä vertailu käyttäytyy noin, sillä 0 == "0" .
Kannattaa kyllä edes vähän suojata:
$luokka = intval($_GET["luokka"]); $mista = intval($_GET["mista"]); $hakusanat = str_replace(array('/', '"', '\''), '', $_GET["hakusanat"]);
Nyt ainakin on sitten lisäksi varmistettu, että $luokka ja $mista ovat lukuarvoja, mikä myös tehokkaasti kiertää tarpeen käyttää lainausmerkkejä vertailussa.
Suosittelen suojaamaan kaikki arvot mitä hakee ja pakottamaan ne sisältämään esim. juuri numeroarvon, vaikka niitä ei voisikaan käyttää käyttökohteessaan haxorointiin. Se vain on niin hemmetin hyvä tapa ja on hyvä oppia kirjoittamaan hyvin suojattua koodia.
PEAR coding standards. $_GET['luokka'].
Merri: Ne eivät ole aina lukuja, voivat olla myös merkkijonoja
Varsinainen pointtini on siitä huolimatta validi: rajaa kaikki "ulkopuolelta" tuleva tieto siten, että niiden arvo voi olla vain sitä mitä siinä saa olla :)
Kysymys: mikä seuraavista vertailee muuttajaa $arvo numerona nolla?
1) $arvo == 0
2) $arvo === 0
3) $arvo == "0"
Toinen kysymys: jos halutaan vertailla muuttujaa $arvo ja se palauttaa arvon false, niin onko se yhtäsuuri kuin nolla? Viitaten siis ylläolevaan sekä alkuperäiseen kysymykseen.
Oikea vastaus sitten joskus...
-W-
Aihe on jo aika vanha, joten et voi enää vastata siihen.