Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: mysql-taulukkoon lisäys/kentän tarkastus

novis [10.01.2006 09:58:22]

#

Moi,

Olen todellakin alkaja php/mysql -ohjelmoinnissa joten yrittäkää kestää mukana.

Eli, minulla on sessio-pohjainen sivu ja mysql-taulukko johon tallennetaan käyttäjän <form>:lla syöttämiä tietoja. Taulukossa on kentät: userid foo1 foo2 foo3 foo4 foo5 foo6 foo7 foo8

Seuraavan pätkän tulisi tarkastaa onko kentässä joku arvo, jos sillä on arvo niin liikutaan elseif:llä seuraavaan tyhjään kenttään mihin arvo lisätään. Kenttiä on kahdeksan, joiden täyttymisen jälkeen arvoja ei voisi enää syöttää ja ohjelma antaisi tästä ilmoituksen, mahdollisesti pyytäisi poistamaan/muokkaamaan olemassa olevia tietoja. Osaan (varmastikkin) tuon koko taulukon tarkastuksen tehdä, mutta ongelmana on tuo yhden kentän arvon tarkastus. tässä on nyt kahden ensimmäisen kentän tarkastukset (niinkuin osaan ne tehdä) josta sitten ajattelin kopy/pasteta kaikille kahdeksalle kentälle.

Eli, saan annettua foo1 -kentälle arvon, mutten saa tarkastus skriptiä ymmärtämään että se on jo "varattu". Skrpiti kirjoittaa aina vanhan arvon yli, siirtymättä seuraavaan vapaaseen kenttään. Ongelma on varmaan jossain empty():n kohdalla? Tulisiko kentille antaa (phpmyadmilla,mitä käytän) joku default arvo, mikä tarkastetaan? Jos kenttä on tyhjä niin minkä arvon se palauttaa silloin?

ei tarvitse valmista koodia kirjoittaa, mutta rautalanka on tervetullutta ;)

if ($_POST['id'])
	{
		//1. tarkastus/lisäys
		if (!$sql = mysql_query("SELECT foo1 FROM bar WHERE userid = '$uid'"))
			{ echo "could not connect" . mysql_error(); }

			$result = mysql_query($sql);
			if (empty($result)) //jos tyhjä niin UPDATE
				{
					if ($sql = mysql_query("UPDATE bar SET foo1 = '$_POST[id]' WHERE userid = '$uid'"))
					{
						ilmoitus('1st foo added'); //jscript-ikkuna ilmoittaa foo1:n lisäyksestä
					}

				}
		//2. tarkastus/lisäys
		elseif (!$sql = mysql_query("SELECT foo2 FROM bar WHERE userid = '$uid'"))
			{ echo "could not connect" . mysql_error(); }

			$result = mysql_query($sql);
			if (empty($result))  //jos tyhjä niin UPDATE
				{
					if ($sql = mysql_query("UPDATE bar SET foo2 = '$_POST[id]' WHERE userid = '$uid'"))
					{
						ilmoitus('2nd foo added'); //jscript-ikkuna ilmoittaa foo2:n lisäyksestä
					}
				}
		elseif...
		jne.

	}

LazyJones [10.01.2006 10:39:24]

#

Joo, emptyn kohdallahan se klikkaa. Annat empty-funktiolle parametrina kyselyn tuloksen (result) joka on yksi tietokannan rivi, jos kyseinen ID löytyy. Ja jos se löytyy, niin $result ei ole tyhjä, vaikka foo1 kenttä olisikin. kentän tyhjyyden tarkistaminen menisi vaikka näin:

$row = mysql_fetch_array($result)
if(empty($row[haka]'foo1'[/haka]) ...

Ja ehkäpä tuon saisi siistimmmäksi kirjottamalla jonkun funktion, joka ottaa parametrina sarakkeen nimen ja niin edelleen, mutta...

Vaikuttaa hieman huonolta tietokantasuunnittelulta jos täytyy arvoja tuolla tavalla lisätä eri sarakkeeseen sen perusteella mikä on "vapaana". Periaatteena on että identtinen tieto menee yhteen sarakkeeseen. Tarkemmin kun ei tiedä mitä olet tekemässä, niin vaikea on sen pidemmälle lähteä suunnittelussa neuvomaan. Mutta tuo periaate vaikuttaa erittäin huonolta.

Olga [10.01.2006 10:45:20]

#

En nyt sen kummemmin ota muuhun toteutukseen kantaa, mutta jos NULL-arvot on näissä kentissä sallitut, voit käyttää sitä tietoa hyväksesi. Eli

SELECT COUNT(*) AS lkm FROM bar WHERE userid = '$uid' AND foo1 IS NULL

jolloin

$lkm = mysql_result($result, 0, "lkm");

Eli jos saatuja rivejä on 0, kenttää ei silloin ole täytetty.

Edit: hitailua

LazyJones [10.01.2006 10:50:23]

#

Jos ehtona on 'foo1 IS NULL' niin eikös saatujen rivien lukumäärä ole 1, jos kenttä on täyttämättä?

novis [10.01.2006 11:27:02]

#

Kiitos LazyJones :) tuota NULL:ia kokeilin myös, mutta sama ongelma oli, eli palautti 1:n aina, enkä tajunnut miksi. Nyt toimii. (Toteutuksella ei tosiaan varmaan kauneuskisoja voitettaisi).

Olga [10.01.2006 11:48:44]

#

LazyJones, luonnollisestikin juuri niin. Pahoittelen virhettä :)

Vastaus

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

Tietoa sivustosta