Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: MySQL-ongelma

harma [06.05.2006 11:25:17]

#

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);

}

?>

Blaze [06.05.2006 13:15:32]

#

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 [06.05.2006 13:29:43]

#

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.

T.M. [06.05.2006 14:07:59]

#

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.

Vastaus

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

Tietoa sivustosta