Olen tehnyt sriptin joka käsittelee MySQL tietokantaa ja tarkoitukseni olisi, että sillä saisi muokattua tietueita. Törmäsin (ainakin) seuraaviin virheilmoituksiin:
Notice: Undefined variable: action in c:\program files\easyphp1-8\www\vieraskirja.php on line 260
Notice: Undefined variable: id in c:\program files\easyphp1-8\www\vieraskirja.php on line 280
<style type="text/css"> h2 { border-top: solid thin black; color:#000;background-color:#fed } h3 { border-top: solid thin black; color:#000;background-color:#eee } </style> </head> <?php // osoitekirja.php //include 'funktiot.php'; /****************************************************/ function query($kysely) { global $yhteys; return mysql_query($kysely, $yhteys); } /***********************************************/ // Navigointivalikko function lomake($sn) { ?> <form method="post" action="<?php echo $_SERVER['PHP_SELF'] ?>" <a href="'$_SERVER['PHP_SELF']'"> <?php echo ("<a href=\"" . $_SERVER['PHP_SELF'] . "?t="); echo (time() . "\">"); echo ("Näytä kaikki osoitteet</a> | "); echo ("<a href=\"" . $_SERVER['PHP_SELF'] . "?t="); echo (time() . "&action=Lisaa\">"); echo ("Lisää osoite</a>\n <br>"); ?> Etsi sukunimen tai sen osan perusteella: <input type="text" name="snimi_form" value= "<?php if(isset($sn)) echo htmlspecialchars($sn) ?>"> <input type="submit" value="Hae!"> </form> <?php echo "<h2>Osoitekirja</h2>\n"; } /***********************************************/ function sql_tulokset_taulukkoon($tulos) { /*Kyselyn tuloksen rivien ja sarakkeidem lkm.*/ $riveja = mysql_num_rows($tulos); $sarakkeita = mysql_num_fields($tulos); echo "<em>Muokkaa valitsemalla tunnus<em>"; echo "<table border =\"1\">\n"; /*Tulostetaan otsikot ensimmäiselle riville */ echo "<tr>\n"; for($i=0; $i<$sarakkeita; $i++) { printf("<td bgcolor=\" #ffeedd\"> %s </td>\n", mysql_field_name($tulos, $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 */ for($j=0; $j<$riveja; $j++) { echo "<tr bgcolor=" . anna_vari() . ">\n"; for($i=0; $i<$sarakkeita; $i++) { /* Hyperlinkin "id-kentän" arvoksi tulosteaan /* tunnuskentän arvo mahdollista käsittelyä varten */ if($i==0) { printf ("<td><a href=\"" . $_SERVER['PHP_SELF'] . "?action=Muokkaa"); printf("&tt=" . time() . "&id="); printf("%s\">%s</a></td>\n", rawurlencode(mysql_result($tulos, $j,$i)), htmlspecialchars(mysql_result($tulos, $j,$i))) ; } else { printf("<td>%s</td>\n", htmlspecialchars(mysql_result($tulos, $j,$i))); } } echo "</tr>"; } echo "</table>"; } /***********************************************/ function anna_vari() { static $varikoodi; if($varikoodi== "#eeeeee") { $varikoodi= "#ffffff"; } else { $varikoodi= "#eeeeee"; } return ($varikoodi); } /****************************************************/ /* Tutkitaan päivitetäänkö olemassa olevaa tietuetta */ function on_paivitys($id) { if(strlen($id) > 0) { return TRUE; } else { return FALSE; } } /****************************************************/ /* muokkauslomaketta käytetään sekä uuden tietueen, */ /* että vanhojen tietueiden muokkaamiseen ja */ /* poistamiseen */ function muokkauslomake($tulos, $id) { $sarakkeita = mysql_num_fields($tulos); echo "<em> Lisää/ Muokkaa osoite <em>"; ?> <form method="post" action="<?php echo $_SERVER['PHP_SELF'] ?>" <?php echo "<table border =\"1\">\n"; for($i=0; $i<$sarakkeita; $i++) { $fn=mysql_field_name($tulos, $i); $fv=@mysql_result($tulos, 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\""); echo (" value=\""); echo (htmlspecialchars($fv) ."\">"); echo("<br>\n"); } echo("</td>\n</tr>\n"); echo("</table>\n"); } echo (painikkeet($id)); echo ("</form>"); } /****************************************************/ 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; } /****************************************************/ function hae_muokattava_data($id) { /* Lisättäessä uutta tietuetta */ $id=addslashes($id); $sql="SELECT * FROM henkilot WHERE tunnus= '$id'"; $tulos=query($sql); if($tulos) { muokkauslomake($tulos, $id); } } /****************************************************/ function listaa_henkilot($sukunimi) { if(isset($_POST['snimi_form'])) { /*Lähetetään kyselyn mukaiset tiedot lomakkelta*/ $_POST['snimi_form'] =addslashes($_POST['snimi_form']); $kysely = "SELECT tunnus, sukunimi, etunimi, email"; $kysely .= " FROM henkilot WHERE sukunimi"; $kysely .= " LIKE '%".$_POST['snimi_form']."%'"; } else { $kysely = "SELECT tunnus, sukunimi, etunimi, email"; $kysely .= " FROM henkilot"; } $tulos=query($kysely); if(!$tulos) { echo "Kyselyssä tapahtui virhe!"; exit; } sql_tulokset_taulukkoon($tulos); } /********* Pääohjelma ***************************************/ //muodostetaan yhteys tietokantapalvelimeen $yhteys = mysql_connect("localhost","root") or die("Yhdistäminen ei onnistunut!" . mysql_error()); if(isset($yhteys)) { echo "SQL yhteys saatu!"; } //valitaan tietokanta "osoitteet" mysql_select_db("osoitteet", $yhteys) or die("Tietokantaa ei löytynyt!"); if(!isset($_POST['snimi_form'])) $_POST['snimi_form'] = ""; lomake($_POST['snimi_form']); switch($action) { case "Muokkaa": hae_muokattava_data($id); break; case "Lisaa": hae_muokattava_data($id); break; case "Tallenna": lisaa_uusi_tietue($tunnus, $sukunimi, $etunimi, $osoite, $puhnumero, $email); case "Tallenna muutokset": paivita_tietue($tunnus, $sukunimi, $etunimi, $osoite, $puhnumero, $email); break; case "Poista": poista_tietue($tunnus); break; default: listaa_henkilot($_POST['snimi_form']); hae_muokattava_data($id); } ?>
Ko. "virhe"ilmoitukset ovat noticeja, siis huomautuksia, ei varsinaisia virheitä.
Tarkistamalla, että ko. muuttujat ovat olemassa (tai kääntämällä noticet pois, mikä on ainakin tuotantopalvelimissa erittäin hyvä idea), ts. if(isset($palle)) { echo $palle;} voit välttää nuo.
Lisäksi suosittelen viittaamaan osoiteriviltä tuleviin muuttujiin $_GET['nimi'] $nimi-tyylin sijasta. Jälkimmäinen tapa vaatii tietoturva-aukkona tunnetun register_globals-asetuksen päälläoloa, joka kannattaa omasta palvelimestaan vääntää pois päältä (oletuksenahan se on muuten ollut sitä versiosta 4.2.0 lähtien).
Ja kun ens kerralla lähetät koodia, käytäthän kooditageja.
harma kirjoitti:
$action muuttujaan ei tule mitään arvoa eikä myöskään $id muuttujaan. Mikähän vikana.
Arvaan, että juurikin se, ettei register_globals ole päällä. Eikä sitä kannatakaan laittaa, vaan käytä noita $_GET ja $_POST-tauluja.
error_reporting(0) ni ei enää itke virheistä/huomautuksista :p en nyt muista sitä mikä ottaa pelkät noticet pois. (en suosittele error_reporting(0))
Aloittelijoille varsinkin on typerää laittaa noticet päälle. Sotkee vaan päätä turhilla asioilla liikaa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.