Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Todella outo if-bugi PHP:ssä

Sivun loppuun

Lazu [25.01.2007 14:19:12]

#

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/kirjastoleiska/ , kokeilkaa vaikka hakea ilman hakusanaa koskematta pudotusvalikoihin ja sen jälkeen vaihtakaa vaikka luokkaa ja taas ottakaa hakusana pois ja hakekaa.. Tämä ei vain toimi.

Agony [25.01.2007 14:33:48]

#

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.

Lazu [25.01.2007 14:40:15]

#

Kiitos vastauksesta, harmi vain ettei kumpikaan noista korjannut ongelmaa.

Antti Laaksonen [25.01.2007 14:48:19]

#

Kokeile kirjoittaa ehto näin:

if($luokka == "0" && $mista == "0"){

Agony [25.01.2007 14:49:53]

#

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 .

Lazu [25.01.2007 14:51:10]

#

Noniin, kiitoksia Antille :) Lähti toimimaan. Olipas se helposti korjattu, ei vain tullut mieleen tuollainen.

Agony [25.01.2007 14:59:02]

#

Mielenkiintoista että löyhä vertailu käyttäytyy noin, sillä 0 == "0" .

Merri [25.01.2007 15:01:48]

#

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.

tsuriga [25.01.2007 15:06:04]

#

PEAR coding standards. $_GET['luokka'].

Lazu [25.01.2007 16:37:22]

#

Merri: Ne eivät ole aina lukuja, voivat olla myös merkkijonoja

Merri [25.01.2007 17:32:26]

#

Varsinainen pointtini on siitä huolimatta validi: rajaa kaikki "ulkopuolelta" tuleva tieto siten, että niiden arvo voi olla vain sitä mitä siinä saa olla :)

Wizard [25.01.2007 20:49:38]

#

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-


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta