PHP:llä on tehty scripti, jolla pitäisi pystyä tarkastelemaan, lisäämään, muokkaamaan ja poistamaan erilaisia projekteja MySQL-tietokannasta.
Koodi toimii muuten (tietojen tarkastelu ja haku onnistuu), mutta tietokantaan ei pysty lisäämään tietoja, eikä niiden muokkaus ja poistaminen onnistu.
Missähän kohdissa tossa koodissa on virheitä?
<? // päiväkirja.php pääohjelma require("funktiot.php"); tulosta_sivun_alku(); navigointivalikko($_POST['pnimi']); $conn = mysql_connect("localhost", "käyttäjä", "salasana"); mysql_select_db("paivakirja",$conn); if (!isset($_POST['pnimi'])) $_POST['pnimi'] = ""; switch ($_GET['action']) { case "Muokkaa": hae_muokattava_data($_GET['id']); break; case "Lisaa": hae_muokattava_data($_GET['id']); break; case "Tallenna": lisaa_uusi_tietue($_GET['projektiID'], $pnimi, $pvm, $apvm, $lpvm, $sukunimi1, $etunimi1, $sukunimi2, $etunimi2, $sukunimi3, $etunimi3, $sukunimi4, $etunimi4, $tyonkuvaus, $yhsukunimi, $yhetunimi, $toimipaikka, $yhteydenottopvm, $yhteydenottoteksti); break; case "Tallenna muutokset": paivita_tietue($_GET['projektiID'], $pnimi, $pvm, $apvm, $lpvm, $sukunimi1, $etunimi1, $sukunimi2, $etunimi2, $sukunimi3, $etunimi3, $sukunimi4, $etunimi4, $tyonkuvaus, $yhsukunimi, $yhetunimi, $toimipaikka, $yhteydenottopvm, $yhteydenottoteksti); break; case "Poista": poista_tietue($_POST['projektiID']); break; default: listaa_projektit($_POST['pnimi']); } ?> <? /**************************************************/ // funktiot.php function tulosta_sivun_alku() {?> <title>Päiväkirja</title> <style type="text/css"> h2 {border-top: solid thin black; color:#000;backround-color:#ffeeddd } </style> <?php} /*************************************************/ // SQL-kyselyn suorittaminen function query($sql) { global $conn; return mysql_query($conn,$sql); } /*************************************************/ // navigointivalikko hakulomakkeella function navigointivalikko($sn) { ?> <form method="post" action="<? echo $_SERVER['PHP_SELF'] ?>" <a href="'$_SERVER['PHP_SELF']'"> <?php echo ("<a href=\"" . $_SERVER['PHP_SELF'] . "?t="); echo (time() . "\">"); echo ("Näytä kaikki projektit</a> | "); echo ("<a href=\"" . $_SERVER['PHP_SELF'] . "?t="); echo (time() . "&action=Lisaa\">"); echo ("Lisää projekti</a>\n <br>"); ?> Etsi projektin nimen tai sen osan perusteella: <input type="text" name="pnimi" value= "<?php if(isset($sn)) echo htmlspecialchars($sn) ?>"> <input type="submit" value="Hae!"> </form> <?php echo ("<h2>Päiväkirja</h2>"); } /********************************************************/ // Projektien listaaminen valinnan mukaan haulla rajoitettuna function listaa_projektit($pnimi) { if (isset($POST['pnimi'])) { /* Jos lähetetään tiedot lomakkeelta, halutaan rajoittaa hakua*/ $_POST['pnimi'] =addslashes($_POST['pnimi']); $sql = "SELECT * FROM PROJEKTI WHERE pnimi LIKE '%".$_POST['pnimi']."%'"; } else { /* oletuksena tulostetaan kaikki tietueet */ $sql = "SELECT * FROM PROJEKTI"; } $result = mysql_query($sql); if (!$result) { echo "Kyselyssä tapahtui virhe.\n"; exit; } sql_tulokset_taulukkoon($result); } /************************************************************/ // SQL-kyselyn tulosjoukko HTML-taulukkoon. // Avainkenttään luodaan linkki, jota seuraamalla // kyseistä tietuetta voidaan käsitellä function sql_tulokset_taulukkoon($result) { // global $PHP_SELF; /* kyselyn tuloksen rivien ja sarakkeiden lkm*/ $rows = mysql_num_rows($result); $cols = mysql_num_fields($result); echo ("<em>Muokkaa valitsemalla tunnus</em>"); echo ("<table border=\"0\">\n"); /* tulostetaan otsikot ensimmäiselle riville * mysql_Fieldname hakee kentän (sarakkeen i+1 nimen * %s tarkoittaa muotoilua ~ tulosta merkkijonona */ echo ( "<tr>\n"); for ($i = 0; $i < $cols; $i++) { printf("<td bgcolor=\"ffeedd\">%s</td>\n", ucfirst(mysql_field_name($result, $i))); } echo ("</tr>"); /* Käydään tulosjoukon kaikki rivit ja sarakkeet läpi * mysql_result hakee $j:n ja $i:n määräämän tietueen kentän arvon*/ for ($j = 0; $j < $rows; $j++) { echo( "<tr bgcolor=" . anna_vari() . ">\n"); for ($i = 0; $i < $cols; $i++) { /* Hyperlinkin "id-kentän" arvoksi tulostetaan * tunnus-kentän arvo mahdollista käsittelyä varten */ if ($i == 0) { print("<td><a href=\"$PHP_SELF?action=Muokkaa"); print("&tt=" . time() . "&id="); printf("%s\">%s</a></td>\n", rawurlencode(mysql_result($result, $j, $i)), htmlspecialchars(mysql_result($result, $j, $i))); } else { printf( "<td>%s</td>\n", htmlspecialchars(mysql_result($result, $j, $i))); } } echo("</tr>"); } echo("</table>"); } /********************************************************/ // Palauttaa joka toinen kutsukerta vaihtuvan värin function anna_vari() { static $varikoodi; if($varikoodi == "#eeeeee") { $varikoodi = "#ffffff"; } else { $varikoodi = "#eeeeee"; } return($varikoodi); } /**********************************************************/ // Tutkitaan, päivitetäänkö olemassaolevaa tietuetta function on_paivitys($id) { if (strlen($id) > 0) { return TRUE; } else { return FALSE; } } /**********************************************************/ // Muokkauslomaketta käytetään sekä uuden tietueen // syöttämiseen että vanhojen tietueiden muokkaamiseen ja poistamiseen. function muokkauslomake($result,$id) { $cols = mysql_num_fields($result); echo ("<em>Lisää/Muokkaa projekti</em>"); ?> <form method="post" action="<?php echo $_SERVER['PHP_SELF'] ?>" <?php echo ("<table border=\"0\">\n"); for ($i = 0; $i < $cols; $i++) { $fn = mysql_field_name($result, $i); $fv = @mysql_result($result, 0, $i); echo ("<tr valign=\"top\">\n"); echo ("<td align=\"right\" bgcolor=\"#ffeedd\">"); echo (ucfirst($fn) . "</td>\n"); echo ("<td bgcolor=\"dddddd\">"); /* Päivitettäessä tietuetta avainkenttää * ($i==0) ei voi muokata */ if (on_paivitys($id) AND ($i == 0)) { echo (htmlspecialchars($fv)); echo ("<input type=\"hidden\" name=\"$fn\""); echo (" value=\""); echo (htmlspecialchars($fv) . "\">"); } else { echo ("<input type=\"text\" name=\"$fn\""); echo (" size=\"30\" value=\""); echo (htmlspecialchars($fv) . "\">"); } echo ("</td>\n</tr\n"); } echo ("</table>\n"); echo (painikkeet($id)); echo ("</form>\n\n"); } /******************************************************/ // Painikkeiden valinta syöttölomakkeeseen toiminnon mukaan function painikkeet($id) { if (on_paivitys($id)) { //seurattu linkkiä -> $id mukana -> halutaan muokata $mjono = "<input type=\"submit\" name=\"action\" "; $mjono .= "value=\"Tallenna muutokset\" "; $mjono .= "onclick=\"javascript: "; $mjono .= "return confirm('Hyväksy muutokset?')\">\n"; $mjono .= "<input type=\"submit\" name=\"action\" "; $mjono .= "value=\"Poista\" onclick=\"javascript: "; $mjono .= "return confirm('Hyväksy poisto?')\">\n"; } else { // Uuden tietueen syöttäminen $mjono = "<input type=\"submit\" "; $mjono .= "name=\"action\" value=\"Tallenna\" "; $mjono .= "onclick=\"javascript: "; $mjono .= "return confirm('Hyväksy lisäys?')\"><br>\n"; } return $mjono; } /***************************************************/ // Täytetään muokkauslomake valitulla tietueella function hae_muokattava_data($id) { /* Lisättäessä uutta tietuetta $projektiID:llä ei ole arvoa ja * tulosjoukko on tyhjä. Tällöin lomakkeen kentät jäävät * tyhjiksi, mutta niiden nimet saadaan tämän kyselyn seurauksena */ $id = addslashes($id); $sql = "SELECT * FROM PROJEKTI WHERE projektiID='$id'"; $result = mysql_query($sql); if ($result) { muokkauslomake($result, $id); } } /*****************************************************/ // Uuden tietueen lisääminen function lisaa_uusi_tietue($projektiID, $pnimi, $pvm, $apvm, $lpvm, $sukunimi1, $etunimi1, $sukunimi2, $etunimi2, $sukunimi3, $etunimi3, $sukunimi4, $etunimi4, $tyonkuvaus, $yhsukunimi, $yhetunimi, $toimipaikka, $yhteydenottopvm, $yhteydenottoteksti) { tarkista_syotteet($pnimi, $pvm, $apvm, $lpvm); $sql = "INSERT INTO PROJEKTI VALUES ( '$projektiID', '$pnimi', '$pvm', '$apvm', '$lpvm', '$sukunimi1', '$etunimi1', '$sukunimi2', '$etunimi2', '$sukunimi3', '$etunimi3', '$sukunimi4', '$etunimi4', '$tyonkuvaus', '$yhsukunimi', '$yhetunimi', '$toimipaikka', '$yhteydenottopvm', '$yhteydenottoteksti' )"; $result = mysql_query($sql); if (mysql_affected_rows($result) > 0) { echo("Seuraava tietue lisättiin onnistuneesti:<br>\n"); echo ("'$projektiID', '$pnimi', '$pvm', '$apvm', '$lpvm', '$sukunimi1', '$etunimi1', '$sukunimi2', '$etunimi2', '$sukunimi3', '$etunimi3', '$sukunimi4', '$etunimi4', '$tyonkuvaus', '$yhsukunimi', '$yhetunimi', '$toimipaikka', '$yhteydenottopvm', '$yhteydenottoteksti' \n"); } else { echo("Tietuetta EI lisätty!<br>\n"); } } /************************************************************/ // Tietueen päivittäminen function paivita_tietue($projektiID, $pnimi, $pvm, $apvm, $lpvm, $sukunimi1, $etunimi1, $sukunimi2, $etunimi2, $sukunimi3, $etunimi3, $sukunimi4, $etunimi4, $tyonkuvaus, $yhsukunimi, $yhetunimi, $toimipaikka, $yhteydenottopvm, $yhteydenottoteksti) { tarkista_syotteet($pnimi, $pvm, $apvm, $lpvm); $sql = "UPDATE PROJEKTI SET pnimi='$pnimi', pvm='$pvm', apvm='$apvm', lpvm='$lpvm', sukunimi1='$sukunimi1', etunimi1='$etunimi1', sukunimi2='$sukunimi2', etunimi2='$etunimi2', sukunimi3='$sukunimi3', etunimi3='$etunimi3', sukunimi4='$sukunimi4', etunimi4='$etunimi4', tyonkuvaus='$tyonkuvaus', yhsukunimi='$yhsukunimi', yhetunimi='$yhetunimi', toimipaikka='$toimipaikka', yhteydenottopvm='$yhteydenottopvm', yhteydenottoteksti='$yhteydenottoteksti' WHERE projektiID='$projektiID'"; $result = mysql_query($sql); if (mysql_affected_rows($result) > 0) { echo("Tietue muokattiin onnistuneesti:<br>\n"); echo("'$projektiID', '$pnimi', '$pvm', '$apvm', '$lpvm', '$sukunimi1', '$etunimi1', '$sukunimi2', '$etunimi2', '$sukunimi3', '$etunimi3', '$sukunimi4', '$etunimi4', '$tyonkuvaus', '$yhsukunimi', '$yhetunimi', '$toimipaikka', '$yhteydenottopvm', '$yhteydenottoteksti' \n"); } else { echo("Tietuetta EI muokattu<br>\n"); } } /***********************************************************/ // Tietueen poistaminen function poista_tietue($projektiID) { $projektiID = addslashes($projektiID); $sql = "DELETE FROM PROJEKTI WHERE projektiID='$projektiID'"; $result = mysql_query($sql); if (mysql_affected_rows($result) > 0) { echo("Tietue poistettiin onnistuneesti\n"); } else { echo("Tietueen poisto EI onnistunut!<br>\n"); } } /********************************************************/ // Tarkistetaan että lomakkeen vaaditut kentät ovat // täytetyt. Jos ovat, niin lisätään kenoviivat // vaarallisten merkkien eteen. function tarkista_syotteet(&$pnimi, &$pvm, &$apvm, &$lpvm) { if((trim($pnimi) == "") OR (trim($pvm) == "") OR (trim($apvm) == "") OR (trim($lpvm) == "")) { echo "Projektin nimi, päivämäärä, aloitus- ja lopetuspäivämäärä ovat pakollisia kenttiä! Valitse takaisin."; exit; } else { $pname = addslashes(trim($pnimi)); $pvm = addslashes(trim($pvm)); $Apvm = addslashes(trim($apvm)); $Lpvm = addslashes(trim($lpvm)); } } ?>
mysql_connect("localhost", "käyttäjä", "salasana"); mysql_select_db("paivakirja");
Ei niitä tarvi muuttujaan laittaa jos on vain yksi yhteys ;)
$result = mysql_query($sql) or die(mysql_error());
Tuosta sitten näet mikä mättää.
Kristallipallero sanoo, että käyttäjälläsi ei ole oikeuksia muokata tietokantaa.
Miljoonan koodirivin floodaus on melko varma tapa jäädä ilman apua, jos ainoa viesti koodin lisäksi on "jokin kusee, auttakaa".
Kristalli pallo sanoo että: VALUES(arvo1,arvo2) tarttee lisäksi kenttien nimet samassa järjestyksessä tyliin (kenttä1,kenttä2).
Lisäksi antaa seuraavat huomatukset:
1. Koodi on huonosti muotoiltua.
2. Kannattaa käyttää <? sijasta täydellistä <?php tagia yhteensopivuuden takia.
3. Varsinainen koodi osa tulisi erottaa tulostusosasta helppolukuisuuden takia.
4. Käytä mahdollsimman yhtenäistä echoa joka myös parantaa luettavuutta
Tyyliin
<?php echo ' <html> ... <body> ... <span>',$muuttuja1,'</span> ... </body> </html> '; ?>
nämä pätee ihan muillekkin ja jokainen soveltaa niitä omalla tavallaan (tai jättää soveltamatta) virallisiahan koodausohjeita ei ole
Aihe on jo aika vanha, joten et voi enää vastata siihen.