Nyt probleemana seuraavanalinen hassuttelu. Eli käyttäjä kirjoittaa luvun input laatikkoon ja seuraava sivu luo input laatikoita halutun määrän. Seuraavaksi tahtoisin, että ohjelma luo tiedostot input laatikoiden nimen perusteella, mutta lopputuloksena on se, että ohjelma luo vain viimeisen input laatikon nimen perusteella yhden tiedoston. Ohessa koodit:
1.php
<form action="2.php" method="get"> Määrä: <input type="text" name="maara" /> <input type="submit" /> </form>
2.php
<form action="3.php" method="get"> <?php $luku = $_GET["maara"]; $tuloste = 0; while ($tuloste < $luku) { echo "<br><input name=SIVU>Tekstitiedoston nimi</input></ br>"; $tuloste += "1"; } ?><br><br> <input type="submit" /> </form>
3.php
<?php $sivut = $_GET["SIVU"]; $luonti = fopen($sivut.".txt", "a+"); $as = 0; while ($as < $luku); { echo "$luonti"; $as =+ 1; } ?>
Olen myös miettinyt, että kannattaisiko tulostaa 2.php:n nimet tekstitiedostoon josta 3.php lukea ne yksitellen ja luoda tiedostot niiden mukaan.
Ongelmia näyttäisivät olevan ainakin nämä:
Ensiksi, tiedostossa 2.php tulostetaan tekstilaatikkoja, joille kaikille annetaan nimeksi "NIMI". Se ei oikein tunnu toimivalta, kun vain viimeisen tekstilaatikon sisältö voidaan tällöin hakea GET-metodilla.
Toiseksi ongelmaksi huomasin sen että tiedostossa 3.php luodaan vain yksi tekstitiedosto, eikä while-silmukasta ole oikeastaan hyötyä.
Sitten olisi vielä se että tiedostossa 3.php haetaan vain yksi tieto GET-metodilla.
Aloita vaikka siitä että tiedostossa 3.php on muuttuja $luonti jota ei käytetä mihinkään , ja muuttuja $luku jota ei ole alustettu missään.
<?php $luku = 3; $as = 0; while ($as < $luku) { $sivut = $_GET["SIVU"."$as"]; fopen($sivut.'.txt', 'a+'); $as += "1"; } echo "$luku"; ?>
Sain toimimaan tuolla tavalla, mutta nyt vain tuon luvun pitäisi saada vaihdettua. Millä keinolla kannattaisi lähteä poimimaan osoiterivin viimeistä ja suurinta numeroa?
Vastaan nyt vain kysymykseesi ottamatta kantaa siihen, miten huonosti ja väärin olet koko hommaa tekemässä.
preg_match_all("/\\d+/", $_SERVER["REQUEST_URI"], $osumat); $luvut = array_map("intval", $osumat[0]); $viimeinen = end($luvut); $suurin = max($luvut);
ota kantaa vain :)
Tee mielummin javascriptillä, 100x helpompaa nopeampaa ja säästää bandwidthia. Esimerkiks:
<form method="POST" id="jee" action="joku.php" onsubmit="validate.call( this );"> Tiedoston 1 nimi:<input type="text" name="filu1" /><br /> <input type="submit" name="submitti" value="luo tiedostot" /> <input type="button" value="lisää tiedosto" onclick="moarfiles.call( this.form )" /> </form>
var filecount = 1; function moarfiles(){ filecount++; var filu = document.createElement( "input" ), texti = document.createTextNode( "Tiedoston " + filecount + " nimi:" ), br = document.createElement( "br" ), uusi = document.createDocumentFragment(); filu.setAttribute( "name", "filu"+filecount ); filu.setAttribute( "type", "text" ); uusi.appendChild( texti ); uusi.appendChild( filu ); uusi.appendChild( br ); this.submitti.parentNode.insertBefore( uusi, this.submitti ); }
esajeejee: thänksit javascript ideasta. tesmailen tuon toimivuutta. minulla on silti edelleen ongelmana tuon <input määrien lähettäminen seuraavaan php tiedostoon, jossa ajattelin luoda silmukan joka loisi nuo filet.
somero kirjoitti:
esajeejee: thänksit javascript ideasta. tesmailen tuon toimivuutta. minulla on silti edelleen ongelmana tuon <input määrien lähettäminen seuraavaan php tiedostoon, jossa ajattelin luoda silmukan joka loisi nuo filet.
Ihan normaalisti käytät get/post-muuttujia kuten kaikkien muidenkin formin tietojen kanssa. HTML:ssä on sitä varten hidden-tyyppinen inputti.
somero kirjoitti:
esajeejee: thänksit javascript ideasta. tesmailen tuon toimivuutta. minulla on silti edelleen ongelmana tuon <input määrien lähettäminen seuraavaan php tiedostoon, jossa ajattelin luoda silmukan joka loisi nuo filet.
Jos käytät tuota javascript formia niin ne tulee POST parametreissa näin
filu1=jeejee.txt&filu2=auto.txt&filu3=jsss.txt .... &filuN=asda.txt
niin paljon ku tiedostoja tuli
function validFileName( $str ) { return true; //Hyväksyy kaikki tiedostonimet } if ( $_POST['filu1'] ) { $c = 1; $m = 0; $output = ""; foreach ( $_POST as $key => $val ) { if( stripos ( $key, "filu" ) === false ) { continue; } if ( validFileName( $_POST[ 'filu'.$c ] ) ) { // Luontikoodia tähän; $output .= "Luotiin tiedosto nimellä $val\n"; $m++; } $c++; } $luonti = "Luotiin yhteensä "; $luonti .= $m == 1 ? "1 tiedosto:\n\n" : $m ." tiedostoa\n\n"; echo $luonti.$output; } else { exit(); //Tiedostonimiä ei löytynyt }
En jaksa ajaa tuota koodia joten saattaa olla syntaksivirheitä
Asiaa auttaisi, jos kertoisit kunnolla, mitä on tarkoitus saada tehtyä. Nykyisellään homma vaikuttaa siltä, ettei sitä luultavasti kannattaisi tehdä ollenkaan.
Sain duunattua homman toimimaan tässä päivän aikana. Metabolix on aina yhtä ihana kaikkia kohtaan ;)
EDIT: Thänksit kaikille vastanneille! Arvon marjapiirakan kaikkien kesken.
somero kirjoitti:
Metabolix on aina yhtä ihana kaikkia kohtaan ;)
Enkö olekin? :) Mutta ei kyseessä ollut nyt mikään piikki, vaan ihan oikeasti en keksi yhtään järkevää käyttötarkoitusta koodillesi tai ainakaan tuolle toteutustavalle.
Jos perimmäinen tavoite on luoda tyhjiä tiedostoja käyttäjän antamilla nimillä, eikö olisi helpointa joko syöttää jokainen nimi erikseen, lähettää lomake enteristä ja päästä automaattisesti takaisin lomakkeeseen tai kirjoittaa ne tiedostonimet yhteen textareaan omille riveilleen?
<?php // Jos lomake lähetettiin, luodaan tiedosto. if (!empty($_POST["nimi"])) { $html = htmlspecialchars($_POST["nimi"]); if (file_exists($_POST["nimi"])) { echo "<p>Tiedosto {$html} on jo olemassa!</p>"; } elseif (touch($_POST["nimi"])) { echo "<p>Luotiin {$html}.</p>"; } else { echo "<p>Virhe tiedoston {$html} luonnissa!</p>"; } } // Tulostetaan lomake. Lopussa valitaan JS:llä valmiiksi tekstilaatikko. ?> <form action="" method="post"> <p> Anna tiedostonimi: <input type="text" name="nimi" id="nimi" /> <button type="submit">Luo!</button> </p> </form> <script type="text/javascript"> document.getElementById("nimi").focus(); </script>
<?php // Poimitaan preg_matchilla tiedostonimet. if (preg_match_all('/^\\s*(\\S.*?)\\s*$/m', @$_POST["nimet"], $nimet)) { // Luodaan listatut tiedostot. foreach ($nimet[1] as $nimi) { $html = htmlspecialchars($nimi); if (file_exists($nimi)) { echo "<p>Tiedosto {$html} on jo olemassa!</p>"; } elseif (touch($nimi)) { echo "<p>Luotiin {$html}.</p>"; } else { echo "<p>Virhe tiedoston {$html} luonnissa!</p>"; } } } // Tulostetaan lomake. ?> <form action="" method="post"> <p>Kirjoita tiedostonimet seuraavaan laatikkoon eri riveille.</p> <p><textarea name="nimet" rows="10" cols="60"></textarea></p> <p><button type="submit">Luo!</button></p> </form>
Tein tällaisen testimielessä tutkiakseni millä tavalla php:ssä kannattaa tehdä tällainen aivoton räpellys :)
hei kaikki. jquery, ilman sivulatausta. ;)
//syota.html <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script> <table id="taulu"> <tr><td><input type="text" name="filut[]"></td></tr> </table> <p><img src="lisaarivinappi" id="uusirivi"></p> <p><img src="siistitallennanappi.png" id="nappi"></p> <script> $("#uusirivi").click(function() { $("#taulu").append("<tr><td><input type='text' id='filu' name='filut[]'></td></tr>"); }); $("#nappi").click(function() { var filunimi = $("#filut").val(); $.post("tallenna.php", { filut: filut }, function(data) { alert(data); }); }); </script> //tallenna.php <?php $filut = $_REQUEST[filut]; foreach($filut as $filu) { luofilu(tarkista_nimi($filu)); //esim.. } //Jotain palautetta vois syota.html:lle lähettää.. ?>
Ei ole testattu.. Mutta näyttää ihan toimivalta. ;)
Huom! tallenna.php:lle täytyy kertoa erikseen charsetti.
Käytäppä kooditageja niin olisi helpompi lukea koodiasi ja huomaisit itsekkin kirjoitusvirheet kuten fucntion (siis käytettäessä kooditagia joka tukee käyttämääsi kieltä syntaksin värityksellä). Lisäksi toisten nimimerkkien tahallinen väärinkirjoittaminen ei yleensä ole hauskaa...
Tässä sivuan nyt aika kaukaa keskustelua, mutta aloitan uuden topicin jos ei selvyyttä löydy:
Minun tulisi tehdä e-mail formi, jossa on noin 150 eri kysymystä ja ne lähetetään eteenpäin. Olisiko jotain valmista softaa jolla duunata nuo vai teenkö kaiken alusta alkaen itse?
Mizou kirjoitti:
Käytäppä kooditageja niin olisi helpompi lukea koodiasi ja huomaisit itsekkin kirjoitusvirheet kuten fucntion (siis käytettäessä kooditagia joka tukee käyttämääsi kieltä syntaksin värityksellä). Lisäksi toisten nimimerkkien tahallinen väärinkirjoittaminen ei yleensä ole hauskaa...
Sori. En osannut käyttää noita tageja. Mut aina oppii jotain uutta. :)
somero kirjoitti:
Tässä sivuan nyt aika kaukaa keskustelua, mutta aloitan uuden topicin jos ei selvyyttä löydy:
Minun tulisi tehdä e-mail formi, jossa on noin 150 eri kysymystä ja ne lähetetään eteenpäin. Olisiko jotain valmista softaa jolla duunata nuo vai teenkö kaiken alusta alkaen itse?
Eihän tuossa ole sinällään mitään ihmeellistä. Laitat kysymykset vaikka arrayhyn ja tulostat ne silmukalla.
Thänksit alchemist :)
<?php header('Content-Type: text/html; charset=utf-8'); //Kysymykset.. $kysymykset = array("Kuka olet?","Kuinka vanha olet?","Minkä väriset hiukset sulla on?"); //Postitus osa.. if(isset($_POST[tallenna])) { $vastausket = $_POST[kysymys]; foreach($vastausket as $id => $vastaus) { $tulos .= $kysymykset[$id].": ".addslashes(strip_tags($vastaus))."\n"; } $h = 'Content-type: text/html; charset=utf-8' . "\r\n"; if(@mail('vastaanottaja@domain.fi', 'Vastaus kyselyyn', $tulos, $h)) { print("<script>alert('Vastausket postitettu, kiitos osallistumisesta.');</script><a href='jonnekkin.php'>Takaisin</a>"); } else { print("<script>alert('Vastauksia ei voitu lähettää, yritä myöhemmin uudelleen.');</script>"); } } //Kysymys taulu.. else { print('<form action="" method="POST"><table>'); foreach($kysymykset as $kysymys) { print('<tr><td style="padding-right: 25px;">'.$kysymys.'</td><td><input value="" type="text" name="kysymys[]"></td></tr>'); } print('</table><p><input name="tallenna" type="submit" value="Lähetä vastaukset"></p></form>'); } ?>
Aihe on jo aika vanha, joten et voi enää vastata siihen.