Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Samanaiheisten sivujen ehdotus?

Sivun loppuun

pojedo [13.10.2016 18:20:04]

#

Kysyisin neuvoa tältä palstalta. Käytän php ja mysql.

En tiedä miten purkaisin asiani ymmärrettävästi tähän. Pitäisi saada tietokannasta ehdotuksia sivulle samasta aiheesta. Löytyisikö sille jotain yksinkertaista toteutustapaa, että sivulla ehdottaisi samasta aiheesta olevia juttuja.

Esimerkki selvennykseksi: Sivulla punainen volvomerkkinen auto. Ehdottaisi samalla sivulla selausta helpottaakseen toisia sivuja joista löytyisi volvo merkkisiä autoja, punaisia autoja tai autoja.
Tietokantaan kirjoitettu: Punainen, Volvo, Auto...

Millaisella kyselyllä haku onnistuisi?

Grez [13.10.2016 20:10:42]

#

Tietokannassa varmaankin nuo tagit on omilla riveillään....

Tyyliin taulu Tagit
AiheId Tagi
123 Punainen
123 Volvo
123 Auto

select distinct B.AiheId
from Tagit A join Tagit B ON A.Tagi=B.Tagi
where A.AiheId=123

pojedo [14.10.2016 11:10:45]

#

Grez kirjoitti:

Tietokannassa varmaankin nuo tagit on omilla riveillään....

Tyyliin taulu Tagit
AiheId Tagi
123 Punainen
123 Volvo
123 Auto

select distinct B.AiheId
from Tagit A join Tagit B ON A.Tagi=B.Tagi
where A.AiheId=123

Tarkoitin, että olisi pilkun kanssa eroteltu yhteen sarakkeeseen. Samanlaisilla tunniste sanoilla se osaisi ehdotella vastaavia ehdotuksia. Voisi se toimia siten, että sivun sisällöstä ja otsikosta osaisi myös poimia aiheeseen liittyvää.

Tarkoitan sellaista, kun joillakin sivuilla ehdotetaan aiheeseen liittyvää sisältöä. Kun on vaikka esimerkiksi auki sivu www.domain.com/sivu.php?id=123. Sivuilla /sivu.php?id=126, /sivu.php?id=167 on samasta aiheesta tai liittyy siihen. Toisi se ehdotukseksi niiden rivien otsikon ja linkin...
Näin saisi sivun rakennettua käyttäjäystävällisemmäksi ja sujuvampaa selaaminen.

Grez [14.10.2016 12:49:16]

#

pojedo kirjoitti:

Tarkoitin, että olisi pilkun kanssa eroteltu yhteen sarakkeeseen.

Juu eli tietokannan rakenne on huono. Kannattaa tehdä se tuollaiseksi kunnolliseksi, niin elämä helpottuu.

Toki jos omaat masokistisia luonteenpiirteitä, niin saat sen toimimaan niinkin, että ne on yhdessä sarakkeessa pilkulla eroteltuna. Silloin menetät tietokannan käytöstä saatavia hyötyjä. Voit php:llä palastella pilkulla erotellut sanat ja tehdä kyselyyn tyyliin

where tagilista like '%, punainen,%' or tagilista like '%, punainen' or tagilista like 'punainen,%' or tagilista like '%, volvo,%' or tagilista like '%, volvo' or tagilista like 'volvo,%' or tagilista like '%, auto,%' or tagilista like '%, auto' or tagilista like 'auto,%' or tagilista in ('punainen','volvo','auto')

Jos haluat tehdä pikkuisen muotoa "punainen, volvo, auto" helpommin käytettävän pilkkuerotellun (=huonon) ratkaisun, niiin tallenna ne niin että jokaisen sanan alussa ja lopussa on aina pilkku eikä turhia välilyöntejä. Eli esim. ",punainen,volvo,auto,". Silloin kyselystä tulee vähän helpompi:

where tagilista like '%,punainen,%' or tagilista like '%,volvo,%' or tagilista like '%,auto,%'

Kaikkihan on mahdollista, joskaan ei välttämättä järkevää.

pojedo [14.10.2016 21:34:05]

#

Voisitko hiukan tarkentaa tuota ensimmäistä vaihtoehtoa, kun en tietenkään voi missään nimessä alkaa niitä tunnistesanoja siihen kyselyyn laittamaan. Jokaiselle sivulle tulee omat tunnistesanat.

Tarkoitatko, että teen oman taulun tageille ja miten sen saa yhdistettyä toisen taulun riveihin? Pitäisi vielä laittaa kyselyyn Limit, että ei koko tietokantaa avaa siihen. Samoin pitää olla jotenkin WHERE näkyvyys = 'Kyllä'. Siis näyttää sellaiset rivit, joissa sana kyllä ja sitten pitäisi ehdotella sopivia sivuja.

Voisitko tehdä mallin kyselystä, mysql ja php.

Kysysin tälläistä toiseen juttuun liittyen, että miten saa sivun id:n tähän automaattisesti:

<?php
include('tietokantayhteys.php');
$id_app = "tähän sivun id";
?>

Tuohon haluasin auki olevan sivun id:n, joka valitsee tietystä taulusta samat id:t.

Mod. lisäsi kooditagit!

Grez [14.10.2016 21:59:56]

#

Ekassa vastausviestissäni oli sekä malli Tagit-taulusta, että malli kyselystä jolla saa haettua kaikki sellaiset AiheId:t, joissa esiintyy sama tagi kuin AiheId:ssä 123.

Tuohon viimeisimpään kysymykseen, niin sivun id varmaankin on jo php-koodissa tiedossa. Nyt kun ei tiedetä mikä on sivun osoite eikä tiedetä muuta koodia niin voi antaa vain arvauksia. Jos esim. sivu ladattaisiin domain/sivu.php?id=123, niin id olis $_GET['id']

pojedo [15.10.2016 01:27:16]

#

Grez kirjoitti:

(14.10.2016 21:59:56): Ekassa vastaus­vies­tis­säni oli sekä malli...

En ymmärtänyt vieläkään tuota ensimmäistä, että teen siis oman taulun jolle nimeksi vaikka tagit ja siihen mitä sarakkeita? Tageja voi olla muutamia tai kymmeniä yhteen aiheeseen.
En halua mitään monimutkaista rakennelmaa, kun rivejä on taulussa jo satoja ja haluan saman aiheet koota helposti saataville sivulle. Tagit voi tietekin tehdä.

En myöskään ymmärtänyt tuota toista kysymystä, että siis miten saan $id_app = "tähän sivun id"; tuohon sivun id:n. Pitäisi saada automaattisesti sivuun kuuluva sisältö avattua sivun id:n perusteella. Näin sitä ei voi mitenkään tehdä.

<?php
$id_app = "<php echo "id" ?>";

Ei enään järki kulje, kun miettinyt liikaa.

Grez [15.10.2016 13:33:45]

#

pojedo kirjoitti:

En ymmärtänyt vieläkään tuota ensimmäistä, että teen siis oman taulun jolle nimeksi vaikka tagit ja siihen mitä sarakkeita?

Sarakkeet oli
1) AiheId (sama tietotyyppi kuin aiheet sisältävän taulun pääavaimella, eli viittaus aiheeseen)
2) Tagi (merkkijono)

pojedo kirjoitti:

Tageja voi olla muutamia tai kymmeniä yhteen aiheeseen.

Tuohon tauluun tulee sitten rivejä muutamia tai kymmeniä sitä aihetta koskien.

Jos tuo aiheen tunnisteen kaivaminen tuottaa tuskaa, niin laita näkyville vaikka se koodinpätkä, joka sivulla tällä hetkellä hakee aiheen tiedot tietokannasta.

pojedo [15.10.2016 18:44:32]

#

Kun nyt ei oikein tähän tuntunut tulevan kunnollista toteutus vastausta, niin jos sen tekee ylläpidollisesti hankalaksi, että sinne kantaan sitten tallentaa numeron, joka vastaa tiettyä aiheryhmää. Menee hankalaksi käyttöliittymän tekeminen ja kanta rakentelu, että miten sieltä saa koottua tiettyyn aiheeseen kuuluvat samaan ryhmään. Kun aiheryhmäni kokoaminen ei ole niin yksinkertaista, että esimerkiksi: auto, juna, mopo, vene ja niillä olisi sitten omat numerot. Silloin se ei toimi tarkasti, jos se antaisi vaikka kaikki veneaiheiset ja tietenkään ne veneet eivät ole järjellisesti samasta aiheesta. Ne ovat samasta kategoriasta. Haen sitä tällä, että jos on aiheet auto1 ja auto2. Ne pitäisi saada erikseen, koska ne ei liity toisiinsa kuin kategorisesti. Toisaaltaan ne voi liittyä keskenään, jos ei ole useampi auto1 liittyvää riviä.

The Alchemist [15.10.2016 23:36:19]

#

Alkuperäiseen kysymykseen vastaan asian vierestä, että Postgresql-kannalla tuo tagien laittaminen yhteen sarakkeeseen onnistuisi vallan kivuttomasti.

-- Taulun skeema
CREATE TABLE pages (id serial primary key, ..., tags jsonb)
-- Testidata
INSERT INTO pages (..., tags) VALUES (..., '["vene", "punainen", "yamaha"]'), (..., '["auto", "punainen", "volvo"]')
-- Kaikki tagit löytyvät
SELECT * FROM pages WHERE tags ?& array['punainen', 'volvo', 'auto']
-- Ainakin yksi tagi löytyy
SELECT * FROM pages WHERE tags ?| array['punainen', 'volvo', 'auto']

Grez [16.10.2016 09:12:33]

#

Niin joo tosiaan ajattelin että ne sivut tulisivat jostain tietokannasta (jolloin niillä olisi tyypillisesti jokin yksilöllinen tunniste).

Kysyjällä taitaa kuitenkin olla tilanne, että on vain sivuja.

Tällöinhän olisi ehkä selkeintä että tietokannassa olisi joka tapauksessa taulu sivuille. Eli haku tapahtuisi sivun URL:illa, ei suoraan ID:llä.

pojedo kirjoitti:

Kun nyt ei oikein tähän tuntunut tulevan kunnollista toteutus vastausta

Ilman kunnollista kysymystä ei oikein pysty antamaan kunnollista vastausta. Hyvässä kysymyksessä annetaan riittävästi tietoja ongelmasta, jotta asiaa ymmärtävä pystyy ratkaisemaan ongelman.

Metabolix [16.10.2016 10:12:57]

#

Varmaan nyt olennaista olisi, että kysyjä kertoisi, miten niitä sivuja tällä hetkellä tuotetaan, ja mielellään näyttäisi vielä nykyisen toimivan PHP-koodin, jos jotain koodia on olemassa. Olisi sitten helpompi siitä jatkaa neuvomista.

The Alchemist [16.10.2016 12:36:22]

#

No jollain tavallahan se koodi tietää, mikä sivu pitää ladata, kun käyttäjä surffaa tiettyyn osoitteeseen. Sitä samaa logiikkaa voi sitten hyödyntää, kun tietokannasta haetaan sisältöä sivulle. Siinä ei pitäisi olla mitään ihmeellistä.

pojedo [16.10.2016 15:42:52]

#

Grez kirjoitti:

Niin joo tosiaan ajattelin että ne sivut tulisivat jostain tietokannasta (jolloin niillä olisi tyypillisesti jokin yksilöllinen tunniste).

Kysyjällä taitaa kuitenkin olla tilanne, että on vain sivuja.

Tällöinhän olisi ehkä selkeintä että tietokannassa olisi joka tapauksessa taulu sivuille. Eli haku tapahtuisi sivun URL:illa, ei suoraan ID:llä.

Sivun sisältö tulee tietokannasta ja olen käyttänyt id:tä tunnisteena. Esimerkiksi: /sivu.php?id=123 aukeaa sisältö id 123 ja sitten otsikko ja sisältö kuvineen tulee samalta riviltä. Ajattelin, että samalle riville selkeyden vuoksi olisi laittanut aihetunnisteen, jolla erotella saman aihmiset jotenkin. Olen käyttänyt rewriteä url uudelleen nimeämiseksi.

Voisitko laittaa jonkun taulun rakenteen esimerkiksi sivuille. En ole sivuille ehtinyt vielä tekemään mitään. Päävalikko on tarkoitus laittaa myöhemmin tietokantaan, kun pääsen siihen kohtaan. En tiedä miten onnistuu url rewrite tietokannan kautta automaattisesti. Eli kannassa esimerkiksi: Oppaat ja sitten pienellä oppaat, joka toimisi url. Tarkoitan sitä, että voisi sivuja lisätä selaimella yp puolella ja ne tulisi helposti käyttöön ilman ihmeellisiä säätöjä.

Tarkoitan tällä samasta aiheesta jutulla sellaista, joka löytyy esimerkiksi Iltalehdestä. http://www.iltalehti.fi/uutiset/2016101622469482_uu.shtml.
Kommentointilaatikon alapuolelta löytyy lisää aiheesta.

Ymmärtääkseni nyt paremmin?

groovyb [16.10.2016 17:19:13]

#

onko siinä joku ongelma, että sinulla olisi kolme taulua joita käytät tägikyselyissä?

otetaan esimerkki vaikka mahdollisesta yksinkertaistetusta verkkokauppatägäyksestä:

Tuotesivut, Sivu_Tagit, Tagit.

Tagit

id 1 = Elektroniikka
id 2 = Vaatetus
id 3 = Huonekalut
id 4 = Sohvaryhmät
id 5 = Kamerat

Tuotesivut

id 1 Kulmasohva NN
id 2 Nikon Kamera
id 3 Musta t-paita
id 4 Siniset farkut

Sivu_Tagit

id 1 tagi_id 3 tuotesivu_id 1
id 1 tagi_id 4 tuotesivu_id 1
id 2 tagi_id 1 tuotesivu_id 2
id 2 tagi_id 5 tuotesivu_id 2
id 3 tagi_id 2 tuotesivu_id 3
id 4 tagi_id 2 tuotesivu_id 4


Näin saisit helpolla kyselyllä haettua tägeihin liityvät tuotteet, ilmaan mitään ylimääräistä parsimista, ja kannan eheyskin pysyisi kasassa.

pojedo [16.10.2016 18:18:46]

#

groovyb kirjoitti:

(16.10.2016 17:19:13): onko siinä joku ongelma, että sinulla olisi...

Eilen löysin jonkun tuollaisen esimerkin googlettamalla. Nään tuon jotenkin vaivalloisena toteuttaa. En myöskään oikein hahmota tuota, mutta voisi tuo olla hyvä. Saako sen helposti ehdottamaan vaikka vaatetuksessa Mustaa t-paitaa katsoessa ehdottamaan vaikka punaista, sinistä ja vihreää t-paitaa. Jos ei ole t-paitoja muita värejä niin ehdottaa vaikka farkkuja tai jotain vaatetus osiosta.

Voisitko vielä hiukan tarkentaa tuota ja tehdä sopiva kysely? Kyselyssä ei mielellään mainita vaatetus tai t-paitoja. En tiedä myöskään miten teen paremmin sivujen url. Tällähetkellä sivutunniste on id.

Tälläisen kannan sain aikaiseksi, voit tehdä tarvittavia muutoksia:

CREATE TABLE IF NOT EXISTS `sivu_tagit` (
  `id` int(255) NOT NULL,
  `tagi_id` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `tuotesivu_id` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

INSERT INTO `sivu_tagit` (`id`, `tagi_id`, `tuotesivu_id`) VALUES
(1, '2', '1'),
(2, '2', '2'),
(3, '7', '3'),
(4, '7', '4');

-- --------------------------------------------------------

CREATE TABLE IF NOT EXISTS `tagit` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `tagi_id` int(11) NOT NULL,
  `nimi` text COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=2 ;

INSERT INTO `tagit` (`id`, `tagi_id`, `nimi`) VALUES
(1, 2, 'Kamerat'),
(2, 7, 'Vaatetus');

-- --------------------------------------------------------

CREATE TABLE IF NOT EXISTS `tuotesivut` (
  `id` int(255) NOT NULL AUTO_INCREMENT,
  `t_name` text COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;

INSERT INTO `tuotesivut` (`id`, `t_name`) VALUES
(1, 'Nikon Kamera'),
(2, 'Canon Kamera'),
(3, 'Musta t-paita');
(4, 'Punainen t-paita');

pistemies [22.10.2016 22:52:34]

#

Helpointa olisi tehdä oma related taulu, jossa on suoraan listattu vertailtavat asiat, riittää kaksi saraketta:
1. avoinna olevan sivun id tietokannassa
2. samankaltaisen sivun id tietokannassa.

Metabolix [22.10.2016 23:47:36]

#

pistemies kirjoitti:

Helpointa olisi tehdä taulu, jossa on suoraan listattu vertailtavat asiat

Ehkä helpointa tehdä mutta vaikeinta ylläpitää. Aina, kun lisättäisiin uusi sivu, pitäisi käydä käsin läpi kaikki muut sivut ja valita, mitkä liittyvät uuteen. Jos sivuja tulee edes sata, tästä tulee jo hyvinkin vaivalloista.

Hyvä ratkaisu riippuu siitä, mitä dataa (ja paljonko) sivustolle ylipäänsä tulee. Jos sivuja tulee paljon, voisi olla järkevää luokitella ne kategorioihin verkkokaupan tyyliin. Silloin läheisinä sivuina näytettäisiin samaan kategoriaan tai ylempiin kategorioihin kuuluvia sivuja. Esimerkiksi jonkin sivun polku voisi olla Kulkuneuvot/Autot/Ladat/Lada-L7, jolloin läheisiä olisivat ensin muut Ladat, sitten muut Autot ja viimeisinä muut Kulkuneuvot.

En tiedä, missä tilanteessa olisi järkevää (alkuperäisen viestin tapaan) näyttää punaisen auton yhteydessä muita punaisia asioita. ”Sori, punaiset autot loppuivat, mutta omenoita löytyy vielä!”

pistemies [23.10.2016 18:44:10]

#

Metabolix kirjoitti:

(22.10.2016 23:47:36): ”– –” Ehkä helpointa tehdä mutta vaikeinta ylläpitää...

No en tiedä onko tuo niin kovin vaikeaa.
Tehdään vain lisäys/muokkaus lomakkeelle Related kenttä, jossa on automaattinen täydennys, kun kirjoitaa siihen 'A' se lisää kaikki sivut, joiden otsikko alkaa isolla A:lla jne. Lähes koko tarvittavat skriptit voi kopsata tuolta ja tehdä niihin pieniä muutoksia:
https://github.com/opencart/opencart/blob/master/upload/admin/view/template/catalog/product_form.tpl

pojedo [12.11.2016 16:43:43]

#

pistemies kirjoitti:

Helpointa olisi tehdä oma related taulu, jossa on suoraan listattu vertailtavat asiat, riittää kaksi saraketta:
1. avoinna olevan sivun id tietokannassa
2. samankaltaisen sivun id tietokannassa.

Voisiko tästä saada tähän keskusteluun tarkasteluun vähän täytetty mysql ja toimiva php. En tiedä mikä on toimiva tapa tehdä. Enkä myös tiedä miten yhdistää 2 taulua. Kysely...

Metabolix [12.11.2016 18:59:11]

#

Aiemmassa kehittämässäsi taulussa on pari olennaista vikaa: Tagilla on täysin turhaan tagi_id; sillähän on jo id! Käytät tekstejä kohdissa, joissa pitäisi selvästi olla lukuja (tagi_id, tuotesivu_id). Et määrittele järkeviä FOREIGN KEY -relaatioita.

Tässä on taulurakenne korjattuna:

ALTER DATABASE CHARACTER SET = utf8mb4 COLLATE = utf8mb4_swedish_ci;

CREATE TABLE sivu (
	id INT PRIMARY KEY AUTO_INCREMENT,
	nimi TEXT NOT NULL
	-- ym. sarakkeet
) ENGINE=InnoDB;

CREATE TABLE tagi (
	id INT PRIMARY KEY AUTO_INCREMENT,
	nimi TEXT NOT NULL
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS sivu_tagi_map (
	id INT PRIMARY KEY AUTO_INCREMENT, -- oikeastaan turha sarake
	sivu_id INT NOT NULL,
	tagi_id INT NOT NULL,
	UNIQUE KEY (sivu_id, tagi_id),
	FOREIGN KEY (sivu_id) REFERENCES sivu(id) ON DELETE CASCADE ON UPDATE CASCADE,
	FOREIGN KEY (tagi_id) REFERENCES tagi(id) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB;

Esimerkkidataa:

INSERT INTO sivu (id, nimi) VALUES
(1, "Nikon-kamera"),
(2, "Canon-kamera"),
(3, "Musta t-paita"),
(4, "Punainen t-paita");

INSERT INTO tagi (id, nimi) VALUES
(11, "Kamerat"),
(12, "Vaatetus");

INSERT INTO sivu_tagi_map (sivu_id, tagi_id) VALUES
(1, 11),
(2, 11),
(3, 12),
(4, 12);

Tietoa haetaan esimerkiksi näin:

-- Sivun 1 haku:
SELECT * FROM sivu WHERE id = 1;

-- Sivuun 1 liitettyjen tagien haku:
SELECT tagi.* FROM tagi
JOIN sivu_tagi_map ON tagi_id = tagi.id AND sivu_id = 1;

-- Tagiin 11 liittyvien sivujen haku (pl. nykyinen sivu):
SELECT sivu.id, sivu.nimi FROM sivu
JOIN sivu_tagi_map ON sivu_id = sivu.id AND tagi_id = 11
WHERE sivu.id != 1;

-- Sivuun 1 liittyvien muiden sivujen haku:
SELECT DISTINCT sivu.id, sivu.nimi FROM sivu
JOIN sivu_tagi_map AS m1 ON m1.sivu_id = sivu.id
JOIN sivu_tagi_map AS m2 ON m1.tagi_id = m2.tagi_id AND m2.sivu_id = 1
WHERE sivu.id != 1;

Käytännön toteutus esim. PDO:lla menisi tähän tapaan:

<?php
# $pdo = new PDO(...);
require_once 'tietokanta.php';

# Jos osoite muotoa sivu.php?id=1, sivun id saadaan $_GET-taulukosta:
$sivu_id = $_GET["id"];


# Sivun $sivu_id haku:
$q = $pdo->prepare("SELECT * FROM sivu WHERE id = ?");
$q->execute([$sivu_id]);
$sivu = $q->fetch();
if (!$sivu) {
	http_status_code(404);
	die("Sivua ei löydy!");
}


# Sivuun $sivu_id liittyvien tagien haku:
$q = $pdo->prepare("
	SELECT tagi.* FROM tagi
	JOIN sivu_tagi_map ON tagi_id = tagi.id AND sivu_id = ?
");
$q->execute([$sivu_id]);
$tagit = $q->fetchAll();


# Kuhunkin tagiin $tagi["id"] liittyvien sivujen haku (pl. nykyinen sivu):
$q = $pdo->prepare("
	SELECT sivu.* FROM sivu
	JOIN sivu_tagi_map ON sivu_id = sivu.id AND tagi_id = ?
	WHERE sivu.id != ?
");
foreach ($tagit as $i => $tagi) {
	$q->execute([$tagi["id"], $sivu_id]);
	$tagit[$i]["sivut"] = $q->fetchAll();
}


# Sivuun $sivu_id liittyvien sivujen haku:
$q = $pdo->prepare("
	SELECT DISTINCT sivu.id, sivu.nimi FROM sivu
	JOIN sivu_tagi_map AS m1 ON m1.sivu_id = sivu.id
	JOIN sivu_tagi_map AS m2 ON m1.tagi_id = m2.tagi_id AND m2.sivu_id = ?
	WHERE sivu.id != ?
");
$q->execute([$sivu_id, $sivu_id]);
$sivut = $q->fetchAll();


# Esimerkki HTML-sivusta:
function h() {
  return implode("", array_map("htmlspecialchars", func_get_args()));
}
?>
<!DOCTYPE html>
<meta charset="UTF-8" />
<title><?= h($sivu["nimi"]) ?></title>

<h1><?= h($sivu["nimi"]) ?></h1>

<?php if ($tagit): ?>
	<p>
		Tagit:
		<?php foreach ($tagit as $tagi): ?>
			<a href="tagi.php?id=<?= $tagi["id"] ?>"><?= h($tagi["nimi"]) ?></a>
		<?php endforeach; ?>
	</p>

	<?php foreach ($tagit as $tagi): ?>
		<p>
			Muita sivuja aiheesta <?= h($tagi["nimi"]) ?>:
			<?php foreach ($tagi["sivut"] as $sivu2): ?>
				<a href="sivu.php?id=<?= $sivu2["id"] ?>"><?= h($sivu2["nimi"]) ?></a>
			<?php endforeach; ?>
		</p>
	<?php endforeach; ?>
<?php endif; ?>

<?php if ($sivut): ?>
	<p>
		Katso myös:
		<?php foreach ($sivut as $sivu2): ?>
			<a href="sivu.php?id=<?= $sivu2["id"] ?>"><?= h($sivu2["nimi"]) ?></a>
		<?php endforeach; ?>
	</p>
<?php endif; ?>

pojedo [13.11.2016 21:24:35]

#

Metabolix kirjoitti:

(12.11.2016 18:59:11): Aiemmassa kehit­tä­mäs­säsi taulussa on pari...

Tekemäni taulu olikin tarkoitettu muokattavaksi ja korjattavaksi. Taulut tein nopeasti phpmyadmin:illa, painoin import ja kopioin tähän.

Yritin koittaa tuota käytännön toteutusta ja en saanut sitä toiminaan.
Voisitko tehdä siihen vielä tuon tietokanta.php, joka toimii tuossa PDO:ssa. Pääsisin koittamaan tuota toteutustapaa. Mietin vielä tuota sivu saraketta, että siihen saa varmaan muitakin sarakkeita. Vaikka Nikon kamerasta kuvan url ja vaikka sen hinta ja muuta tietoa (Muita sivuja aiheesta kohtaan yms?)

Tuota koittamalla sain tälläisen virheen: Fatal error: Call to a member function prepare() on a non-object in /xxx/xxxx.php on line 10
Ilman tietokanta.php tiedostoa virhe line 3

Se ei varmaan oo vika tietokanta.php, vaan siitä että siellä on ? merkkejä. Millaisella url saa auki nikon-kameran? En ole muuttanut tiedostoa mitenkän ja pitäisikö ? merkit muuttaa? Tässä ite meen sekasin, kun en tiedä miten sen saa automaattisesti. PHP-versiona käytän palvelimella 5.4. Uusin on 7.0.

Metabolix [14.11.2016 16:58:50]

#

Tiedostossa tietokanta.php sinun tarvitsee vain luoda tietokannan käsittelyyn PDO-olio, kuten oppaassa kuvataan.

<?php
$pdo = new PDO("mysql:host=localhost;dbname=TIETOKANTA", "KÄYTTÄJÄ", "SALASANA");

Esimerkissä sivujen osoitteet ovat muotoa sivu.php?id=LUKU. Esimerkissä on myös linkki sivulle tagi.php?id=LUKU, jota esimerkki ei kuitenkaan sisällä; tuolla sivulla voisit listata kaikki tiettyyn tagiin liittyvät sivut.

?-merkeissä ei ole mitään vikaa. Ne kuuluvat PDO:n käyttöön. Lue opas, jos et tiedä tätä.

Sinun kannattaisi opetella itsekin jotain. Lue ensin vaikka Ohjelmointiputkan PHP- ja MySQL-oppaat ja mieti tarkkaan kaikkia niiden esimerkkejä.

pojedo [18.11.2016 01:10:15]

#

Metabolix kirjoitti:

Sinun kannattaisi opetella itsekin jotain. Lue ensin vaikka Ohjelmointiputkan PHP- ja MySQL-oppaat ja mieti tarkkaan kaikkia niiden esimerkkejä.

Kiitos sinulle avusta. Nyt sain toimimaan ja vähän sovellettua toimivaksi siihen mihin tarvitsin sitä. Olen lukenut joitakin oppaita joskus.
Pitäisi tehdä vielä jokin tietokannan rivien lisäys sivu php, jolla saisi helposti valittua tagit ja luotua toimivan kokonaisuuden helposti. Nyt olen phpmyadminilla nopeasti lisännyt rivejä.

Olen tätä käyttänyt ja soveltanut lisäämällä sivu.xxx, ja miten siihen saisi lisättyä 'Limit'

$q = $pdo->prepare("
	SELECT DISTINCT sivu.id, sivu.nimi FROM sivu
	JOIN sivu_tagi_map AS m1 ON m1.sivu_id = sivu.id
	JOIN sivu_tagi_map AS m2 ON m1.tagi_id = m2.tagi_id AND m2.sivu_id = ?
	WHERE sivu.id != ?
");

Lisäksi haluasin, että se näyttäisi vain sellaiset rivit ehdotuksessa joista löytyisi kirjain 'H'. Olen aikaisemmin tehnyt sen näin: sarakkeen nimi = 'H' order..

Koodi antaa virheilmoituksen, jos sivua ei löydy (ID). Saisiko sen jotenkin ohjattua virhesivulle tai palattua takaisin?

pistemies [25.11.2016 16:55:11]

#

Mahdatko yrittää tehdä se liian monimutkaisesti?

CREATE TABLE `related` (
  `page_id` int(11) NOT NULL,
  `related_id` int(11) NOT NULL,
  PRIMARY KEY (`page_id`,`related_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;


CREATE TABLE IF NOT EXISTS `tuotesivut` (
  `id` int(255) NOT NULL AUTO_INCREMENT,
  `t_name` text COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1;
$pdo->prepare("
	SELECT * FROM related r
	LEFT JOIN JOIN tuotesivut ts ON(r.related_id = ts.id)
	WHERE r.page_id = ?
");

Metabolix [25.11.2016 17:08:12]

#

pojedo kirjoitti:

Koodi antaa virheilmoituksen, jos sivua ei löydy (ID). Saisiko sen jotenkin ohjattua virhesivulle tai palattua takaisin?

Kai löydät itsekin koodista kohdan, jossa virheilmoitus tulostetaan. Voit siinä kohti tulostaa haluamasi virhesivun, siis ihan tavallista HTML-koodia. Muista kuitenkin die lopussa, jotta varsinaisen sivun käsittely päättyy.

Automaattinen takaisin palaaminen ei ole yleensä järkevää, se vain hämmentää käyttäjää, kun ei ymmärrä, miksi sivu ei toimi.

pistemiehen vastaus taas ei liittynyt kysymykseen mitenkään.


Sivun alkuun

Vastaus

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

Tietoa sivustosta