Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Tietueiden päivittäminen

Sivun loppuun

harma [06.05.2006 15:02:16]

#

Eli ongelmani on (ainakin) seuraavanlainen. Kyseessä on tietokanta scripti jolla tulisi voida muokata tietueita (funktiot niitä varten). Homma näyttäsi toimiva eli menee muokkaus, poisto ym. tiloihin mutta ei tee mitään muutoksia/lisäyksiä tietokantaan...

<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';
//error_reporting(0);

/****************************************************/
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);
	$kysely="SELECT * FROM henkilot WHERE tunnus= '$id'";
	$tulos=query($kysely);
	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);
}

/****************************************************/
function lisaa_uusi_tietue($tunnus, $sukunimi, $etunimi,
													 $osoite, $puhnumero, $email)
{
//	tarkista_syotteet($tunnus, $sukunimi, $etunimi,
//										$osoite, $puhnumero, $email);
	$sql= "INSERT INTO henkilot VALUES
	      (
	       '$tunnus',
				 '$sukunimi',
				 '$etunimi',
				 '$osoite',
				 '$puhnumero',
				 '$email'
         )";
	$tulos= query($sql);
}
/****************************************************/
function paivita_tietue($tunnus, $sukunimi, $etunimi,
												$osoite, $puhnumero, $email)
{
	$sql = "UPDATE henkilot
					SET sukunimi='$sukunimi',
    					etunimi='$etunimi',
				 			osoite='$osoite',
				 			puhnumero='$puhnumero',
				 			$email='$email'
				 			WHERE tunnus='$tunnus'";
	$tulos= query($sql);

}
/****************************************************/
function poista_tietue($tunnus)
{
  $tunnus=addslashes($tunnus);
  $sql="DELETE FORM henkilot WHERE tunnus=$tunnus";
  $tulos= query($sql);
  if(!$tulos)
	{
		echo "Kyselyssä tapahtui virhe!";
		exit;
	}
}

/********* 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($_GET['action'])
{
	case "Muokkaa":
  	hae_muokattava_data($_GET['id']);
		break;
	case "Lisaa":
     hae_muokattava_data($_GET['id']);
 		break;
	case "Tallenna":
		 lisaa_uusi_tietue($_GET['tunnus'], $sukunimi, $etunimi,
											 $osoite, $puhnumero, $email);
	case "Tallenna muutokset":
		 paivita_tietue($_GET['tunnus'], $_GET['sukunimi'], $etunimi,
											 $osoite, $puhnumero, $email);
 		break;
	case "Poista":
	  poista_tietue($_POST['tunnus']);
	  break;
	default:
	  listaa_henkilot($_POST['snimi_form']);
}

?>

tsuriga [06.05.2006 16:59:46]

#

Olisit voinut jatkaa edellisessä aiheessasi. Heitin myös tonne kolmanteen aiheeseen aimo kasan parannusehdotuksia. Tästä sen verran lisää, että eikö tuo query-funkkari ole melko turha, yhden rivin koodi korvataan monella rivillä.

harma [06.05.2006 18:33:33]

#

Kiitti tsuriga vastauksesta. Ei vaan pelitä edellenkään, enkä keksi syytä=(

harma [08.05.2006 10:09:31]

#

En saa toimimaan . Voisko joku autaa... Kiitos etukäteen

lapm [08.05.2006 19:36:36]

#

Oletko jo tarkistanut että noile alifunktioillesi välittyvät parametrit oikein?

harma [09.05.2006 06:26:24]

#

lapm kirjoitti:

Oletko jo tarkistanut että noile alifunktioillesi välittyvät parametrit oikein?

Niin siinä kait se vika varmaan onkin=( en vaan tiedä miten ne tarkistettaisiin. Esimerkiksi seuraava funktio ei tulosta mitään

function poista_tietue($id)
{
  $id=addslashes($id);
  $sql="DELETE FROM henkilot WHERE tunnus='$id'";
  $tulos= query($sql);
  if(mysql_affected_rows($tulos) > 0)
	{
	  echo "Tietue poistetiin onnistuneesti\n";
	}
	else
	{
	  echo "Tietueen poistaminen ei onnistunut\n <br>";
	}
}

Voisitko vääntää rautalangasta. Kiitos

Blaze [09.05.2006 08:18:13]

#

harma kirjoitti:

en vaan tiedä miten ne tarkistettaisiin.

Tulostamalla niitten arvot?

harma [09.05.2006 12:18:22]

#

Joo kyllä minä nitä olen yrittänyt echo:lla tulostaakin. Ongelma on, että ainakaan funktiosta function poista_tietue($id) ei tulostu mitään ei edes echo "Tietueen poistaminen ei onnistunut\n. Näyttäsi aivan kuin "ohjelma" ei edes kävisi koko funktiossa...

harma [09.05.2006 16:24:07]

#

ilmeisesti function painikkeet($id)ei aseta muutujalle action mitään arvoa, joten tällöin ei koko funktiota function poista_tietue($id) käydä ollenkaan... Voisko joku auttaa

Lebe80 [09.05.2006 16:30:29]

#

debuggia peliin

eli echoa funktioiden sisällä ja funktioiden ulkoa ja vertaile tuloksia. Copy/pastea muuttujien nimiä mahdollisten kirjoitusvirheiden takia yms. Tarkkaile selaimen javaScript konsolia virheellisten javaScriptien toivossa yms.

tsuriga [09.05.2006 16:35:53]

#

EDIT: PHP ei näköjään ole kovinkaan tarkka näkyvyysalueiden kanssa. Kannattaa kuitenkin esitellä muuttujat aina ylemmissä lohkoissa, muissa kielissä (esim. Java) tämä voi olla oleellista.

Ongelmana voipi olla muuttujien näkyvyysalueet. Elikkäs

<?php
function painikkeet($id) {
/**
 * $mjono-muuttuja pitäisi esitellä tässä, koska muuten se
 * ei näy funktio-lohkolle, vain if- ja else-lohkoille
 * esim. $mjono = "";
 */
  if(on_paivitys($id))
    $mjono = "jotain";
  else
    $mjono = "jotain muuta";
  return $mjono;
  }
?>

Ps. koodia saa siistimmäksi kun otat echoista sulut pois ja aloitat ja lopetat merkkijonojen merkkaukset heitto-, ei lainausmerkillä. Rivinvaihdoissa tosin käytä lainausmerkkejä. Esim. echo '<input type="text" name="test" />'."\n". Miten lystää, eipähän näy ylimääräisiä \-merkkejä rivien keskellä.

harma [09.05.2006 16:50:07]

#

Kiiti tsuriga avusta, mutta ei auttanut=( Minäpä koitan siistiä vähän koodia.. Jos vielä voisit auttaa...

folio [09.05.2006 16:52:03]

#

Tarkistat tuon action:n GET-taulukosta vaikka lomake lähetetään POST-metodilla. Tietojen hakeminen lomakkeisiin onnistuu todennäköisesti sen takia että silloin action-muuttuja tulee URL:sta. Laita jokin tarkistus tuon switch rakenteen eteen tai sitten muutat lomakkeiden rakennetta.

Lisäksi koodissasi on tälläisia hieman epäloogia kohtia.

<form method="post" action="<?php echo $_SERVER['PHP_SELF'] ?>"
<?php
echo "<table border =\"1\">\n";

harma [09.05.2006 17:04:14]

#

Jos switch-rakenteeseen vaihtaa switch($_POST['action']) GET:in tilalle lopettaa kokonaan toimimasta. Liekö vika sitten FORM:eissa?

folio [09.05.2006 17:15:52]

#

Kyllähän tuon nyt on pakko jotain tulostaa koska tuossa on tuo default-kohta.

Lähinnä tarkoitin sitä että laitat siihen jotain tyyliin

if( isset(_POST action ) )

  action = _POST action

elseif( isset(_GET action ) )

  action = _GET action

else

  action = '';

Ja sitten tuo jatko

switch( $action )  ...

tsuriga [09.05.2006 18:49:21]

#

$_POST ja $_GET löytyy yhdessä $_REQUEST-taulukosta, mikäli tässä nyt tahdotaan, että tietojen lähettäminen on mahdollista sekä osoiteriviltä, että sivupyynnöllä.


Sivun alkuun

Vastaus

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

Tietoa sivustosta