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ää?
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.
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);
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 :)
Se on hidas, ja useimmiten täysin turha.
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?
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.
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.
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.
Aihe on jo aika vanha, joten et voi enää vastata siihen.