Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: SQL kysely, haku tietokannasta ehtojen mukaan

manninen [03.07.2014 21:47:12]

#

Heissan!

1. Minulla on tietokannassa kenttä, jossa on arvot 1,2,3,4,5
2. Minulla on kysely, jonka pitäisi hakea tietokannasta tiedot jos osuu kentässä johonkin nuista arvoista. Jos ei osu, ei hae.
3. Hakuehtona on aina vain yksi nuista numeroista

$k = "SELECT koulutus, osallistujat FROM training";

   if(!$t = mysql_query($k))
   {

     print mysql_error();
     return;

   }

   print '<table border="1">';

     while($r = mysql_fetch_assoc($t))
     {

      print $id;

       $arr[] = $r['osallistujat'];


       if(in_array($id, $arr))
       {

         print '<tr><td>'. htmlspecialchars($r['koulutus']).'</td></tr>';

       }


     }

   print '</table>';

-tossu- [03.07.2014 22:08:14]

#

Tarkoitat ilmeisesti, että sinulla tietokannassa taulu, jossa on sarake, jossa voi olla jokin arvo väliltä 1-5. Ja taulusta pitäisi saada haettua ne rivit, joissa sarakkeen arvo on haluttu luku? Sehän onnistuu aivan normaalilla WHERE sarake = 3 -tyylisellä ehdolla. Lue MySQL ja PHP -oppaasta ainakin kolme ensimmäistä osaa. Siellä neuvotaan myös PDO:n käyttö.

Metabolix [03.07.2014 22:12:00]

#

En ehkä ymmärrä tilannetta.

1. Onko sinulla oikeasti yhdessä kentässä monta lukua? Ei pitäisi.
2. Kyselysi tuossa hakee kaikki rivit.
3. Mitä ihmettä? Ei kyselyssäsi ole mitään ehtoja.

Jos nyt tarkoitus oli (kuten koodista voi jotenkin hyvällä tahdolla kuvitella) hakea kaikki rivit ja PHP:llä tarkistaa, onko osallistujat-sarakkeen pilkulla erotelluissa arvoissa $id, tarkistuksen pitäisi ehkä näyttää tältä:

if (in_array($id, explode(",", $r["osallistujat"]))) {
	// id löytyy pilkutetusta listasta.
}

Jos haluat tarkistaa jotain tietokannassa (tai ylipäänsä tehdä tietokannan oikein), sinun pitää tehdä kunnollinen relaatio. 1:1-relaatio: yhdellä koulutuksella on yksi osallistuja, joten laitetaan vain yksi luku tuohon kenttään. 1:N-relaatio: jokainen osallistuja voi osallistua vain yhteen koulutukseen, joten laitetaan osallistujan tietoihin, mihin koulutukseen hän osallistuu. N:N-relaatio: jokaisella koulutuksella on monta osallistujaa, joten tehdään uusi taulu, jossa on koulutuksen id ja osallistujan id ja siis jokaisella koulutuksella ja jokaisella osallistujalla voi olla tässä taulussa useita rivejä.

N:N-relaatiossa hakusi näyttäisi tältä:

-- Valitaan ne koulutukset...
SELECT koulutus.* FROM koulutus
-- ...joiden osallistujalistassa...
JOIN koulutus_osallistuja_map ON koulutus_osallistuja_map.koulutus_id = koulutus.id
-- ...on haluttu osallistuja.
WHERE koulutus_osallistuja_map.osallistuja_id = ?

manninen [03.07.2014 22:24:39]

#

Metabolix

Ymmärsit juuri oikein, mitä tein! Nyt ymmärrän, että tein sen täysin väärin. Kiitoksia, tottakai kannattaa käyttää N-N-relaatiota. Olet 100% oikeassa :)

- Juups, ja ei ollut hakuaehtoa kuten otsikossa ilmaisin. Se puuttui koodin pätkästä, jonka toimitin. Harhaanjohtavaa otsikointia, Kiitos jälleen kerran, teen korjauksen.

* JA TATTIS, ONKELMA RATKAISTU *

p99o [03.07.2014 23:01:49]

#

manninen kirjoitti:

$k = "SELECT koulutus, osallistujat FROM training";

Mielellään yksi kieli käyttöön (eli englanti?). Ihmeellistä katseltavaa koodit ja tietokannat joissa osa suomeksi ja osa englanniksi.

manninen [04.07.2014 11:56:52]

#

Tämäkin on totta, mutta tekevällä lipsahtaa. Nuo korjaa äkkiä, mutta hyvä huomi. Kiitos.

Vastaus

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

Tietoa sivustosta