Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Mikä vikana tässä PHP-skriptissä?

Sivun loppuun

GoldenDragon [24.05.2006 21:13:04]

#

Ongelmana on, että skripti ei päästä läpi lainkaan. Kertoo vain asettamani virhesanoman, että kentät ovat pakollisia...
Mitä skriptissä on väärin? Sen pitäisi päästää läpi, jos vaaditut kentät ovat täytetty.

Alla lomake ja skripti.

HTML-lomake:

<form action="suorittaja.php" method="POST" enctype="application/x-www-form-urlencoded">
		<p>Nimesi:</p>
	<input type="text" name="nimi" title="Nimi" />
	<p>S&auml;hk&ouml;postisi:</p>
	<input type="text" name="sposti" title="Sähköposti" />
	<p>Kotisivusi:</p>
	<input type="text" name="kotisivu" title="Kotisivu" />

	<p>Viesti:</p>
	<textarea name="viesti" value="Viesti" title="Viesti"></textarea>
	<input type="submit" title="L&auml;het&auml;" />
</form>

PHP-skripti:

<?php
	if((!$nimi) || ($sposti) || ($viesti)){
	  $error = "<p><strong>Nimi, sähköposti ja viesti ovat pakollisia!</strong></p>";
	  $linkki = "<a href=\"http://osoite.takaisin.com/\">Takaisin</a>";
	  $display = $error."<br />".$linkki;
	}
	else{
	$nimi = $_POST['nimi'];
	$sposti = $_POST['sposti'];
	$kotisivu = $_POST['kotisivu'];
	$viesti = $_POST['viesti'];
	  $file = "tallennus.html";
	  while(file_exists($file)){
	    $write = fopen($file, "a");
	    fwrite($write, "<table border=\"0\">");
	    fwrite($write, "<tr><th>Hakemus</th></tr>");
	    fwrite($write, "<tr><td>".$nimi."</td></tr>");
	    fwrite($write, "<tr><td>".$sposti."</td></tr>");
	    fwrite($write, "<tr><td>".$kotisivu."</td></tr>");
		fwrite($write, "<tr><td>".$viesti."</td></tr>");
	    fwrite($write, "</table>");
	    fclose($write);
	    if($write == TRUE){
	    	foreach($_POST as  $text){
				mail("mail@mail.com","Uusi Hakemus!","Uusi hakemus tullut!");
				/*header("Location: http://osoite.takaisin.com/");*/
				$display = "<p><strong>Hakemuksen lähetys onnistui! <a href=\"http://osoite.takaisin.com\">Palaa tästä takaisin</a>.</strong></p>";
			}
		}
	  }
	}
echo $display;
?>

Extreme [24.05.2006 22:15:48]

#

Kokeileppas:

if($nimi=="" || $posti=="" || $viesti==""){
$errors=1;

$error.="Et täyttänyt vaadittavia kenttiä";
if($errors==1) echo $error;
}

else {

GoldenDragon [24.05.2006 22:20:06]

#

Not working.....

Extreme [24.05.2006 22:22:35]

#

Bandido89 kirjoitti:

Not working.....

antaako saman herjan?
*Pikkusen korjasin ensimmäistä viestiä*

kayttaja-2791 [24.05.2006 22:28:05]

#

Et ole asettanut muuttujia ennen tarkistusta, eli siirrä esittelyt:

$nimi = $_POST['nimi'];
$sposti = $_POST['sposti'];
$kotisivu = $_POST['kotisivu'];
$viesti = $_POST['viesti'];

ihan skriptin alkuun niin tarkistuksetkin toimivat (tosin omassa koodissasi ehdot näyttäisivät olevan hieman väärin, Extremellä näyttäisi olevan tarkistusehdot jo toiminnaltaan oikein).

GoldenDragon [24.05.2006 23:11:09]

#

Sillä ei monesti ole merkitystä, että mihin ne laittaa, kun PHP-prosessori lukee tiedoston kertaalleen läpi ennen suorittamista. Ja tuo on melko varmaa tietoa. Ei toimi edelleenkään : /

Lisäys: Ja kummempaa on, että olen saanut tämän vielä toimimaan joskus ihan samalla koodilla, mitä minulla nyt on. Tuo tosin on väärin tuossa kirjotettuna, ei ole oikein nuo ehdot. Päivitän ne...

<?php
	$nimi = $_POST['nimi'];
	$sposti = $_POST['sposti'];
	$kotisivu = $_POST['kotisivu'];
	$viesti = $_POST['viesti'];
	if($nimi=="" || $posti=="" || $viesti==""){
		$errors=1;
		$error.="Et täyttänyt vaadittavia kenttiä";
		if($errors==1) echo $error;
	}
	else {
	  $file = "/home/finwe/domains/finwe.arkku.net/public_html/hakemukset/hakemukset.html";
	  while(file_exists($file)){
	    $write = fopen($file, "a");
	    fwrite($write, "<table border=\"0\">");
	    fwrite($write, "<tr><th>Hakemus</th></tr>");
	    fwrite($write, "<tr><td>".$nimi."</td></tr>");
	    fwrite($write, "<tr><td>".$sposti."</td></tr>");
	    fwrite($write, "<tr><td>".$kotisivu."</td></tr>");
		fwrite($write, "<tr><td>".$viesti."</td></tr>");
	    fwrite($write, "</table>");
	    fclose($write);
	    echo "Toiminto onnistui!";
	    if($write == TRUE){
	    	foreach($_POST as  $text){
				mail("goldendragonmaster@gmail.com","Uusi Hakemus!","Uusi hakemus tullut!");
				/*header("Location: http://finwe.arkku.net/index.php?sivu=palvelut");*/
				$display = "<p><strong>Hakemuksen lähetys onnistui! <a href=\"http://finwe.arkku.net/index.php?sivu=palvelut\">Palaa tästä takaisin</a>.</strong></p>";
			}
		}
	  }
	}
?>
<?php echo $display; ?>

Tuollainen se on nyt.

tsuriga [24.05.2006 23:23:54]

#

-Lisää tekstit putkeen ja kirjoita vain kerran tuolla fwritellä, tässä tilanteessa ehkä parempi ratkaisu.
-whilen sijaan if, eihän tuossa loopata kuitenkaan tarvitse
-Kannattaa laittaa muuttujat, joita käytetään läpi skriptin / ei muuteta skriptin aikana koodin alkuun, jotta niitä on helppo muokata myöhemmin
-if ($write == TRUE) { sijaan käytä if (fwrite($write..))

Blaze [24.05.2006 23:41:35]

#

Bandido89 kirjoitti:

Sillä ei monesti ole merkitystä, että mihin ne laittaa, kun PHP-prosessori lukee tiedoston kertaalleen läpi ennen suorittamista.

Eikö? Kyllä minusta

$muuli = 'palle';
echo $muuli;

on ihan eri asia kuin

echo $muuli;
$muuli = 'palle';

Bandido89 kirjoitti:

foreach($_POST as $text){

Öh? Haluatko tosiaan lähettää tuon mailin niin monta kertaa, kuin POST-muuttujia sattuu olemaan? o_O

GoldenDragon [25.05.2006 00:10:59]

#

Blaze kirjoitti:

Bandido89 kirjoitti:

Sillä ei monesti ole merkitystä, että mihin ne laittaa, kun PHP-prosessori lukee tiedoston kertaalleen läpi ennen suorittamista.

Eikö? Kyllä minusta

$muuli = 'palle';
echo $muuli;

on ihan eri asia kuin

echo $muuli;
$muuli = 'palle';

Bandido89 kirjoitti:

foreach($_POST as $text){

Öh? Haluatko tosiaan lähettää tuon mailin niin monta kertaa, kuin POST-muuttujia sattuu olemaan? o_O

Koodi on toiminut noin oikein hyvin ja tarkoitin tuossa muutujien paikka jutussa, oikeastaan, että ei aina vaan joskus. Koodin muuttujamäärittelyt olivatkin kodauksen alkaessa aivan alussa, mutta ne kulkeutuivat tuonne jossakin vaiheessa X) eivät kyllä vaikuttaneet koodin suoritukseen. Ja niiden järjestyksellä ei aina ole merkitystä. Tämä on ihan luettu juttu. Tosin se riippuu ihan tilanteesta.
Ja tuo viimeinen foreach osa toimii myöskin hyvin. Sen on vain tarkoitus hälyttää uudesta hakemuksesta. :P

tsuriga [25.05.2006 00:17:36]

#

Jos se toimii kerran "hyvin" niin oletettavasti koodisi ei näytä oikeasti aivan tuolta. Muutenhan tuota mail-funkkaria kutsutaan niin monta kertaa kuin käyttäjä määrittää (oman lomakkeen mahdollisuus).

GoldenDragon [25.05.2006 00:22:02]

#

tsuriga kirjoitti:

Jos se toimii kerran "hyvin" niin oletettavasti koodisi ei näytä oikeasti aivan tuolta. Muutenhan tuota mail-funkkaria kutsutaan niin monta kertaa kuin käyttäjä määrittää (oman lomakkeen mahdollisuus).

Nimenomaan se näyttää tuolta viimeisimmältä esimerkiltä :P. Kumma kyllä. Itseasiassa tuo olisi itsekin pitänyt tajuta. :O
Mutta ihan yhden mailin se lähetää..Jokatapauksessa muokkaan sen niin, että ei lähetä mitään muuta kuin varoituksen, ilma tuota foreach komentoa. Alunperin piti lähettää koko hakemus, mutta lopulta päätin, ettei sitä lähetetä. Siitä tuli tuollainen raato. Tämä skripti onkin vasta asteella, että saataisiin perustasolla toimimaan ;)

GoldenDragon [08.06.2006 12:02:08]

#

Sain toimimaan oikein tekemällä näin. Välissä unohtui koko homma:

<?php
	if(!isset($_POST['nimi']) || !isset($_POST['sposti']) || !isset($_POST['kotisivu']) || !isset($_POST['viesti'])){
	     echo "Et täyttänyt vaadittuja kenttiä! Kaikki kentät vaaditaan.";
	     exit;
	}
	else{
	  $nimi = $_POST['nimi'];
	  $sposti = $_POST['sposti'];
	  $kotisivu = $_POST['kotisivu'];
	  $viesti = $_POST['viesti'];
	  if(empty($nimi) && empty($sposti) && empty($viesti)) die("Kaikki kentät ovat pakollisia");
	  if(empty($nimi)) die('Et antanut nimeä!');
	  if(empty($sposti)) die('Et antanut Sähköpostiasi!');
	  if(substr_count($sposti, "@") == 0 || substr_count($sposti, "@") > 1) die("Sähköpostisi ei ole kunnollinen. Anna toimiva sähköpostiosoite!");
	  if(empty($viesti)) die('Et antanut viestiä!');
	  if(substr_count($kotisivu, "http://") == 0 || substr_count($kotisivu, "http://") > 1) die("Kotisivuosoitteesi ei ole kunnollinen!");
	  $file = "/polku/hakemistoon/hakemukset.html";
	  if(file_exists($file)){
	    nl2br($viesti);
	    strip_tags($nimi);
	    strip_tags($kotisivu);
	    strip_tags($viesti);
	    htmlentities($nimi);
	    htmlentities($kotisivu);
	    htmlentities($viesti);
	    $write = fopen($file, "a");
	    fwrite($write, "\n<table border=\"0\"><tr><th>".date("d.m.Y H:i:s")."</th></tr><tr><th>Hakemus</th></tr><tr><td>".$nimi."</td></tr><tr><td><a href=\"mailto:".$sposti."\">".$sposti."</a></td></tr><tr><td><a href=\"".$kotisivu."\">".$kotisivu."</a></td></tr><tr><td>".$viesti."</td></tr></table>");
	    fclose($write);
	    echo "Toiminto onnistui!";
	    if($write == TRUE){
		  mail("maili@maili.com","Uusi Hakemus!","Uusi hakemus tullut!");
		  /*header("Location: osoite");*/
		  $display = "<p><strong>Hakemuksen lähetys onnistui! <a href=\"linkki_takaisin\">Palaa tästä takaisin, jos haluat käyttää sivuani perinteisellä ulkoasulla</a>.</strong></p>";
		}
	  }
	}
?>
<?php echo $display; exit; ?>

Siinä, jos jotakin vaikka auttaisi...

Lebe80 [08.06.2006 12:14:12]

#

Bandido89 kirjoitti:

Koodi on toiminut noin oikein hyvin ja tarkoitin tuossa muutujien paikka jutussa, oikeastaan, että ei aina vaan joskus.

Ehkä sinulla on ollutkin vain Register_Globals päällä, jolloin $_POST ja $_GET -muuttujista tallennetaan automaattisesti arvot muuttujiin scriptin alussa. Jos väittämäsi tallentava esilukijasi toimii ei ohjelmoinnissa ole mitään logiikkaa. Ohjelmoitaessa oletetaan että jokainen rivi luetaan järjestyksessä ylhäältä alaspäin (ellei erilaisiä tarkoituksellisia "hyppyjä" ja "silmukoita" tehdä).


Sivun alkuun

Vastaus

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

Tietoa sivustosta