Morjens,
Tarkoitukseni olisi tehda nettisivusto jossa voisi lukea ja kirjoittaa arvosteluja TV-sarjoista. Alkuun paaseminen on nyt hiukan hankalaa kun en tieda etta minkalainen tietokanta taulu kannattaisi tehda. Sivusto toimisi niin, etta valitsen vaikka pudotus valikosta sarjan nimen ja sitten tekstikenttaan kirjoittaisin arvostelun. Sitten kun haluan vain lukea arvosteluja niin valitsen "lue arvosteluja"-pudotusvalikosta sarjan nimea niin sivulle tulostuisi kaikki sille sarjalle annetut arvostelut.
Onko tama ihan typera tapa toteuttaa tuollainen homma? Loisin itselleni admin-sivuston jossa voisin lisata/poistaa sarjoja. Elikka takaisin siihen tietokanta tauluun... miten se kannattaisi toteuttaa jottakun valikosta valitsen sarjan ja kirjoitan arvostelun niin sivusto osaa lisata arvostelun oikealle sarjalle ja sama homma arvosteluja luettaessa.
Toivottavasti selityksestani saa selvaa. Otan avosylin kaikenlaiset neuvot ja vinkit vastaan. Kiitos jo etukateen!
-Matti
Tee tietokantaan erillinen taulu sarjojen nimille, josta listaat ne loopilla sitten <select>:iin arvostelua syöttäessä.
Tätä taulua ylläpidät sitten siinä admin-osiossasi.
Arvostelutauluun sitten myös kenttä sarjan nimelle ja tietenkin itse arvostelu ja mitä muita vapaavalintaisia kenttiä sie sinne haluut survoa.. päivämäärä and such and such..
edit: elikkä siis
<select name='nimi'>
<?
$nimet = mysql_query("SELECT nimi FROM sarjanimet");
for ($i=0; $i<mysql_num_rows($nimet); $i++){
echo "<option>".mysql_result($nimet,$i)."</option>";
}
?></select>
ja tuon selectin arvon sitten haet ja syötät tietokantaan arvostelun yhteydessä.
Minä varmaan tekisin kaksi taulua: yhdessä taulussa on kaikki arvosteltavat sarjat ja toisessa taulussa on kaikki arvostelut. Jokaisella sarjalla on oma tunnusnumero, jolla siihen voidaan viitata arvostelussa. Silloin tietokannasta voidaan helposti hakea tietyn sarjan arvostelut.
Esim. jos jonkin sarjan tunnusnumero on 123, siihen liittyvät arvostelut voidaan hakea näin:
SELECT * FROM arvostelut WHERE sarjaid = 123
Neuvojen mukaan paatin tehda kaksi taulua. (sarjoille ja arvosteluille).
Suunnittelmana olisi luoda kolme kenttaa joihin voi syottaa tietoa: arvostelu, kirjoittajan nimi, s-posti. TV-Sarja jolle arvostelu kirjoitetaan valitaan pudotus valikosta (pudotusvalikkoon haetaan sarjojen nimet kannasta.)
Joten nayttaako tallaiset taulut kayttokelpoisilta:
Taulu "Sarjat"
auto_id int(11) NOT NULL auto_increment,
id int(11) NOT NULL,
time DATETIME NULL,
name varchar(25) NULL,
email char(80) NOT NULL,
primary key (auto_id)
Taulu "Arvostelut"
auto_id int(11) NOT NULL auto_increment,
id int(11) NOT NULL,
review varchar(600) NOT NULL,
primary key (auto_id)
Itse en nyt ole oikein varma etta olenko oikeilla raiteilla noiden taulujen kanssa. Varsinkin molemmissa tauluissa toi auto_id ja erillinen id hiukan askarruttaa (kaverini neuvoi noin tekemaan mutta vahan epailen tuota toteutus tapaa).
Minkalaiset taulut minun kannattaisi tehda?
Nuo erilliset id kentät ovat sikäli turhia että tuo auto_id ajanee saman asian. Mutta eikö tuo kirjoittajan nimi ja sähköposti kannattaisi laittaa tuohon arvostelu tauluun? Näin saataisiin sen kyseisen arvostelun kirjoittaneen tiedot eikä sarjan lisänneen tiedot. Ja varcharrin suurin pituus taisi olla 255 merkkiä jollen kovin väärin muista. Itse käyttäisin BLOBbia. Sekä arvostelut tauluun olisi hyvä pistää kenttä jonka perusteella nähdään että mikä sarja on kyseessä.
Eli jotain seuraavanlaista:
"Sarjat"
id integer auto_increment,
time DATETIME NULL,
name varchar(25) NULL, <-- sarjan nimi siis
primary key (id)
"Arvostelut"
id integer auto_increment,
review BLOB,
time DATETIME NULL,
name varchar(25) NULL,
email varchar(80) NOT NULL,
serie integer NOT NULL,
primary key (id),
foreign key(serie) references sarjat(id)
edit: Kirjotusvirheitä
No nyt huomasin etta olin tekemassa noita tauluja ihan vaarin eli nyt arvostelijan tayttamat tiedot menevat "Arvostelut" tauluun ja vain mina (admin) teen muutoksia "Sarjat" tauluun.
Nyt vain sitten teen adminin kayttoon tarkoitetun sarjojen syottolomakkeen jossa on vain yksi tekstikentta sarjan nimea varten. (mukavia nama a-haa elamykset) :)
Laitoin tauluni nyt nayttamaan juuri tuollaisilta kuin neuvoit.
Sitten se pudotusvalikko jonka laitan sivulleni hakee tietonsa "Sarjat" taulusta 'name' kohdasta. (eiko vain)
Kiitoksia kun selvititte "juurta jaksain" taman minulle!
mizzou kirjoitti:
Sitten se pudotusvalikko jonka laitan sivulleni hakee tietonsa "Sarjat" taulusta 'name' kohdasta. (eiko vain)
Juuri näin. Ja sitten kun teet niitä pudotusvalikon valintoja niin käytä value kenttää niissä eli: <option value="tähän_sarjan_id">tähän_sarjan_nimi</
Pari asiaa on minulle hiukan epaselvia tuosta foreign key - references kohdasta "Arvostelut" taulussa. Nyt kun syotan tietoja "arvostelut" tauluun niin mita minun pitaa INSERT INTO lausekkeeseen laittaa kun taulu nayttaa talta kuten Elekaz minulle neuvoi:
"Arvostelut" id integer auto_increment, review BLOB, time DATETIME NULL, name varchar(25) NULL, <--tama on arvostelijan nimimerkki email varchar(80) NOT NULL, serie integer NOT NULL, primary key (id), foreign key(serie) references sarjat(id)
Ja minun INSERT INTO lauseke nayttaa nyt talta:
$input = mysql_query("insert into arvostelut values ('NULL', '$review', current_date, '$user', '$email', '$table[id]')", $connection)
or die("Could not insert data because ".mysql_error());Tuossa lausekkeessa $email-muuttujan jalkeen tulee $table[id], olen laittanut "sarjat" taulun nimen "$table" nimiseen muuttujaan. Nyt kun taytan tiedot ja lahetan niin data menee tauluun mutta "serie" kohta pysyy nollana... eli eiko sen pitaisi tasmata sarjat taulun ID:n kanssa? Tarkemmin sanottuna miten saan "serie":n samaksi kuin sarjat taulun ID?
En tieda etta onko tuo $table[id] oikea tapa tuo tehda mutta ei se nyt oikein mulla tahdo toimia. (Nuo 'review', 'name' ja 'email' olen laittanut muuttujiin muuten samoilla nimilla mutta 'name' on $user)
*editoin hiukan ongelmaani (20:47)
Tuohon serie kohtaan olisi tarkoitus tulla sarjat taulusta kyisesen sarjan nimen sijasta sen sarjan id joka on valittu.
Serie kohtaan tulee vain nollia, minulta loppu keinot etta miten siihen saa toisesta taulusta sen ID:n. Lauseke joka syottaa tiedot tauluun menee seuraavalla tavalla: (laitoin if lausekkeen mukaan josta nakyy miten taulussa olevat nimet vaihtuvat muuttujiksi)
if(isset($_POST['submit']))
{
$review = trim($_POST['review']);
$user = trim($_POST['user']);
$email = trim($_POST['email']);
//checking if magic_quotes_gpc is ON. (no need to escape quotes)
if(!get_magic_quotes_gpc())
{
$review = addslashes($review); //escaping single quotes
$user = addslashes($user);
}
//input data-->DB
$input = mysql_query("insert into $table2 values ('NULL', '$review', current_date, '$user', '$email', '$table[id]')", $connection)
or die("Could not insert data because ".mysql_error());Selvennyksen vuoksi kerrottakoon etta taulujahan minulla on kaksi ja ne ovat myos muuttujina, vaihdos tapahtuu erillisessa tiedostossa --> tassa patka jossa se tapahtuu:
$table = "shows"; //name of the "show" table $table2 = "review"; //name of the "review" table
Sori kun on kommentoinnit ja muut lontoon kielta mutta kun asun taalla rapakon takana niin yritan php-hommissa pysytella englannissa.
Seuraavassa esimerkkiä. Osaat varmaan tuosta muokata omaan käyttöösi sopivaksi.
$sql="SELECT id, name FROM sarjat ORDER BY name ASC"; $sql_q=mysql_query($sql); $select="<select name=\"sarja\">"; while($r=mysql_fetch_array($sql_q)){ extract($r) $select.="<option value=\"$id\">$name</option>"; } $select.="</select>";
Tuosta on sitten helppo ottaa $_POST['sarja'](tai get) joka sitten pistetään siihen serieen tietokannassa.
Sain vihdoinkin toimimaan. Sovelsin tuota Elekazin ohjetta. Hiukan tuosta tuli erinlainen:
$sql = mysql_query("SELECT id, name FROM $table ORDER BY name");
//start the select box
echo "<select name='id'>\n";
while ($row = mysql_fetch_array($sql)) {
$id = $row['id'];
$name = $row['name'];
echo "<option value='$id'>$name</option>\n";
}
echo "</select>";ja sitten kun lahetys nappia on painettu niin koodi tekee tallaista:
//if submit is clicked, execute.
if(isset($_POST['submit']))
{
$review = trim($_POST['review']);
$user = trim($_POST['user']);
$email = trim($_POST['email']);
$id = $_POST['id'];
//checking if magic_quotes_gpc is ON. (no need to escape quotes)
if(!get_magic_quotes_gpc())
{
$user = addslashes($user); //escaping single quotes
$review = addslashes($review);
}
//input data into database
$input = mysql_query("insert into $table2 values ('NULL', '$review', current_date, '$user', '$email', '$id')", $connection)
or die("Could not insert data because ".mysql_error());Taulut tekasin uusiksi ku en meinannu saada yhteytta pelaamaan niiden valilla. Jos noissa on huomauttamista niin ihmeessa kertokaa:
***Sarjat taulu (shows/$table)*** id integer NOT NULL auto_increment, time DATETIME NULL, name varchar(25) NULL, primary key (id) ) ENGINE=INNODB
***Arvostelut taulu (review/$table2)*** id integer auto_increment, review BLOB, time DATETIME NULL, name varchar(25) NOT NULL, email varchar(80) NOT NULL, serie integer NOT NULL, INDEX (serie), foreign key (serie) references $table (id), primary key (id) ) ENGINE=INNODB
Piti tuon kanssa taistella (kun ei osaa niin ei osaa) :) Nyt sitten alan tekemaan hakuscriptia jolla haen noita arvosteluja sarjan nimen perusteella.
Kiitoksia Elekaz (ja muut vinkkeja antaneet) neuvoista!!
(edit: lisasin taulut)
Terve taas,
sivustoni toimii jo periaatteessa kuten pitaa mutta seuraavanlainen ongelma tuli eteen:
Valitsen pudotusvalikosta tv-sarjan ja painan laheta nappia niin valitun tv-sarjan arvostelut tulostuu pudotusvalikon alapuolelle. Homma toimii tahan asti mutta koska haluan vain kymmenen arvostelua yhdelle sivulle ja seuraavat kymmenen sivulle kaksi ja jne. Ensimainen sivu nakyy mutta kun painan sivunumeroa kaksi niin arvostelut eivat tulostu sivulle. Vain pudotusvalikko nakyy.
Uskoisin ongelman aiheutuvan tasta lauseesta: $_SERVER['PHP_SELF'] Koska tuo on koodissa kaksi kertaa. (arvosteluja haettaessa ja sivunumeroinnin linkityksessa)
En osannut muutakaan ratkaisua kayttaa joten tahan paadyin mutta en saa sivun kaksi arvosteluja tulostumaan.
Tassa on sivun koodi:
<? include("header.php") ?> <FORM METHOD="post" ACTION="<? echo $_SERVER['PHP_SELF'] ?>"> <table> <tr> <td><b>Select show:</b></td> <td> <? //connect to server $connection = mysql_connect($server, $db_user, $db_pass) or die("Could not connect to mysql because ".mysql_error()); //database mysql_select_db($db_name) or die("Could not select the database because ".mysql_error()); $sql = mysql_query("SELECT id, name FROM $table ORDER BY name"); //starting the select box echo "<select name='id'>\n"; while ($row = mysql_fetch_array($sql)) { $id = $row['id']; $name = $row['name']; echo "<option value='$id'>$name</option>\n"; } echo "</select>"; ?> </td> <td colspan='2'><input type='submit' id='submit' name='submit' value='Select' /> </td> </tr> </table> </form> <? if(isset($_POST['submit'])) { //messages per page $rpp = 10; //reading the page number if(isset($_GET['page'])) { $page = $_GET['page']; } $page = intval($page); $result = mysql_query("SELECT * FROM $table2 WHERE serie = '$_POST[id]' ORDER BY time desc limit ".($page * $rpp).", {$rpp}"); //how many reviews $res = mysql_query("select review from $table2 WHERE serie = '$_POST[id]'"); $amount = mysql_num_rows($res); //create numbered list if more than one page if ($amount > $rpp) { echo "<p>"; for($i = 0; $i < $amount / $rpp; $i++) { //echo vertical lines between page numbers if ($i <> 0) { echo " | "; } //echo current page number bold if ($page == $i) { echo "<b>".($i + 1)."</b>"; //link to other page }else{ echo "<a href=\"{$_SERVER['PHP_SELF']}?page={$i}\">".($i + 1)."</a>"; } } echo "</p>"; } //echo data from db and build table if (mysql_num_rows($result)) { echo "<table width=\"575\" cellpadding=3 cellspacing=3 border=1px>\n"; while ($qry = mysql_fetch_array($result)) { //prevent nasty links :) $qry[name] = htmlspecialchars($qry[name]); $qry[review] = htmlspecialchars($qry[review]); echo "<tr><td width=\"100\" align=\"left\">$qry[time]</td>"; echo "<td><a href=\"mailto:$qry[email]\" target=\"_blank\">$qry[name]</a>: "; $review1 = $qry[review]; //this line and the next line cuts the comments | $newreview = wordwrap($review1, 40, "\n", 1); //after 40 letters. echo "$newreview\n"; echo "</td></tr>\n"; } //end while loop echo "</table>\n"; } //end "if (mysql_num_rows($result)" } //end "if(isset($_POST['submit']))" ?> <? include("footer.php") ?>
-Matti
$res = mysql_query("select review from $table2 WHERE serie = '$_POST[id]'");Taitaapa johtua tuosta rivistä; etsitään $_POST-taulukon kentän mukaan tietokannasta, mutta toisella sivulla postia ei ole lähetetty, jolloin SQL-lause jää vajaavaiseksi.
Yksi tapa on pistää sivun vaihtaminen tapahtumaan lomakkeen napeista, jolloin mukana voidaan viedä myöskin muita post-muuttujia, esim. hidden-kenttinä.
Toinen tapa on ottaa valinta sessio- tai keksimuuttujaan talteen.
Kiitoksia Siirappi neuvoista. Nyt tajusin etta eihan se POST tietenkaan mene sinne toiselle sivulle... en ajatellut tuota yhtaan.
Yritin kikkailla noilla kekseilla mutta ei siita tullut kuin virhetta virheen peraan. (en ole niita ennen kayttanytkaan). Joten voisiko joku hiukan osoittaa suuntaa miten minunn tama nyt kannattaisi tehda.
Käytä gettiä postin sijasta. Lisää linkkeihin perään esim &sivu=2 jos linkki osoittaa sivulle kaksi ja &sivu=3 jos taas kolmossivulle jne jne.. eli osoite.com/jotain.php?sivu=2 tai osoite.com/index.php/p=arvostelut&sivu=2. Sitten muutat vain tuosta sql lauseesta $_POST['id'] --> $_GET['id']
Kiitos Elekaz taas kerran neuvosta. Nyt kylla loppuu minulta taito tehda noita linkkeja. Talla hetkella sivunumeroissa olevat linkit nayttaa talta:
echo "<a href=\"{$_SERVER['PHP_SELF']}?page={$i}\">".($i + 1)."</a>";
Miten minun pitaisi tuo linkki tehda?
Niin, kyselyyn $_POST["id"]:n sijasta $_GET["id"] ja tv-sarjan valinta -lomakkeen methodiksi get.
Ja linkki silloin meneee:
echo "<a href=\"{$_SERVER['PHP_SELF']}?id={$_GET["id"]}&page={$i}\">".($i + 1)."</a>";Tuo & linkissä on HTML-tunniste &-merkille, jonka esim. validaattorit vaativat validiin sivuun.
Muutin nuo POSTit GETeiksi ja tuon linkin tuollaiseksi kuin neuvoit ja nyt sivut toimivat juuri niin kuin ne toimi POSTilla ja vanhalla linkilla eli kun painan sivunumeroa kaksi niin kaikki pudotusvalikon alapuolelta haviaa. Eli jotenkin se ei suorita koko koodia / tiedot eivat liikahda seuraavalle sivulle. Tai niin mina ainakin luulen :)
Yritin leikkia myos hidden kentilla mutta ei siitakaan tullu kuin virheilmoituksia. Vielako loytyisi vinkkeja?
Kuhan näitä välejä viljelen, PHP_SELF->SCRIPT_NAME ja taulukon arvoihin viittaminen heittomerkeillä.
echo '<a href="' . $_SERVER['SCRIPT_NAME'] . '?id=' . $_GET['id'] . '&page=' . $i . '">' . ($i + 1) . '</a>';
// tai sama printf/sprintf:llä
echo sprintf('<a href="%s?id=%d&page=%d">%d</a>', $_SERVER['SCRIPT_NAME'], $_GET['id'], $i, $i+1);Ja vielä ennen tuota tarkastetaan, että $_GET-taulukossa on avain 'id'.
Kokeilin noilla molemmilla ja sama tulos eli kun sivunumeroa painaa niin kaikki katoaa pudotusvalikon alapuolelta eli sarjan nimi ja arvostelut.
Kiitoksia tsuriga vinkista, en ole tuolla tavalla ennen yrittanytkaan... koko ajan tassa yritan opetella uutta.
Aihe on jo aika vanha, joten et voi enää vastata siihen.