Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Palautteen poisto scripti

Sivun loppuun

Cc [04.12.2005 14:54:38]

#

Olen tehnyt omille sivuille palaute boxin
ja olen tehnyt siitä saman tapaisen kun hotmailissa,
että kaikki palautteet jotka on ruksattu niin
poistetaan, mutta minun palautteen poisto scripti
ei vaan toimi (ylläri) checkboxit on nimetty a1, a2
jne...

Oma scriptini:

if ($_GET['id'] == "poista") {
$filu = file("admin/palaute.txt");
$a = "a0";

for ($i = 0; $i < count($filu);) {
if ($a == "yes")
echo 'Poistetaan.';
$a++;
}
}
?>

mutta tuo ei tulosta tuota "Poistetaan." niin
siinä on jotain häikkää. apuja?

Lebe80 [04.12.2005 15:15:43]

#

johtuiskohan siitä että

$a = "a0";
...
if ($a == "yes")
...
$a++;

Yritä keksiä parempia muuttujien nimiä, joten sinulla ei tulisi sekaannuksia. Eli alussa määrittelet $a:n arvoksi "a0" ja sitten ihmettelet milloin se saa arvokseen "yes" vaikka joka kerran lisäät $a:n arvoon +1.... Voi olla että jollain ohjelmointikielellä tämmöinen onnistuu... Mutten kyllä ole koskaan semmoista nähnyt.

Eli ensimmäiseksi sinun pitää tarkastaa jokaisen checkboxin arvo loopissa.
Tämä tarkoittaa siis sitä, että otat arvon talteen johonkin muuttujaan.

for ($i = 0; $i < count($filu);$i++){
  $checkbox = $_POST["a"+$i];
  if ($checkbox == "tarvittava_arvo" ){
    poista_tämä_valinta();
  }
}

Cc [04.12.2005 15:52:12]

#

hmm en kyllä saa toimimaan tuota sinun esimerkkiä (se on kyllä
paljon viisaammin toteutettu verrattuna omaani :D)

Olen käyttännyt tälläistä tapaa nimitetä muuttujat:

foreach ($file as $i => $value) {

$palaute = explode("|", $value);

$filu = file("admin/palaute.txt");
$mont2 = count($filu);
$yht = $mont2 - $i - 1;
echo '<input type="checkbox" name="a" value="yes" /><a>
<img src="' . $kuva . '" alt="' . $alt . '" />
<a href="katsopalaute.php?id=' . $yht . '" title="' . $palaute[1] .'">' . $palaute[0] . '</a>
' . $palaute[2] . ' ' . $palaute[4] . '<br /></a>';
$i++;
}

tsuriga [04.12.2005 17:49:30]

#

<?php

for($i=0; $i<$montaniitcheckboxejon; $i++) {
  if ($_GET['a'.$i] == "yes")
    poista($i);
  }

?>

Siitäpä sitten. Tuossa oletetaan checkboxien olevan nimetty a0,a1,a2 etc.

ipe [04.12.2005 17:57:50]

#

<?php
if ($_GET['id'] == "poista") {
$filu = file("admin/palaute.txt");
$a = "a0";

for ($i = 0; $i < count($filu);) {
if (trim($a) == "yes")
echo 'Poistetaan.';
$a++;
}
}
?>

Joskus voi väliin livahtaa välilyönti ja silloin vertailu ei toimi. Trim functio avuksi..

Cc [04.12.2005 18:11:22]

#

Kiitos tsuriga sain tuon koodin avulla toimimaan melkein kokonaan tämän jutun mutta vielä on yksi pieni ongelma mitä en osaa ratkaista... tässä se tulee:
Miten saan sitten sieltä teksti tiedostosta poistettua kaikki ne palaute rivit joiden edestä oli ruksattu se checkbox?

tsuriga [04.12.2005 21:21:46]

#

ipe: Huh? $i++ puuttuu, trim($a) ei hyödytä mitään etc. En oikein käsitä edes mitä tuolla on haettu.

Cc: Ei tuo nyt niinkään pieni ongelma ole, tuo kokonaisuus on suurempi kuin itse checkboxien tutkiminen. Nnnoh esimerkiksi näin:

uusidata = ''; // tähän muuttujaan kirjoitetaan uuden tiedoston data

loop_checkboxes {
  if (!checkbox_says "yes") // huom ! eli negaatio
    uusidata.=tiedostonrivi(i).rivinvaihto
  }

kirjoitaTiedostoon(tiedosto, uusidata)

Eli periaatteena tuossa on lisätä muuttujaan ne tiedoston rivit, joiden kohdalla checkboxia ei oltu ruksattu, ja loopin jälkeen kirjoittaa k.o. muuttujan sisältö takaisin tiedostoon.

Näitä tietysti voisi aina itsekin hieman pohtia eikä kysyä lähes suoralta kädeltä.

Niko [05.12.2005 00:14:45]

#

Cc kirjoitti:

hmm en kyllä saa toimimaan tuota sinun esimerkkiä (se on kyllä
paljon viisaammin toteutettu verrattuna omaani :D)

Olen käyttännyt tälläistä tapaa nimitetä muuttujat:

foreach ($file as $i => $value) {

$palaute = explode("|", $value);

$filu = file("admin/palaute.txt");
$mont2 = count($filu);
$yht = $mont2 - $i - 1;
echo '<input type="checkbox" name="a" value="yes" /><a>
<img src="' . $kuva . '" alt="' . $alt . '" />
<a href="katsopalaute.php?id=' . $yht . '" title="' . $palaute[1] .'">' . $palaute[0] . '</a>
' . $palaute[2] . ' ' . $palaute[4] . '
</a>';
$i++;
}

Kannattaa käyttää echossa pilkkua niin saat nopeemmin ;)

echo 'J','o','h','a','n',' ','o','n',' ','n','o','p','e','a';

echo 'J'.'o'.'h'.'a'.'n'.' '.'o'.'n'.' '.'n'.'o'.'p'.'e'.'a';

ajattele jollain 100 tuhalla rivillä voit säästää jopa 0.1 s tai jotain sinne päin :)

Cc [05.12.2005 00:43:56]

#

Olen saannut melkein toimimaan tämän poistamisenkin enään ongelmana on se että tämä poistaa kaikki rivit :D
mitä tässä pitäisi muuttaa että se poistaa vain ne palauterivi
joiden edestä on ruksattu se checkbox?

<?php
if ($_GET['id'] == "poista") {
$filu = file("admin/palaute.txt");

for($i=0; $i< count($filu); $i++) {

if ($_POST['a'.$i] == "yes") {
$f=file("admin/palaute.txt");
$d=fopen("admin/palaute.txt", "w");
$f[$i]="";

foreach ($f as $r) {
fwrite($d, $f[$r]);
}

fclose($d);
echo '<h2>Raportti</h2>';
echo "<p>Palaute on poistettu. <br />Takaisin <a href='kokeilu.php'> palaute</a> sivulle.</p>";
die();
}
}
}
?>

Juice [05.12.2005 01:38:55]

#

Niko kirjoitti:

Kannattaa käyttää echossa pilkkua niin saat nopeemmin ;)
ajattele jollain 100 tuhalla rivillä voit säästää jopa 0.1 s tai jotain sinne päin :)

Piti sitten ajankuluksi tämäkin asia tutkia, ja 100 000 rivillä pilkku oli keskimäärin 0.05044 sekuntia nopeampi kuin piste, eli noin 5/100 sekuntia. Mitä ajantuhlausta ;)

tsuriga [05.12.2005 01:51:08]

#

Juice kirjoitti:

Niko kirjoitti:

Kannattaa käyttää echossa pilkkua niin saat nopeemmin ;)
ajattele jollain 100 tuhalla rivillä voit säästää jopa 0.1 s tai jotain sinne päin :)

Piti sitten ajankuluksi tämäkin asia tutkia..

Näin tein minäkin, amd athlon64 3200+ pyöräytti tuhannella kierroksella testistringiä 'str'.'str'.'str'.'str'.'str'.'str'.'str'.'str'.'str'.'str'.'str' (ja sama pilkuilla) noin tuhannesosan nopeammin pilkuilla toteutettuna. Ja eikun optimoimaan kaikki entiset koodit!

Cc:
Silmä käteen ja järki päähän, looppaat loopissa ja avaat tiedoston aina uusiksi kun löytyy yes-osastoa. Aika paljon siitä pitää muuttaa. Periaate:
-lue tiedosto
-looppaa checkboxit
-kirjoita ne rivit, joiden kohdalla checkboxia ei ole ruksattu, MUUTTUJAAN
-LOOPIN JÄLKEEN, kirjoita uuden datan sisältävä muuttujan sisältö sinne tiedostoon

Lebe80 [05.12.2005 10:35:52]

#

Cc kirjoitti:

Olen saannut melkein toimimaan tämän poistamisenkin enään ongelmana on se että tämä poistaa kaikki rivit :D
mitä tässä pitäisi muuttaa että se poistaa vain ne palauterivi
joiden edestä on ruksattu se checkbox?

Ainakin näytät availevan tiedostoa keskellä looppia, mikä varmaankin siirtää osoittimen tiedoston alkuun ja "tuhoaa" tiedoston,

Cc [05.12.2005 15:37:18]

#

Auttakaa minuu vielä vähäsen olen vielä jonkin verran aloittelija tässä php hässäkässä olen tämän verran osannut tehdä.

<?php
if ($_GET['id'] == "poista") {
$montasaastetaan = 0;
$f = file("admin/palaute.txt");
$d = fopen("admin/palaute.txt", "w");
$filu = file("admin/palaute.txt");
for($i=0; $i< count($filu); $i++) {
if ($_POST['a'.$i] != "yes") {
$montasaastetaan++;
}
}
}
?>

eli en osaa kirjoittaa niitä rivejä jotka pitäisi säästää niin tonne muuttujaan :s

Lebe80 [05.12.2005 16:12:40]

#

yritäs nyt itse. Eli mieti mitä tuo sinun $f -muuttujasi tekee, ja mitä taas $filu. Onko toinen niistä turha?

Mieti näitä:
- Palauttaako mikään ruksi vielä "yes" -arvoa? Miten saat sen selville?
- Mitä "rivien" poistaminen oikeastaan edes tekee? (se ei poista mitään, vaan tarkoitus onkin tehdä uusi tiedosto, johon kirjotetaan kaikki muut rivit paitsi ne, jotka on merkitty poistettaviksi... Miten se onnistuisi helpoiten?)
- Voisiko tiedoston lukea kokonaan muistiin, jotta sen voisi sitten tuhota ja kirjoittaa uudelleen ilman "poistettuja" rivejä.
- Harjoittele tiedostoon kirjottamista aluksi muilla skripteillä, jottei "tärkeät" tiedot katoa ensimmäisestä virheestä.
- Tutki www.php.net-sivuston valmiita koodiesimerkkejä (fopen, file, fwrite, jne.).


Ohjelmoinnissa itseasiassa pelkillä funktioilla ei juurikaan tee mitään, pelkällä pseudo-koodilla pääsee jo pitkälle, jonka jälkeen voi tutkia mitä pseudo-koodin tilalle voi laittaa. Eli jos et osaa suunnitella miten koodisi toimii, on turha lähteä "koodaamaan" mitään.

Kirjota vaikka itsellesi aina "suunnitelma" tulevasta scriptistä.
esim.

Lue_tiedoston_rivit_muistiin($tiedosto);
for (kaydaan_kaikki_rivit_läpi){
  if ( poistetaan_rivi? ){
    // ei kirjoiteta "puskuriin";
  }else{
    kirjoita_puskuriin;
  }
}
poista_tiedosto($tiedosto);
tallenna_puskuri($tiedosto);

Cc [06.12.2005 18:52:17]

#

Kiitos avusta sain tehtyä tämän valmiiksi kysyisin vielä että onko mitään viisaampaa keinoa (luulen että on) toteuttaa tämä scripti kuin tämä.

<?php
if ($_GET['id'] == "poista") {
$filu = file("admin/palaute.txt");
$d = fopen("admin/palaute.txt", "a");
$z = fopen("admin/palaute.txt", "w");
fwrite($z, "");
for($i=0; $i< count($filu); $i++) {
if ($_POST['a'.$i] != "yes") {
$saastettava = $filu[$i];
fwrite($d, $saastettava);
}
}
}
?>

vai olenko onnistunnut tekemään hyvää koodia (epäilen =))?

tsuriga [06.12.2005 19:38:46]

#

Koska tuo nyt kerran toimii niin annan paremman vastaavan koodin:

<?php
// ei tarvita iffejä, jos käytettäisiin erillistä poistosivua
# poista.php #

$filu = array(); // tiedoston rivit
$filun_uusi_sisalto = ''; // tiedoston uusi sisältö (puskuri)
$fh = null; // tiedostokahva-resurssi (filehandle)

// luetaan tiedoston rivit taulukkoon
$filu = file("admin/palaute.txt");

// loopataan checkboxit läpi (joita on saman verran kuin tiedostossa rivejä)
for ($i=0; $i<count($filu); $i++) {

// tarkistetaan, onko POST-taulukossa indeksiä 'a'.$i
// ja katsotaan, onko käyttäjä ruksannut rivin $i poistettavaksi
  if (isset($_POST['a'.$i]) AND $_POST['a'.$i] != "yes")
    $filun_uusi_sisalto .= $filu[$i]; // riviä ei poisteta, eli se kirjoitetaan puskuriin
  } // for loppuu

// jos tiedoston avaus kirjoitettavaksi onnistuu
if (($fh = fopen("admin/palaute.txt", "w+")) !== false) {
  fwrite($fh, $filun_uusi_sisalto); // kirjoitetaan tiedostoon sen uusi sisältö
  fclose($fh);
  }

?>

Tuosta puuttuu vielä virheiden kiinniotot, jos vaikka fopen tai fwrite ei onnistukaan.

Tuosta koko tiedoston puskuriin kirjoittamisesta en ole aivan varma, onko se järkevää tehdä noin vai kannattaako tiedostoon kirjoittaa rivi kerrallaan. Ehkäpä rivi kerrallaan, ja useammalla yrityksellä, jos jokin kirjoituskerta sattuu epäonnistumaan. Eli jos palaute.txt-tiedosto paisuu yli PHP:n maksimimuistin, saattaa tulla ongelmia kun yritetään pitää koko tiedoston sisältöä yhdessä muuttujassa. Silloin tosin taitaa jo file-funktiolla tulla ongelmia, siihen sitten paikalle fopenia r-tilassa. Paitsi tuskin palautefilusi paisuu monien megatavujen kokoiseksi.

Cc [06.12.2005 20:32:32]

#

tuskin tuo palaute .txt tulee montaa megatavua isoksi koska se on pelkkää tekstiä joten sitä saisi olla aika monta riviä =) juu kyllä tuo sinun koodisi tsuriga näyttää paljon fiksummalta :D


Sivun alkuun

Vastaus

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

Tietoa sivustosta