Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Ongelmana PHP:lla tiedon tarkistaminen tiedostosta

Sivun loppuun

kekke [21.11.2010 16:28:27]

#

Ongelma olisi se, että pitäisi saada tiedostosta tarkistettua löytyykö haettu kuva ko. tiedostosta.

Esimerkiksi in_array funktiota hyödyntäen:

<?php
$tiedosto=array(eka,toka,kolmas);

if (in_array("eka", $tiedosto)) {
    echo "Löytyi";
}
else{
echo "Ei löytynyt";
}
?>

En kuitenkaa saa tuota sovitettua tiedoston lukuun useista yrityksistä huolimatta:

<?php

$tiedosto = file("tiedosto.txt");



foreach ($tiedosto as $rivi => $arvo)
{
$tieto = explode("|", $arvo);

$nimi = $tieto[0];

$kuva = $tieto[1];

}


?>

Tiedoston sisältö olisi:
Keijo|keijo.jpg
Teuvo|teuvo.jpg
Jorma|jorma.jpg

Hyviä vinkkejä otetaan kiitollisuudella vastaan.

LaNu [21.11.2010 17:06:15]

#

Laita se yritelmäsi kokonaisuudessaan ihmeteltäväksi. Tuosta ei vielä selviä, mitä teet väärin.

Kuitenkin pari juttua:
- in_array ei etsi avainta vaan arvoa. Katso php.netin see also kohta ;-)
- jos kutsut file-funktiota noin, koodisi kuva-muuttujaan tulee rivinvaihto. sama tässä, apu löytyy php.netin dokkarista.

kekke [21.11.2010 20:05:08]

#

Kiitos LaNu vastauksestasi!

Loppukäyttökohde liittyy kuvatiedoston poistamiseen, sitä en ole vielä toteuttanut niin ei ole valmista esimerkkiä.

Eli tarkistetaan löytyykö tiedosto.txt:stä poistettavan kuvatiedoston nimi ja jos löytyy niin poistaminen estetään.

Tuon poistohomman tekeminen onnistuu muuten, mutta ongelmana on tuo tarkistaminen, että löytyykö kuvatiedoston nimi tiedosto.txt:stä.

Tiedosto.txt:n sisältö on tähän tyyliin:

Keijo|keijo.jpg
Teuvo|teuvo.jpg
Jorma|jorma.jpg


Tuossa yksi vaihtoehto mitä yritin, jossa tarkistetaan löytyykö tiedostosta teuvo.jpg:

<?php

$tiedosto = file("tiedosto.txt");

foreach ($tiedosto as $rivi => $arvo)
{

$tieto = explode("|", $arvo);

$nimi = $tieto[0];
$kuva = $tieto[1];

if (in_array("teuvo.jpg", $kuva)) {
    echo "Kuva löytyi";
}
else{
echo "Kuvaa ei löytynyt";
}

}

?>

eq [21.11.2010 20:34:30]

#

Mietittävää: onko $kuva taulukko? Voiko in_array-funktiota käyttää merkkijonojen vertailuun? Tarvitseeko merkkijonojen vertailuun funktiota?

Mitä PHP sanoo ohjelmaa suorittaessa, jos varoitukset on kytketty päälle? Oletko ajanut sitä?

Teuro [21.11.2010 20:45:50]

#

Tuon koodin kun ajaa, niin saan seuraavat virheilmoitukset:

Warning: in_array(): Wrong datatype for second argument in C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\kekke.php on line 13 Kuvaa ei löytynyt

Warning: in_array(): Wrong datatype for second argument in C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\kekke.php on line 13 Kuvaa ei löytynyt

Warning: in_array(): Wrong datatype for second argument in C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\kekke.php on line 13 Kuvaa ei löytynyt

Eli koodi kieppaa kolme kierrosta silmukassa. Tästä voimme todeta, että tiedosto saadaan luettua oikein. Manuaalista voimme lukea in_array(mixed $needle, array $haystack)-funktion haluavan etsittävän arvon ja taulukon, josta arvoa etsitään.

Koodista selviää helpolla, että toinen parametri ei suinkaan ole taulukko, vaan se on merkkijono. Muutetaan koodia poistamalla in_array-funktio ja korvaamalla se '===' operaattorilla.

Nyt koodi tulostaa 3-kertaa kuvaa ei löytynyt. Tämähän ei ole tarkoitus, vaan tarkoitus on tulostaa vain yksi lause. Poistetaan else haara silmukasta ja luodaan muuttuja $kuva_ok = false koodin alkuun. jos haluttu arvo löytyy tiedostosta, niin asetetaan $kuva_ok muuttuna true:ksi, muutoin sen annetaan olla false.

Lopuksi tehdään if-else haara $kuva_ok muuttujan mukaan tehdään tulostukset. Nyt kun ajetaan seuraava koodi, niin tulostuksien määrä on yksi, mutta tulostus itsessään on väärin. Korjaus jätetään harjoitukseksi.

<?php

$tiedosto = file("tiedosto.txt");

$kuva_ok = false;

foreach ($tiedosto as $rivi => $arvo) {
	$tieto = explode("|", $arvo);
	$nimi = $tieto[0];
	$kuva = $tieto[1];

	if ("teuvo.jpg" === $kuva) {
		$kuva_ok = true;
	}
}

if ($kuva_ok){
	echo "Kuva löytyy!";
} else {
	echo "Kuvaa ei löydy!";
}

?>

Teuro [22.11.2010 09:31:14]

#

Käytännössä silmukka kannattaa lopettaa heti, kun oikea arvo löytyy. Tällä tavalla suoritus nopeutuu hieman varsinkin jos arvo on heti tiedoston alkupuolella. Tällaisissa kolmen rivin tiedostossa ero on tietenkin aivan mitätön, mutta useamman tuhannen rivin tiedostossa ero voi olla melkoinen. Tosin tällöin jopa tietokanta voisi olla hyvä valinta.

Metabolix [22.11.2010 13:14:32]

#

Koodissa on toinenkin virhe: file-funktion palauttamassa taulukossa ovat mukana rivinvaihtomerkit ("\n"), jolloin rivin viimeinen solu ei ole "teuvo.jpg" vaan "teuvo.jpg\n". Ongelma ratkeaa parametrilla FILE_IGNORE_NEW_LINES:

$tiedosto = file('tiedosto.txt', FILE_IGNORE_NEW_LINES);

Teuro [22.11.2010 13:20:16]

#

Jep tähän viittasinkin jo tuossa tovi sitten, mutta hyvä se on silti sanoa ääneen.

kekke [22.11.2010 13:28:40]

#

Kiitos kaikille vastauksista!

Ideasta sain hyvin kiinni Teuron loistavasta selvityksestä, kiitos siitä Teuro!

Kiitos Metabolix tuosta: FILE_IGNORE_NEW_LINES olikin uusi juttu!


Sivun alkuun

Vastaus

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

Tietoa sivustosta