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.
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>";
-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ä.
-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:
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.
pistemies kirjoitti:
Tai:
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"; ?>
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.
Ei ole mitään järkeä tehdä asioita väärin vain sen takia, että vastauksen pääpointti on jossain muualla. Sitä tässä hain.
-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.
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}");
Aihe on jo aika vanha, joten et voi enää vastata siihen.