Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Vieraskirjassa viestiin vastaaminen

Sivun loppuun

Jorgga [01.06.2006 12:25:54]

#

Olen tehnyt vieraskirjan tässä lähipäivien aikana.
Ajattelin että Adminpaneli helpottaisi viestien poistoa ja vastaamista olen saanut jonkinlaisen virityksen aikaan mutta se ei näytä toimivan.
Adminpaneeli:

<?php
$viestit = file("viestit.txt");
$viestit = array_reverse($viestit);
$viestimaara = count($viestit);
echo "Yhteensä: <b>" . $viestimaara . "</b> viestiä.<p>";
for ($i = 0; $i < $viestimaara; $i++) {
$tiedot = explode("|", $viestit[$i], 5);
$nimi = $tiedot[0]; $email = $tiedot[1]; $aika = $tiedot[2]; $viesti = $tiedot [3]; $vastaus = $tiedot[4];
echo "<font color=\"#8C7853\">Lähettäjä:</font> <a href=\"mailto:$email\">$nimi</a><br>";
echo "<font color=\"#8C7853\">Aika:</font> $aika<br>";
echo "<font color=\"#8C7853\">Viesti:</font><br>$viesti<br>";
if ($vastaus == "") {
echo "<font color=\"#8C7853\">Vastaus:</font><br> Ylläpito ei ole vastannut vielä.";
} else{
echo "<font color=\"#8C7853\">Vaataus:</font><br>$vastaus";
}
echo "<br><FORM ACTION=\"vastaa.php\" METHOD=\"GET\">";
echo "<input type=hidden name=\"rivi\" value=\"$luku\">";
$luku++;
echo "Vastaus: <INPUT TYPE=\"text\" NAME=\"vastaus\" SIZE=\"30\" MAXLENGTH=\"255\">";
echo "<INPUT TYPE=submit value=\"Vastaa\"><br>";
echo "<hr>";
}
?>

Vastaa.php:

<?php
$vastaus = $_GET["vastaus"];
$rivi = $_GET["rivi"];
$vastaus = htmlspecialchars($vastaus);
$viestit = file("viestit.txt");
$viestit = array_reverse($viestit);
$rivit = file("viestit.txt");
$rivit = trim($rivit);
$rivit[$rivi] = $rivit[$rivi] . "|" . $vastaus; // 4. rivi muutetaan
// Ja tiedostoon
$tt = fopen("viestit.txt", "w");
for ($i=0; $i<count($rivit); $i++)
 fwrite($tt, $rivit[$i]."\n");
fclose($tt);
?>

Mikä mättää?

Antti Laaksonen [01.06.2006 12:50:37]

#

Yksi virhe on ainakin rivillä:

$rivit = trim($rivit);

Rivejä ei voi lyhentää näin, vaikka se loogista olisikin. Tarvitaan esim. funktiota array_map:

$rivit = array_map("trim", $rivit);

Tämä kohdistaa tietyn funktion jokaiseen taulukon alkioon.

Muuttuja $luku on muuten turha, sen arvo on aina sama kuin $i:n.

T.M. [01.06.2006 13:46:35]

#

Eih, älkää käyttäkö array_map funktiota.
Silmukkaan se trim, jos sitä tarvitsee.

Edit:

$rivit[$rivi] = $rivit[$rivi] . "|" . $vastaus; // 4. rivi muutetaan

Oletko ajatellut että jos muokkaat kaksi kertaa samaa viestiä, tulee siihen uusi vastaus toisen perään?

Näin se tehdään:

$osa = explode("|", $rivit[$rivi]);
$osa[4] = $vastaus;
$rivit[$rivi] = implode("|", $osa);

Blaze [01.06.2006 14:02:50]

#

T.M. kirjoitti:

Eih, älkää käyttäkö array_map funktiota.

Haluatko kertoa, miksei?
Näin ko. funktion nyt ensimmäistä kertaa, sen unohtaminen onnistuu vielä kohtuullisen helposti :)

T.M. [01.06.2006 14:18:48]

#

Se on hidas, ja useimmiten täysin turha.

Olga [01.06.2006 14:30:02]

#

Tässä tapauksessa se on kyllä turha, mutta onko nopeampaa tehdä silmukassa kaikille taulukon alkioille sama operaatio kuin käyttää array_map-funktiota? Mitä tarkoittaa hidas?

Antti Laaksonen [01.06.2006 16:04:23]

#

Minusta array_map on aika kätevä tässä, kun koko muutoksen saa yhdelle riville. Jälleen kerran skriptin toimintaan ei vaikuta mitenkään, kumpaa käyttää, array_map-funktiota vai for-silmukkaa. Kumpikin tapa on nimittäin salamannopea.

Olga [01.06.2006 17:00:31]

#

Sitähän minäkin, on täysin yhdentekevää kestääkö skriptin suoritus 0.03 sekuntia vai 0.05 sekuntia. Ehkäpä T.M. jälleen kerran selvittää meille miksi array_map-funktiota ei tule käyttää ja miksi se on täysin turha.

T.M. [01.06.2006 20:37:55]

#

No nyt tein testejä, ja selvisi että array_map() funktio onkin vain 5% hitaampi kuin silmukassa suoritettu funktiokutsu, jos kutsuttava funktio on PHP:n oma funktio.
Kun taas oman funktion kutsuminen array_map() funktiolla aiheuttaa 62% hitaampaa koodia.
Taisi nuo huonot muistot tulla tuosta oman funktion kutsumisesta.

Mutta siltikään en suosittele array_map() funktion käyttöä... varsinkaan aloittelijoille, koska se saattaa johtaa siihen että ei osaa enää ajatella miten asiat voidaan tehdä ilman jokaista erinäistä array_map() funktiokutsua.

Ja miksi se on täysin turha funktio: kaiken voi tehdä ilman sitäkin, eikä array_map() nopeuta yhtään.
Ehkä joissain tapauksissa se voi olla kätevä, jos käsittelee todella pieniä tietomääriä, ja haluaa tehdä koodista selvempää.

Edit:
Testasin lisää, ja näyttää siltä että suurilla tietomäärillä array_map() funktion kutsu PHP:n omilla funktiolla on jopa 50% hitaampaa kuin silmukan sisällä tehtävä funktiokutsu.


Sivun alkuun

Vastaus

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

Tietoa sivustosta