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.