Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: PHP: Luvun vienti toiseen tiedostoon

Sivun loppuun

NuMiNi [07.07.2012 19:37:55]

#

Koodaan PHP:lla järjestelmää, joka poimii tekstitiedostosta tiedot ja tallentaa ne tietokantaan. Kirjoitus tietokantaan onnistuu, mutta haluaisin ohjelmaan ominaisuuden, jolla tietokannan tietoja voisi myös muokata.

Olen tulostanut tiedot taulukkoon, jossa viimeinen sarake sisältää Muokkaa-napin. Tätä painamalla pitäisi saada kyseisen rivin tunnistenumero vietyä toiseen php-tiedostoon, jossa tunnistenumeron perusteella haettaisi tietokannasta tieto joita sitten voitaisiin muokata tekstikentissä. Tämän jälkeen tiedot tallennettaisiin ja paluu edelliselle sivulle. Tässä osa koodiani:

	$muokkaa = "<form method = 'post' action = 'muokkaa.php'><input type = submit name = 'mka' value = 'Muokkaa'>";
	echo "<table border='1'>";
	echo "<tr><th>Nro</th><th>Yritys</th><th>Myyntituote</th><th>Huomautukset</th><th>Tekstihuomautus</tr>";
    ...
	// Käydään sisältö läpi rivi kerrallaan
	for($i = $aloitusrivi; $i < $lopetusrivi; $i += 4)
    ...
		$lukumaara = count($tieto); // Lasketaan tietuiden määrä
		// Tietojen tulostaminen taulukoksi, josta voidaan tehdä muokkauksia
		echo "<tr><td>";
		echo $lukumaara;
		echo "</td><td>";
		echo $Yritys;
		echo "</td><td>";
		echo $Myyntituote;
		echo "</td><td>";
		echo $Huom;
		echo "</td><td>";
		echo $Huomautukset;
		echo "</td><td>";
		echo $muokkaa;
		echo "</td></tr>";
	}
	echo "</form>";
	echo "</table>";
}

Eli halutun rivin $lukumäärä muuttuja pitäisi saada vietyä muokkaa.php -tiedostoon. Yritin hidden input type menetelmällä, mutta ei onnistunut.

-tossu- [07.07.2012 20:58:11]

#

Tee muokkaa-napista tavallinen linkki muokkaa.php-sivulle ja välitä rivin id get-paremetrina tyyliin href="muokkaa.php?lukumaara=1337". Koodisi näyttää kyllä muiltakin osin melkoiselta viritykseltä. Mistä $tieto tulee, ja miten lukumäärän avulla yksilöidään muokattava rivi?

Saisit ainakin siistiä koodia vähentämällä echojen määrää ja käyttämällä jotain logiikkaa muuttujien nimeämisessä. Muuttujia voi PHP:ssä laittaa merkkijonojen sisälle suoraan:

echo "<tr><td>$lukumaara</td><td>$Yritys</td>...</tr>";

NuMiNi [07.07.2012 21:57:34]

#

-tossu- kirjoitti:

Koodisi näyttää kyllä muiltakin osin melkoiselta viritykseltä. Mistä $tieto tulee, ja miten lukumäärän avulla yksilöidään muokattava rivi?

Kyllä tiedossa on että paremmin tuon voisi tehdä, mutta ei voi mitään kun ei taidot kunnolla riitä. Jos osaisin, niin tietysti tekisin asiat paremmin.

Tuo $tieto on neljä-elementtinen taulukko, joka sisältää tietyt tiedot. Ensimmäinen rivi on yrityksen nimi, toinen myyntituote, jne. Sitä minä en sitten tiedä, miten saan $lukumaara avulla yksilöityä tuon taulukossa olevan rivin.. ja miten sen ylipäätään saisi yksilöityä.

pistemies [07.07.2012 22:03:37]

#

-tossu- kirjoitti:

Saisit ainakin siistiä koodia vähentämällä echojen määrää ja käyttämällä jotain logiikkaa muuttujien nimeämisessä. Muuttujia voi PHP:ssä laittaa merkkijonojen sisälle suoraan:

echo "<tr><td>$lukumaara</td><td>$Yritys</td>...</tr>";

Tai:

<tr><td>
<?php echo $lukumaara;?>
</td><td>
<?php echo $Yritys;?>
</td></tr>

-tossu- [07.07.2012 23:15:48]

#

NuMiNi kirjoitti:

...pitäisi saada kyseisen rivin tunnistenumero vietyä toiseen php-tiedostoon...

Eli halutun rivin $lukumäärä muuttuja pitäisi saada vietyä muokkaa.php -tiedostoon.

Ymmärsin tuosta, että $lukumäärä-muuttujan avulla aiot tunnistaa muokattavan rivin. Myöhemmin kuitenkin sanot, että $tieto-taulukossa on neljä elementtiä eli $lukumäärä on aina neljä.

Mikäli tietokannassa ei jo ole saraketta, joka on jokaisella rivillä uniikki, luo sellainen. Kannattaa tehdä id-sarakkeesta primary key ja asettaa sille auto increment, jolloin uudet rivit saavat automaattisesti uniikin id:n.

The Alchemist [08.07.2012 11:51:07]

#

pistemies kirjoitti:

Tai:

<tr><td>
<?php echo $lukumaara;?>
</td><td>
<?php echo $Yritys;?>
</td></tr>

Tuossa HTML:n sisennystyylissä ei ole oikein mitään logiikkaa. Siistimpi syntaksi olisi seuraava:

<tr>
    <td><?= h($pcs) ?></td>
    <td><?= h($company) ?></td>
</tr>

...missä 'h' on sama kuin 'htmlspecialchars'. HTML:n enkoodausta ei saa ikinä unohtaa!

Jos muuttujia laitetaan merkkijonon sisälle, niin erottelisin ne aaltosulkeilla, jolloin tekstieditorit osaavat paremmin korostaa muuttujat stringin sisälläkin. (Putkan käyttämä värittäjä ei osaa...) Lisäksi tämä käytäntö on loogisesti konsistentti, koska taulukon arvojen tai olioiden jäsenten upottaminen stringiin vaatii aina aaltosulkeiden käytön, joten ei ole mitään perustetta olla käyttämättättä niitä myös tavallisten muuttujien kanssa.

<?php
print "<div>Testi: {$foobar}</div>\n";
?>

pistemies [08.07.2012 13:33:53]

#

The Alchemist kirjoitti:

Tuossa HTML:n sisennystyylissä ei ole oikein mitään logiikkaa.

Eipä niin. Koska en viestissäni käsitellyt sitä, miten se tulisi sisentää vaan se liittyi ihan tulostamiseen. Minusta turhan paljon php:lla tulostetaan pelkkää html-koodia. Sen tulostamiseen ei php:ta tarvita.

The Alchemist [08.07.2012 21:12:03]

#

Ei ole mitään järkeä tehdä asioita väärin vain sen takia, että vastauksen pääpointti on jossain muualla. Sitä tässä hain.

NuMiNi [08.07.2012 21:14:13]

#

-tossu- kirjoitti:

Ymmärsin tuosta, että $lukumäärä-muuttujan avulla aiot tunnistaa muokattavan rivin. Myöhemmin kuitenkin sanot, että $tieto-taulukossa on neljä elementtiä eli $lukumäärä on aina neljä.

En oikein osannut selittää tuota oikein, mutta kyllä taulukon Nro kenttä saa ihan oikean arvon numerosta 1 lähtien. $tieto muuttuja on määritelty näin:

		$nelikko = array();
    	$nelikko['yritys'] = $tiedosto[$i]; // i = 0
    	$nelikko['myyntituote'] = $tiedosto[$i + 1];
		$nelikko['...'] = $tiedosto[$i + 2];
		$nelikko['...'] = $tiedosto[$i + 3];
    	$tieto[] = $nelikko;

Miten sen oikean numeron vienti siitä sitten onnistuu, niin se on se suurin ongelma tällä hetkellä.

-tossu- kirjoitti:

Mikäli tietokannassa ei jo ole saraketta, joka on jokaisella rivillä uniikki, luo sellainen. Kannattaa tehdä id-sarakkeesta primary key ja asettaa sille auto increment, jolloin uudet rivit saavat automaattisesti uniikin id:n.

Tietokanta on toteuttu juuri tuolla tavalla.

-tossu- [08.07.2012 22:09:10]

#

Saat vietyä numeron muokkaa.php-sivulle get-parametrina kuten jo aiemmin sanoin.
Väännän vielä varmuuden vuoksi rautalangasta:

while ($rivi = lue_rivi_kannasta()) {
	$nro = rivi['nro'];
	$yritys = htmlspecialchars($rivi['yritys']);
	// Käsitellään muut sarakkeet vastaavasti

	echo "<tr><td>{$yritys}</td> ... <td><a href=\"muokkaa.php?nro={$nro}\">muokkaa</a></td></tr>";
}

muokkaa.php:

$nro = intval($_GET['nro']);

tee_tietokantakysely("SELECT * FROM taulu WHERE nro={$nro}");

Sivun alkuun

Vastaus

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

Tietoa sivustosta