Eli ongelma on seuraavanlainen:
Minulla on tietokannassa nimiä, joita minun pitäisi hakea PHP:n avulla ja muuttaa "näkyvää" arvoa vaikka niin, että nimestä pekka tulee vaikka pekkahihi jne.
Tällähetkellä koodi menee tähän tyyliin:
.....
while ($rivi = mysql_fetch_object($haku)) {
//haetaan nimi, hinta ja määrä muuttujiin
$nimi = $rivi->nimi;
$hinta = $rivi->hinta;
$maara = $rivi->maara;
//tulostetaan taulukon rivi
echo "<tr><td>$nimi</td><td>$hinta €</td><td>$maara kpl</td></tr>";
....
Kuvittelin, että ennen taulun tulostamista listätään tyyliin:
if ($nimi=pekka)
$nimi=pekkahihi;
elseif ($nimi=matti)
$nimi=mattihaha;
jne jne jne...
... Mutta jos näin tekee, niin kaikkien samassa rivissä olevien arvoksi tulee pekkahihi.
Mikä ratkaisuksi ?
Vertailussa käytetään kahta (tai kolmea) =
-merkkiä.
if ($nimi == "pekka") $nimi = "pekkahihi"; // jne.
Ja kun tiedetään sieltä tulevan stringiä niin sama vertailla tarkasti, ===. On hyvä myös dokumentoinnin kannalta.
Itse en kyllä tuosta "vahvasta" vertailusta pidä ja käytän vain kun on pakko (eli kun funktio voi palauttaa nollan ja falsen). PHP:ssä kun ei muuttujia muutenkaan tyypitetä, niin tuo vain sekoittaa koodia. Periaatteessa pitäisi aina ennen vertailua tarkastaa onko muuttuja sen tyyppinen kun halutaan. Ja se on kääntäjän/tulkin hommia imo.
Kyllä miusta vaan on selkeämpi lukea vertailuja, joissa vertaillaan tarkasti. Esim.
<?php if ( $stats ) ?>
Tuon toimintaa olisi paljon helpompi seurata, jos tuossakin käytettäisiin tarkkaa vertailua - seuraava kehittäjä näkisi heti, että mitä $stats mahdollisesti sisältää. Ärsyttävä lähteä muokkaamaan noita kun saat etsiä $stats-muuttujan määrittelyä sen tuhannesta tiedostosta. Dokumentointi tietysti auttaa, mutta self-documenting code on pop. Toisekseen, tarkalla vertailulla ei pääse tapahtumaan sellaisia kämmejä, että joku ehto vääntyykin vahingossa halutusta päinvastaiseksi, esim.
<?php $username = "0"; // tutkitaan, onko username asetettu if ( $username ) # Eipä päästäkään tänne ?>
Joidenkin funktioiden kanssahan pitääkin juuri tämän takia muistaa käyttää vahvaa vertailua (array_search
yms.) (tämä toki mainittiinkin yllä). Ja sitten, kun tiedetään, mitä tyyppiä muuttuja on, käytetään heikosti vertaillessa turhaa aikaa sellaisten vaihtoehtojen, joiden tiedetään olevan epätosia, tutkimiseen. Enkä toki unohda mainita, että tarkka vertailu on myös nopeampi :).
Myönnettäköön todeksi nuo argumenttisi. Nopeudesta täytyy kyllä sanoa sen verran, että kuinkakohan monta miljoonaa vartailua täytyy koodissa tehdä, että tuolla vahvalla vertailulla saavutetaan ero, joka voidaan saada aikaan jättämättä yksi tietokantahaku väliin :)
Valitettavaa myöntää, että kun itse väännän php-koodia, en tee sitä tuntityönä, vaan urakkana. Tällöin en kuluta aikaa "turhuuksiin" vaan teen asiat suoraviivaisesti. Jos taas koodaan tuntiliksalla PHP:tä, se on useimmiten jo valmiin softan puukottamista, ja kaikki tähän asti vastaan tulleet softat on kyllä kaikkea muuta kuin "täydellistä" koodia.
Nyt toimii kun lisäsin == :). Tällä tulee toimeen aluksi. Kiitos.
Aihe on jo aika vanha, joten et voi enää vastata siihen.