Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: MySQL: automaattinen sarakkeen tarkistus

aksun [23.05.2013 14:24:32]

#

Heippa,

Mulla on tässä tämmöne sql koodinpätkä, joka tekee uuden rivin tauluun, ja arpoo lohkon(L1, L2, L3) automaattisesti. Haluaisin kuitenkin koodin tarkistavan, onko yhden lohkon jäseniä lisätty liikaa(esim. 5 jäsentä tulee yhteen lohkoon). Sittenku lohko on täyttynyt, niin koodi arpoisi jäljelle jäävistä kahdesta lohkosta toisen. Tässä koodi:

INSERT INTO pelaajat SET nimi = '$nimi', tunnus = '$tunnus', posti = '$posti', ip = '$ip', voitot = '0', haviot = '0', tasapelit = '0', pinnat = '0', lohko =  CASE FLOOR(RAND()*3) WHEN 0 THEN 'L1' WHEN 1 THEN 'L2' WHEN 2 THEN 'L3' END, muokkaaja = '$nimi';

Mitenkäs tämmöisen voisi toteuttaa?

Grez [23.05.2013 15:27:27]

#

Yleensä helpointa se on toeuttaa tietokannan ulkopuolella.

Eli jos tuo kysely on tarkoitus ajaa jostain ohjelmakoodista, niin arvotkin sen lohkon ohjelmakoodin puolella ja haet montako siellä on jo ennestään.

Toki sen voi tehdä tietokannankin päässäkin ihan samalla logiikalla.

aksun [23.05.2013 17:41:41]

#

OK, ensin ajattelinkin että käytän php:n array_randia mutta sitten löysin tän mysql soluutionin netistä. Miten voisin löytää rivit lohkon perusteella taulusta phptä käyttäen? Arpomis jutskan jo löysinkin:

<?php
$lohkot = array("L1", "L2", "L3");
$randomisoi = array_rand($lohkot, 1);
$tulos = $lohkot[$randomisoi];
?>

Tarvitsisin myös ehkä vähän lisätietoja tästä asiasta.

Lebe80 [23.05.2013 17:51:23]

#

1) Laske kuinka monta riviä kussakin lohkossa on.
2) Älä lisää $lohkot -muuttujaan niitä rivejä, joissa on jo viisi riviä.
3) Arvo lohko ($tulos)

edit:
Itse en käyttäisi "lohkoina" merkkijonoja vaan ihan numeroita, jotka voisi vaikkapa asettaa nekin suoraan omaan tietokantatauluunsa.

aksun [24.05.2013 19:35:38]

#

Noh, katsoin tätä asiaa, ja totesin että tää oli vähän liian monimutkanen systeemi tehtäväks. Joten olisko se helpompaa vaa laittaa järjestyksessä ilmoittautumisen mukaan(ensimmäiset 5 pelaajaa L1:n seuraavat L2 jne). Miten teidän mielestä kannattais tommone systeemi tehdä?

Lebe80 [29.05.2013 11:21:08]

#

aksun kirjoitti:

Miten teidän mielestä kannattais tommone systeemi tehdä?

Lebe80 kirjoitti:

1) Laske kuinka monta riviä kussakin lohkossa on.
2) Älä lisää $lohkot -muuttujaan niitä rivejä, joissa on jo viisi riviä.
3) Arvo lohko ($tulos)

edit:
Itse en käyttäisi "lohkoina" merkkijonoja vaan ihan numeroita, jotka voisi vaikkapa asettaa nekin suoraan omaan tietokantatauluunsa.

Corden [08.07.2013 13:34:31]

#

Jos tietokantapalvelin tukee sisäistettyjä SQL-lauseita niin voit kiusata sitä kyselemällä lohkojen määriä;

SELECT
(SELECT COUNT(lohko) FROM pelaajat WHERE lohko LIKE 'L1') AS L1,
(SELECT COUNT(lohko) FROM pelaajat WHERE lohko LIKE 'L2') AS L2,
(SELECT COUNT(lohko) FROM pelaajat WHERE lohko LIKE 'L3') AS L3

Saat sitten yhden rivin jossa kolme saraketta; L1, L2 ja L3.

Tuon kyselyn voisi kysellä ennen insertiä ja tehdä se satunnaisuuden laskeminen php:lla, esim tekemällä arrayn johon laittaa lohkot joissa on tilaa, eli siihen tulee joko L1,L2,L3 ja arrayn pituus määrittää miten isoa noppaa heitetään (eli 3), tai siihen tulee esim L1,L3 ja silloin heitetään 2-sivuista noppaa... valitaan kirjoitettavaksi se arvo arraystä joka tuli nopasta...

Toinen vaihtoehto ois upottaa koko möykky MySQL stored proceduuriksi, mutta niitä en ole tehnyt ja nyt on vain tuotannon tietokantoja ulottuvilla...
Mutta tuolta esim tutoriaalia;

http://www.mysqltutorial.org/mysql-stored-procedure-tutorial.aspx
http://net.tutsplus.com/tutorials/an-introduction-to-stored-procedures/

Funktio olisi kätevin, jonka kutsulla vain korvaisi tuon INSERT-lauseen CASE-lohkon. Tai sitten tehdä kokonaan oma proceduuri joka ottaa vastaan nuo sun muuttujat (voisit siten laittaa noi vakio-arvot sinne myös, jolloin PHP:ssa kutsu olis tyyliin "CALL InsertPlayer($nimi,$tunnus,$posti,$ip)" ja loppu tapahtuu proceduurissa...)


Edit:
Tajusin sun SQL-lauseen tyylistä, että voisit lukea tuon;
https://www.ohjelmointiputka.net/oppaat/opas.php?tunnus=mysqlphp02

PDO ja prepared statement... jos ajat saman insert-lauseen monta kertaa niin säästäisit paljon palvelun resursseja suorittamalla niitä valmisteltuna. Lisäksi PDO huolehtisi tietoturvasta noiden stringimuuttujien osalta sun puolesta.

Vastaus

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

Tietoa sivustosta