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.