Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: PHP ja checkbox-input

Sivun loppuun

töheltäjä [05.10.2009 18:12:18]

#

Tässä tutustuessa tähän php:n olen yrittänyt saada moista koodia toimaan, mutta tekstitiedostoon ei tallennu kuin yksi vaihtoehto eli viimeinen. Tuo tulostus kuitenkin antaa okein eli esim $luku sisältää vaikka kaikki kolme vaihtoehtoa.

Tämän pitäisi siis toimi siten, että saan tekstitiedostoon talteen kaikki valitut ja tuo echo $luku; kohta jää siis pois tuosta. Olisin kiitollinen jos joku kehtaa opastaa pappaa vastamäessä.

<?php

if (isset($_POST['nappi1'])) {
    if (empty($_POST['1'])) {

    } else {

        foreach ($_POST['1'] as $luku) {
            echo $luku;
        }
        echo "Yhteismäärä: " . count($_POST['1']);
    }
    if (empty($_POST['2'])) {

    } else {

        foreach ($_POST['2'] as $luku1) {
            echo $luku1;
        }
        echo "Yhteismäärä: " . count($_POST['2']);
    }


$SivunTarkistus = empty($_REQUEST['tarkistus1']) ? 'ei' : 'kylla';

$aika = date("d.m.Y G:i");

$kierros = strip_tags($_POST["kierros1"]);

$teksti = strip_tags($_POST["teksti1"]);

$ilmoitus1 = "";

if($SivunTarkistus == 'kylla')
{

    if($kierros == '')
    {
      $ilmoitus1 .= "Muista kierros<br />\n";
    }

    if($teksti == '')
    {
      $ilmoitus1 .= "Laita kommentointisi";
    }
}

if(!empty($kierros) && !empty($teksti))
{
    $tiedosto = fopen("../vakio.txt", "a");
    $kierros;
    $teksti;
    $aika = date("d.m.Y G:i");
    $luku;
    $luku1;


    $rivi = "$kierros|$aika|$teksti|$luku|$luku1 \n";

    fwrite($tiedosto, $rivi);

    fclose($tiedosto);

    //header("Location: ../kuittaus.htm");
    exit;
}
    die();
}

?>
<html>
<head>
<style type="text/css">
body{
    background:#BC8F8F;
}
.ilmoitus1{
    width:50%;
    background:black;
    color:red;
    padding:5px;

}
</style>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
</head>
<title> Ravi vihjeet </title>

<body>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">
<input type="hidden" name="tarkistus1" value="kylla">
<p>Kierros nro: <br><input type="text" name="kierros1" size="2" maxlength="2" value="<?php echo stripslashes($kierros); ?>"></p>
<p>
1  &nbsp;<INPUT NAME="1[]" TYPE=checkbox
VALUE="1">
 <INPUT NAME="1[]"
TYPE=checkbox VALUE="x">
 <INPUT NAME="1[]"
TYPE=checkbox VALUE="2">
</p>
<p>
2  &nbsp;<INPUT NAME="2[]" TYPE=checkbox
VALUE="1">
 <INPUT NAME="2[]"
TYPE=checkbox VALUE="x">
 <INPUT NAME="2[]"
TYPE=checkbox VALUE="2">
</p>
<p>Kommentoi:<br />
	<textarea type="text" name="teksti1" cols="50" rows="9"wordwrap maxlength="1500" value="<?php echo stripslashes($teksti); ?>">
	</textarea>
	</p>

<p><input type="submit" name="nappi1" value="Tallenna"><br></p>
<p class="ilmoitus1"> <?php echo $ilmoitus1; ?></p>
</table>
</body>
</form>
</html>

peg [05.10.2009 18:29:18]

#

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">
$_SERVER['PHP_SELF']

tarkoittaa että tapahtuman käsittelee tämä sivu.
Tällä sivulla ei kuitenkaan ole $_POST.
Muuta jokaiselle NAME="" nimi1, nimi2, nimi3 jne.
Kokeile lisäämällä sivun alaosaan.

echo $_POST[nimi1];

Teuro [05.10.2009 18:37:22]

#

Lyhyt vastaus: Muuta koodia siten, että sen voi ajaa ilman varoituksia ja virheitä. Tuo on niin täynnä mokia, että se ei korjaannu pienellä korjailuilla.

Sitten pidempi vastaus: Ensin korjataan tuo html osuus kuntoon.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
	<head>
		<title> Ravivihjeet </title>
		<style type="text/css">
			body{
				background:#BC8F8F;
			}

			.ilmoitus1{
				width:50%;
				background:black;
				color:red;
				padding:5px;

			}
		</style>
	</head>
	<body>
		<h2>Kierros 1</h2>
		<form action="kasittele.php" method="post">
			<h3>Vaihtoehdot</h3>
			<table>
				<tr>
					<td>1</td><td><input type="checkbox" value="1" name="valinnat[]" /></td>
				</tr>
				<tr>
					<td>x</td><td><input type="checkbox" value="x" name="valinnat[]" /></td>
				</tr>
				<tr>
					<td>2</td><td><input type="checkbox" value="2" name="valinnat[]" /></td>
				</tr>
				<tr>
					<td><input type="submit" /></td>
				</tr>
			</table>
		</form>
	</body>
</html>

Sitten tarkistetaan kasittele.php puolella mitä saatiin aikaiseksi.

<?php
if(isset($_POST['valinnat'])){
	/* Varmistetaan, että saadaan oikeaa kamaa tulemaan */
	var_dump($_POST);


}
?>

Nyt voit aloitella tuohon html osuuteen kirjoittelemaan noita haluamiasi ominaisuuksia. Seuraavaksi voisit tarkistaa, että miten siihen tiedostoon taas kirjoitettiin ja mikä olikaan muuttujien näkyvyysalue jne...

Teuro [05.10.2009 19:56:23]

#

Lopulta kasittele.php voisi näyttää tällaiselta.

<?php
if(isset($_POST['valinnat'])){
	if(empty($_POST['kierros'])){
		$virheTieto[] = "Et asettanut kierrosta!";
	}

	if(empty($_POST['kommentti'])){
		$virheTieto[] = "Täytä kommenttikenttä!";
	}

	if($virheTieto){
		/* Tulosta virheet */
	}else{
		/* Tallenna tiedostoon hallitusti */
	}
}
?>

töheltäjä [05.10.2009 21:03:04]

#

Ok pitää yrittää vaan ja jos ei onnistu niin palattava asiaan taas. Sehän täässä nimenomaan on kun ei osaa ja yrittää silti saada jotain aikaan. Kiitos tähän asti.

Teuro [05.10.2009 21:30:33]

#

Silloin kannattaa usein kirjoittaa itselleen ylös tarkka tavoite ohjelmalle. Tässä tavoitteena voisi olla veikkausrivin tekeminen ja tallentaminen tekstitiedostoon. Tästä tavoitteesta lähdetään liikkeelle, jonka jälkeen mietitään miten asian voisi hoitaa.

Tehdään välietappeja matkan varrelle, jotta tavoite olisi mielekäs saavuttaa. Kokeneemmat ohjelmoijat sivuttanevat tämän vaiheen tällaisessa tehtävässä, koska he näkenevät ratkaisun suoraan.

Vakioveikkauksessa pelataan esimerkiksi 13 otelua / kierros. Tarvitsemme siis ohjelmakoodia, joka osaa generoida 13 radiovalintanappia. Tämän osaamme php oppaiden avulla koodata helpolla. Tehdään siitä kuitenkin funktio, joka saa syötteenä haluttujen radiovalintanappien määrän.

<?php
/**
    * funktio generoi annetun määrän radiovalintanappeja
*/
function teeNapit($maara){
	$vaihtoehdot = Array("1", "x", "2");
	echo"<tr>\r\n<th></th>\r\n";
	for($a = 0; $a < 3; $a++){
		echo"<th>" . $vaihtoehdot[$a] . "</th>\r\n";
	}
	echo"</tr>\r\n";

	for($a = 1; $a <= $maara; $a++){
		echo"<tr>\r\n";
		echo"<td>Peli $a</td>\r\n";
		for($b = 0; $b < 3; $b++){
			echo"<td><input type=\"radio\" name=\"peli$a\" value=\"" . $vaihtoehdot[$b] . "\" /></td>\r\n";
		}
		echo"</tr>\r\n";
	}
}

Noin nyt on yksi etappi selvitetty. Osaamme luoda tarvittavan määrän nappeja käyttöömme. Seuraava etappi olisi poimia lähetetyt tiedot käsittelijälle. Edelleen voisi varmistaa, että käyttäjä on antanut tarvittavat tiedot.

peg [05.10.2009 22:22:55]

#

Koodiltaan aloittelijalle hieman yksinkertaisempi...
Eli koodi tulostaa 3 input kenttää, muokkailemalla huomaat
toiminnan paremmin. Kenttien nimeksi tulee in1, in2 ja in3, kannattaa
katsoa sivun lähdekoodia lopuksi.

<form><div><table>
<?php
function text_kentta($kentan_asia, $kentan_nimi) {
   echo "<tr><td>{$kentan_asia}  </td><td><input type='text' size='53' name='in{$kentan_nimi}' value='in{$kentan_nimi}'></td></tr>\n";
}
text_kentta("Nimi", ++$i);     # Tulostaa Nimi kentän
text_kentta("Osoite", ++$i);   # Tulostaa Osoite kentän
text_kentta("Puhelin", ++$i);  # Tulostaa Puhelin kentän

?>
</table></div></form>

töheltäjä [09.10.2009 01:51:23]

#

Joo tänää kokeilin hämmentää niin en vaan onnistu tallentamaan noita 1 x 2 vaihtoehtoja sinne tekstitiedostoon ei vaan osaa ei. Muuten kyllä saa toimimaan. Taisteltava vaan edelleen.

töheltäjä [11.10.2009 22:45:28]

#

Asia kunnossa. Laitoin karvalakki tyylillä. Eli jokaiselle checkboxille oma nimi. En muuten vaan osannu tehä työtä tietysti enemmän, mut minun tapauksessa tärkeintä et ylipäätään toimii.

Tommosen sivun väsäsin kaverille kun tekee noita pelejä niin saa vähä lisää sisältöö. Lähinnä kait tutut voi käydä katselemassa mitä hänellä on ajatusta. Vielä pitäs tota ulkoasua ehkä sipistellä, mut ei sillä kait niin suurta merkitystä oo http://veikkaus.dy.fi/.

Teuro [12.10.2009 16:55:38]

#

Ei kuitenkaan ole tarvetta kirjoittaa jokaista arvoa erikseen tiedostoon, vaan voimme ohjelmoida kirjoituksen automaattiseksi. Alla oleva koodi luo 13 radionappia, sekä napin arvojen lähetykseen. Lopuksi se kirjoittaa tiedostoon pelinumeron ja valitun arvon.

<?php
if(isset($_POST['peli1'])){
	$tiedosto = fopen("veikkaus.txt", "w");
	foreach($_POST AS $nimi => $arvo){
		fwrite($tiedosto, "{$nimi}: = {$arvo}\r\n");
	}
	fclose($tiedosto);
}

function teeNapit($maara){
	$vaihtoehdot = Array("1", "x", "2");
	echo"<tr>\r\n<th></th>\r\n";
	for($a = 0; $a < 3; $a++){
		echo"<th>" . $vaihtoehdot[$a] . "</th>\r\n";
	}
	echo"</tr>\r\n";

	for($a = 1; $a <= $maara; $a++){
		echo"<tr>\r\n";
		echo"<td>Peli $a</td>\r\n";
		for($b = 0; $b < 3; $b++){
			echo"<td><input type=\"radio\" name=\"peli$a\" value=\"" . $vaihtoehdot[$b] . "\" /></td>\r\n";
		}
		echo"</tr>\r\n";
	}

	echo"<tr><td><input type=\"submit\" /></td></tr>";
}
echo"<table><form action=\"\" method=\"post\">\r\n";

teeNapit(13);

echo"</form></table>";
?>

töheltäjä [16.10.2009 14:59:21]

#

Kokeilin tuota tossa, ei toimiva. Tallentaa vaan yhden vaihtoehdon tarvittaissa pitää pystyä tallentamaan kaikki kolme.

Teuro [16.10.2009 15:01:16]

#

töheltäjä kirjoitti:

Kokeilin tuota tossa, ei toimiva. Tallentaa vaan yhden vaihtoehdon tarvittaissa pitää pystyä tallentamaan kaikki kolme.

Aah ok muuta 'radio' -> 'checkbox'

töheltäjä [16.10.2009 17:21:31]

#

Ei taida ihan riittä pelkästään toi checkbox vaihto. Minun taidoilla ainakaan. Tallentaa tekstitiedostoon viimeisen vaihtoehdon eli mihin osoitin jää. Tästä en juuri päässyt eteen päin itse siksi tyydyin tekemään kaikki erikseen, jolloin sain ainakin halutun tuloksen.

Metabolix [16.10.2009 17:48:28]

#

Jos kentän nimessä on hakasulut, sen saa näppärästi PHP:lläkin käsiteltyä suoraan taulukkona. Samannimisiä kenttiä voi olla monta, arvot ovat tällöin taulukossa peräkkäin.

<input type="checkbox" name="valinta[]" value="apina" />
<input type="checkbox" name="valinta[]" value="banaani" />
<input type="checkbox" name="valinta[]" value="cembalo" />
<?php
// Jos mitään ei ole valittu, arvoa ei lähetetä skriptille.
// Laitetaan tällöin skriptissä arvoksi tyhjä taulukko.
if (empty($_POST['valinta'])) {
  $valinnat = array();
} else {
  $valinnat = $_POST['valinta'];
}

if (count($valinnat) == 0) {
  echo "Et valinnut mitään!\n";
} elseif (count($valinnat) == 1) {
  echo "Valitsit kohdan ".reset($valinnat).".\n";
} else {
  echo "Valitsit kohdat ".implode(" ja ", $valinnat).".\n";
}

Sivun alkuun

Vastaus

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

Tietoa sivustosta