Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: pdo / mysql

Sivun loppuun

Cartter [11.06.2009 19:13:50]

#

$dbh = new PDO('mysql:host=*;dbname=*', *, *);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$sql = 'SELECT * FROM :channel WHERE date=:date ORDER BY id DESC';
$sth = $dbh->prepare($sql);
$sth->execute(array(':channel' => $channel, ':date' => $date));

Miksi saan tällaisen virheen:

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''tv1' WHERE date='20090611' ORDER BY id DESC' at line 1

Teuro [11.06.2009 19:17:28]

#

Annatko koko SQL lauseen, joka menee kantaan saattaa auttaa virheen selvityksessä.

Cartter [11.06.2009 19:40:54]

#

<?php

$date = date("Ymd");
$channel = 'tv1';

try {
	$dbh = new PDO('mysql:host=*;dbname=*', *, *);
	$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

	$sql = 'SELECT * FROM :channel WHERE date=:date ORDER BY id DESC';
	$sth = $dbh->prepare($sql);
	$sth->execute(array(':channel' => $channel, ':date' => $date));

	while ($result = $sth->fetchObject()) {
		echo $result->title;
	}
}
catch(PDOException $e) {
	print $e->getMessage();
	die();
}

?>

Chiman [11.06.2009 19:44:30]

#

Koko kysely on selvästi

SELECT * FROM 'tv1' WHERE date='20090611' ORDER BY id DESC

Ongelmana tuossa on taulun nimen ympärille tulevat lainausmerkit, joita ei pitäisi olla. Joku osannee neuvoa oikean ratkaisun siihen PDO:n osalta.

Sinänsä näyttää erikoiselle, että ilmeisesti joka tv-kanavalle on oma taulunsa, mutta vaikea sanoa tarkemmin tietämättä sen laajemmin.

Grez [11.06.2009 19:53:04]

#

Joo, suurin vika on suunnitteluvirhe kannassa (jokaiselle kanavalle ei pitäisi olla omaa taulua). Ratkaisu on laittaa kaikki kanavat samaan tauluun. Purkkapaikkaus on seuraava:

<?php

$date = date("Ymd");
$channel = 'tv1';

try {
    $dbh = new PDO('mysql:host=*;dbname=*', *, *);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $sql = "SELECT * FROM $channel WHERE date=:date ORDER BY id DESC";
    $sth = $dbh->prepare($sql);
    $sth->execute(array(':date' => $date));

    while ($result = $sth->fetchObject()) {
        echo $result->title;
    }
}
catch(PDOException $e) {
    print $e->getMessage();
    die();
}

?>

Tässä oletin, että $channel sisältö ei tule koskaan käyttäjältä. Jos tulisi, niin pitäisi huolethtia ettei synnyt SQL-injektioa. En myöskään katsonut sen tarkemmin että oliko siellä mahdollisesti muita virheitä.

Cartter [11.06.2009 19:57:50]

#

Chiman kirjoitti:

Ongelmana tuossa on taulun nimen ympärille tulevat lainausmerkit, joita ei pitäisi olla. Joku osannee neuvoa oikean ratkaisun siihen PDO:n osalta.

Niin... olin tekevinäni tuon kyllä aivan niinkuin php.net sivuilla opastettiin, mutta mene ja tiedä :)

Chiman kirjoitti:

Sinänsä näyttää erikoiselle, että ilmeisesti joka tv-kanavalle on oma taulunsa, mutta vaikea sanoa tarkemmin tietämättä sen laajemmin.

Joo, joka kanavalle tosiaan tein oman taulun. Onko tuo huono ajatus? Yhteen tauluun tulee noin 300 kohtaa. Eli olisiko parempi laittaa kaikki samaan tauluun?

Edit. Juu selkeätä. Kiitoksia!

kayttaja-2791 [12.06.2009 00:18:15]

#

Cartter kirjoitti:

Chiman kirjoitti:

Sinänsä näyttää erikoiselle, että ilmeisesti joka tv-kanavalle on oma taulunsa, mutta vaikea sanoa tarkemmin tietämättä sen laajemmin.

Joo, joka kanavalle tosiaan tein oman taulun. Onko tuo huono ajatus? Yhteen tauluun tulee noin 300 kohtaa. Eli olisiko parempi laittaa kaikki samaan tauluun?

Jos useisiin tauluhin tulee samat sarakkeet, on suunnittelussa yleensä jotain pielessä. Kannattaa tutustua tietokannan normaalimuotoihin joiden noudattaminen on se yleisin suositeltu tapa:
http://fi.wikipedia.org/wiki/Tietokannan_normalisointi

(wikipedia on tässä aika huono lähde, kannattaa googlettaa jokin toinen opas aiheesta, aihe kuitenkin on tärkeä tietokannoista puhuttaessa)

Teuro [12.06.2009 11:25:42]

#

Putkassa olisi selkeästi tilausta tietokanta (mysql) opasta, jossa olisi kattavasti kerrottu isohkon tietokannan rakenteen suunnittelu, sekä ohjauslogiikka ohjelmointikielellä (php). Itseäni kiehtoisi alkaa tekemään tuota opasta, mutta kun tuo kirjallinen ulosanti on välillä kohtuttoman huonoa, niin ehken kuitenkaan ala tuohon ainakaan yksin.

Idean saa varastaa aivan vapaasti, jos tuntuu kiinnostusta ja kirjallinen tuotos olisi meikäläisen vastaavaa parempi.

Metabolix [12.06.2009 12:29:46]

#

Teuro kirjoitti:

Putkassa olisi selkeästi tilausta tietokanta (mysql) opasta...

Olet varmasti oikeassa. Itse en taas rupeaisi tuollaista tyhjästä tekemään, mutta jos jaksat suunnitella varsinaisen sisällön, voin auttaa kirjoittamisessa. Laita sähköpostia Antille ja vaikka minullekin, kun saat jonkinlaisen rungon tehtyä. Jos asia on hyvää, jonkinlainen opas saadaan varmasti aikaan. Pitää vain muistaa aloittaa riittävän helpoista asioista ja tehdä vaikeimmista vaikka jatko-osa.

Grez [12.06.2009 12:40:25]

#

Ihan kiva projekti jos oppassa tosiaan on tarkoitus kertoa kattavasti ja vielä isohkon tietokannan suunnittelusta. Mitä nyt noita kaupallisia oppaita aiheesta katson, niin näyttää olevan järjestäen luokkaa 600 - 900 sivua.

Äkkiseltään luulisin että "perusteet oman tietokannan suunnittelusta pienehkölle projektille, välttäen pahimmat aloittelijan virheet" voisi olla se mitä täällä tarvittaisiin. Tietty en tiedä sitten onko esim. pieni/iso -käsitykseni yhteismitallinen Teuron käsityksen kanssa. Tulkitsisin pienehköksi projektiksi sellaisen, jota ammattilainen duunaa täysipäiväiseti kuukauden tai vähemmän. Vastaavasti isohko tietokanta olisi mielestäni sellainen missä puhutaan useista sadoista tauluista ja useista gigatavuista dataa.

Teuro [12.06.2009 12:53:58]

#

Grez kirjoitti:

Äkkiseltään luulisin että "perusteet oman tietokannan suunnittelusta pienehkölle projektille, välttäen pahimmat aloittelijan virheet" voisi olla se mitä täällä tarvittaisiin. Tietty en tiedä sitten onko esim. pieni/iso -käsitykseni yhteismitallinen Teuron käsityksen kanssa. Tulkitsisin pienehköksi projektiksi sellaisen, jota ammattilainen duunaa täysipäiväiseti kuukauden tai vähemmän.

Käsityksesi isosta tietokannasta ei ole samassa mittakaavassa minun kanssa. Epäselva ilmaisu kieltämättä tuli laitettua. Tosin täällä kukaan ei ole ollut tekemässä isoa tietokantaa, joten ilmauksesi

Grez kirjoitti:

"perusteet oman tietokannan suunnittelusta pienehkölle projektille, välttäen pahimmat aloittelijan virheet".

olisi mahdollisesti oikean suuntainen työnimi tuolle projektille.

ajv [12.06.2009 13:08:40]

#

Metabolix kirjoitti:

Teuro kirjoitti:

Putkassa olisi selkeästi tilausta tietokanta (mysql) opasta...

Olet varmasti oikeassa. Itse en taas rupeaisi tuollaista tyhjästä tekemään, mutta jos jaksat suunnitella varsinaisen sisällön, voin auttaa kirjoittamisessa. Laita sähköpostia Antille ja vaikka minullekin, kun saat jonkinlaisen rungon tehtyä. Jos asia on hyvää, jonkinlainen opas saadaan varmasti aikaan. Pitää vain muistaa aloittaa riittävän helpoista asioista ja tehdä vaikeimmista vaikka jatko-osa.

Mulla on runko (My)SQL-oppaaseen olemassa, en vain ole ikinä saanut sitä valmiiksi. Voin laittaa sen jakoon jonnekkin, jos vaikka joku kirjoittaisi sen loppuun tai sitten vain antaisi itselle sen pienen motivaation puuskan. Opas kyllä olettaa SQL-perustietojen olevan kunnossa. Siinä käsitellään tietokannan suunniteelua, relaatiomallia, normalisointia, indeksointia ja viite-ehyttä tällä hetkellä. Tarkoitus oli esitellä myös näkymätaulut, triggerit, proseduurit ja transaktiot. Nämä yleissäännöt toimivat lähes tietokantaan kun tietokantaan, mutta esimerkeissä on käytetty MySQL-kantaa InnoDB-moottorilla.

kayttaja-2791 [12.06.2009 23:26:29]

#

ajv kirjoitti:

Metabolix kirjoitti:

Teuro kirjoitti:

Putkassa olisi selkeästi tilausta tietokanta (mysql) opasta...

Olet varmasti oikeassa. Itse en taas rupeaisi tuollaista tyhjästä tekemään, mutta jos jaksat suunnitella varsinaisen sisällön, voin auttaa kirjoittamisessa. Laita sähköpostia Antille ja vaikka minullekin, kun saat jonkinlaisen rungon tehtyä. Jos asia on hyvää, jonkinlainen opas saadaan varmasti aikaan. Pitää vain muistaa aloittaa riittävän helpoista asioista ja tehdä vaikeimmista vaikka jatko-osa.

Mulla on runko (My)SQL-oppaaseen olemassa, en vain ole ikinä saanut sitä valmiiksi. Voin laittaa sen jakoon jonnekkin, jos vaikka joku kirjoittaisi sen loppuun tai sitten vain antaisi itselle sen pienen motivaation puuskan. Opas kyllä olettaa SQL-perustietojen olevan kunnossa. Siinä käsitellään tietokannan suunniteelua, relaatiomallia, normalisointia, indeksointia ja viite-ehyttä tällä hetkellä. Tarkoitus oli esitellä myös näkymätaulut, triggerit, proseduurit ja transaktiot. Nämä yleissäännöt toimivat lähes tietokantaan kun tietokantaan, mutta esimerkeissä on käytetty MySQL-kantaa InnoDB-moottorilla.

Kuulostaa aika kunnianhimoiselta projektilta, ainakin yhdelle miehelle. Itsekin voisin osallistua oppaan kirjoittamiseen, ehkä sen voisi nakata jonnekin Wikiin työstettäväksi? Tai jokin muukin metodi kyllä käy. Mureakuhan Wikin opastakin olen joskus miettinyt laajentavani, mutta Mureakuha on jostainsyystä itselle jäänyt vähän vieraammaksi (vaikka sen Wikiin olenkin osallistunut).

Cartter [13.06.2009 19:58:13]

#

Pistin nyt nuo kaikki kanavat samaan tauluun.

Kun suoritan esim. "SELECT * FROM kanavat WHERE date=:date" ja käyn tulokset silmukassa läpi niin mikä on paras tapa erotella jokaisen kanavan tiedot omiksi kokonaisuuksiksi (sanotaan vaikka jokainen kanava oman divin sisään)?

Olisiko viisasta lukea kaikkien kanavien tiedot ensin omiin taulukoihin ja tulostaa sitten taulukoiden sisältö omaan diviin vai onko tuo raskas tapa asian ratkaisemiseen?

Toinen mikä kävi mielessä on, että tekee silmukan ja suorittaa "SELECT * FROM kanavat WHERE date=:date AND WHERE channel:=channel" jokaiselle kanavalle erikseen. Tämä ei kuitenkaan kaiken järjen mukaan ole hyvä ratkasu(?), jos kanavia sattuu olla valittuna esim. 6 niin se tekisi 6 kyselyä yhden kyselyn sijaan kerralla.

Kolmas ratkaisu voisi olla tutkia silmukan jokaisella kierroksella edellisen kierroksen kanava ja kattoa onko kanava eri.

Vai onko mysql-lauseeseen mahdollista lisätä joku termi, jolla jokaisen kanavan saa jo kyselyä suoritettaessa omiin muuttujiin?

kayttaja-2791 [13.06.2009 22:41:30]

#

Cartter kirjoitti:

Pistin nyt nuo kaikki kanavat samaan tauluun.

Kun suoritan esim. "SELECT * FROM kanavat WHERE date=:date" ja käyn tulokset silmukassa läpi niin mikä on paras tapa erotella jokaisen kanavan tiedot omiksi kokonaisuuksiksi (sanotaan vaikka jokainen kanava oman divin sisään)?

Hae kaikki halutut ohjelmat yhdellä kyselyllä, ja sitten jälkikäsittele ne PHP:llä (eli jaat ohjelmat kanavien mukaisiin muuttujiin/taulukkoon). Jotain tyyliin

"SELECT * FROM kanavat WHERE date=:date AND channel=:channel ORDER BY channel, date"

josta jälkikäsittely on helppoa, vaikka while-silmukalla käyt kaikki tulokset läpi, ja lisäät tulokset vaikka kanavan perusteella taulukkomuuttujaan.

Cartter [13.06.2009 22:54:33]

#

"SELECT * FROM kanavat WHERE date=:date AND channel=:channel ORDER BY channel, date"

Jos teen tuollaisen kyselyn niin sehän palauttaa nimenomaan yhden ainoan kanavan tiedot?

kayttaja-2791 [13.06.2009 22:57:20]

#

Cartter kirjoitti:

"SELECT * FROM kanavat WHERE date=:date AND channel=:channel ORDER BY channel, date"

Jos teen tuollaisen kyselyn niin sehän palauttaa nimenomaan yhden ainoan kanavan tiedot?

Hups, ajatuskatko :) Eli

"SELECT * FROM kanavat WHERE date=:date ORDER BY channel, date"

Cartter [14.06.2009 10:36:30]

#

Jep. Kiitoksia JTS!


Sivun alkuun

Vastaus

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

Tietoa sivustosta