Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: PHP Include sivustojen linkityksestä navigaatioon

Sivun loppuun

SaQe [11.04.2011 19:43:30]

#

Hei! Olen vähän uusi vielä PHP:n parissa ja olisi kiva tietää voisiko tämän asian ratkaista helpommin.

Minulla on sivusto, jonka sisältö avataan yhteen index.php nimiseen filuun includen kautta. Ongelmani koskee include sivujen listaamista:

Onko helpompaa tapaa listata noita include sivuja kuin kirjata kaikki sivut tuohon yhteen php-koodipätkään?

Index.php:ssä on tällainen koodi, joka sisältää sivuston navigaation:

<?
if (isset($_GET['p'])) {
 	switch($_GET['p']) {

	case'c_sivu2':
	include('sivu2.php');
	break;

	case'c_sivu3':
	include('kansio1/sivu3.php');
	break;

	case'c_etusivu':
	include('etusivu.php');
	break;


   }
}else include('etusivu.php' );
?>

Tarkoituksenani on luoda myös kuvagalleria ilman tietokantaa includen kautta. Tällöin minulla olisi jokaiselle kuvalle oma php -päätteinen filu ja kuvia olisi yli 500 jaoteltuina eri kansioihin ja alikansioihin vuosien perusteella. Tässä kuva sivussa tulisi olemaan myös edellinen kuva/ seuraava kuva -hyperlinkit + linkki kuvien päävalikkoon.

Esimerkiksi: on olemassa kansio kuvat, sen alla on pääkategoriakansiot jotka ovat valokuvat, maalaukset ja luonnokset. Kaikkien edellä mainittujen kolmen pääkategoriakansion alla on kansiot eri vuosille.

Olisihan tuo aika työlästä kirjata kaikkien niiden yli 500:n kuvan sivut tuohon yhteen index.php filuun.

Kiitän suuresti jo etukäteen vastauksista!

Metabolix [11.04.2011 20:01:24]

#

Ei ole mitään järkeä tehdä joka kuvalle omaa PHP-tiedostoa. PHP:n idea on juuri siinä, että tarvitaan vain yksi sivu jokaiselle toiminnolle. Tarvitset siis yhden sivun kuvien listaamiseen ja yhden sivun kuvan näyttämiseen. Kuvien tiedot voi tallentaa vaikka tekstitiedostoon (vaikka tietokanta olisi paljon parempi), ja esimerkiksi näytettävän kuvan tunniste (id-numero tai nimi) välitetään GET-parametrina.

Itse koodiisi, vaikka se onkin jo lähtökohtaisesti väärin suunniteltu, voisi tehdä seuraavan parannuksen:

<?php
// Laitetaan sivut taulukkoon.
$sivut = array(
  "c_etusivu" => "etusivu.php",
  "c_sivu3" => "kansio1/sivu3.php",
  "c_muu" => "muusivu.php",
);

// Otetaan osoitteesta p.
$p = (string) @$_GET["p"];

// Jos sivua ei ole taulukossa, otetaan taulukon ensimmäinen sivu.
if (!isset($sivut[$p])) {
  $p = key($sivut);
}

// Liitetään sivu.
require($sivut[$p]);

Kuitenkin on typerää tehdä turhaan sellaisia linkkejä kuin index.php?sivu=xyz, kun voisi yhtä hyvin käyttää suoraan linkkiä xyz.php. Hyvä lähtökohta on, että yksi PHP-tiedosto sisältää yhdenlaisen sivun ja GET-parametrit muuttavat vain sivun sisältöä, esim. kuvasivulla näytettävää kuvaa.

SaQe [11.04.2011 22:19:13]

#

Kiitos, Metabolix!

Kokeilin tuossa nyt vääntää tietokannan gallerialleni ja saan kuvien pienet thumpnailit tulostettua tietokannasta, mutta kuinka saisin noista thumpnaileista linkkejä, jotka sitten avautuisi kuvasivu pohjaan id tiedon perusteella? En saa toimivaa hyperlinkkiä aikaiseksi.

listaussivun php koodi:

<?php
include "yhteys.php";

// sending query
$query = "SELECT id,kuvap FROM kuvat WHERE vuosi = 2010 AND kategoria='digitaalinen'";
$result = mysql_query($query) or die(mysql_error());
echo "<table border='0'>";
while($row = mysql_fetch_array($result)){
echo "<img src=\"". $row['kuvap'] ."\" />";
}
echo "</table>";
?>

Kuvasivupohja:

<?php
ini_set("display_errors", "off");
include "yhteys.php";
$annettu_kuva_id=$_GET["annettu_kuva_id"];
$otsikko=$_GET["otsikko"];
$kuvai=$_GET["kuvai"];
$kuvaus=$_GET["kuvaus"];
$vuosi=$_GET["vuosi"];
$kuukausi=$_GET["kuukausi"];
$kategoria=$_GET["kategoria"];
$ttapa=$_GET["ttapa"];
$id=$_GET["id"];

$submit=$_GET["submit"];

if (empty($submit))
{
$submit=1;
$sql = "SELECT * FROM kuvat WHERE id='$annettu_kuva_id'";
$result = mysql_query($sql);

	while ($newArray = mysql_fetch_array($result))
	{

$item_id = $newArray['id'];
$item_otsikko = $newArray['otsikko'];
$item_kuvaus = $newArray['kuvaus'];
$item_vuosi = $newArray['vuosi'];
$item_kuukausi = $newArray['kuukausi'];
$item_kuvai = $newArray['kuvai'];
$item_kuvap = $newArray['kuvap'];
$item_kategoria = $newArray['kategoria'];
$item_ttapa = $newArray['ttapa'];


}
}


?>

Othnos [12.04.2011 01:05:32]

#

SaQe kirjoitti:

Kokeilin tuossa nyt vääntää tietokannan gallerialleni ja saan kuvien pienet thumpnailit tulostettua tietokannasta, mutta kuinka saisin noista thumpnaileista linkkejä, jotka sitten avautuisi kuvasivu pohjaan id tiedon perusteella? En saa toimivaa hyperlinkkiä aikaiseksi.

Koodeissasi on useampiakin puutteita ja yritän korjailla ainakin suurimmat niistä. Ihmettelen myös miksi koodauksen ulkoasu vaihtelee nuin hirveästi jo muutaman kymmenen rivin koodissa.

Toivottavasti ymmärsin hakemasi edes jotenkuten oikein.

<?php
// listaussivun php koodi:

include "yhteys.php";

// sending query
$query = "SELECT id, kuvap FROM kuvat WHERE vuosi=2010 AND kategoria='digitaalinen'";
// Käytä mielummin or die() tilalla or trigger_erroria jolloin virhe tapauksessa saat itse enemmän valinnan vapauksia mitä tehdä seuraavaksi
$result = mysql_query($query) or trigger_error(mysql_error());
echo '<table border="0">';
// Lisätään tablen vaatima <tr> (rivi-tagi)
echo '<tr>';
while($row = mysql_fetch_array($result)) {
	// Sisennyksiä kannattaa käyttää selkeyttämään koodia
	// Lisätään tablen vaatima <td> (sarake-tagi), hyperlinkki sekä xss-aukkojen estämiseksi muutamat funktiot, jotka löytyvät php.net:in documentaatiosta
	// Voit myös kirjoittaa html-kohdat näin
	?>
	<td>
		<a href="kuvasivupohja?annettu_kuva_id=<?php echo htmlentities(urlencode($row['id'])); ?>">
			<img src="<?php echo htmlspecialchars($row['kuvap']); ?>" />
		</a>
	</td>
	<?php
}
echo '</tr>';
echo '</table>';
?>
<?php
// Kuvasivupohja:

// Miksi poistat virheet näkyvistä vai onko tämä jo julkaisuversio?
// ini_set("display_errors", "off");

include "yhteys.php";

// Mikä tarkoitus näillä on?
/*
$annettu_kuva_id=$_GET["annettu_kuva_id"];
$otsikko=$_GET["otsikko"];
$kuvai=$_GET["kuvai"];
$kuvaus=$_GET["kuvaus"];
$vuosi=$_GET["vuosi"];
$kuukausi=$_GET["kuukausi"];
$kategoria=$_GET["kategoria"];
$ttapa=$_GET["ttapa"];
$id=$_GET["id"];

$submit=$_GET["submit"];
*/

// Tarkistetaan onko kuvan id lähetetty
if (isset($_GET['annettu_kuva_id'])) {
	// SQL-injektion varalta varmistetaan, että kyseinen tieto on numeraalinen.
	// Jos käytössäsi on muu kuin numeraalinen id niin aja intvalin sijasta arvo mysql_real_escape_string-funktion lävitse.
	$sql = "SELECT * FROM kuvat WHERE id=" . intval(urldecode($_GET['annettu_kuva_id']));
	$result = mysql_query($sql) or trigger_error(mysql_error());

	while ($newArray = mysql_fetch_array($result)) {
		// Nämä kannattaa vielä tulostusvaiheessa ajaa htmlspecialchars-funktion lävitse xss-aukkojen välttämiseksi.
		$item_id = $newArray['id'];
		$item_otsikko = $newArray['otsikko'];
		$item_kuvaus = $newArray['kuvaus'];
		$item_vuosi = $newArray['vuosi'];
		$item_kuukausi = $newArray['kuukausi'];
		$item_kuvai = $newArray['kuvai'];
		$item_kuvap = $newArray['kuvap'];
		$item_kategoria = $newArray['kategoria'];
		$item_ttapa = $newArray['ttapa'];
	}
}
?>

SaQe [12.04.2011 16:36:41]

#

Ymmärsit tarkoittamani oikein, Othnos! Kiitän koodin korjaamisesta.

Tuo ihmettelemäsi koodauksen ulkoasun vaihtelu on tullut koulusta opistusta mallista. Nyt voin huomata, että kaikki ne opetukset mitä koulussa on käyty ovat melkeinpä yhtä tyhjän kanssa.

Eli suuri kiitos sinullekkin avusta!

Sain listaussivun toimimaan ja linkityksen. Kuvapohjasivu ei näytä kuvan tietoja jostain syystä, mutta se ei myöskään näytä yhtään virheilmoitusta vaikka virheiden piilotuskoodin poistin tuolta koodin joukosta. Epähuomiossa se oli sinne aikaisempaan koodiini jäänyt kummittelemaan.

Eli tulostuskoodissani on selvästikin iso häikkä jossain kohden, koska tuo antamasi php koodi on sama tuossa kuvasivussa.. Kiitos jälleen jos joku viitsii neuvoa!

Tässä kuvasivun koodi tulostukseen:

<table width="500" height="640" border="0" align="center" cellpadding="0" cellspacing="0" id="Table_01">
		  <tr>
		<td colspan="4" align="center"><strong><h1><?php echo htmlspecialchars($row['item_otsikko']); ?></h1></strong></td>
	</tr>
	<tr>
		<td width="15" rowspan="5">&nbsp;</td>
		<td colspan="2" align="center"><a href="<?php echo htmlspecialchars($row['item_kuvai']); ?>" rel="lightbox"><img src="<?php echo htmlspecialchars($row['item_kuvai']); ?>" title=" Klikkaa kuvaa suurentaaksesi sen!" width="300 px" height="440 px" hspace="5" vspace="5" border="0" align="top" /></a></td>
		<td width="17" rowspan="5" align="center" valign="top"></td>
	</tr>
	<tr>
		<td width="234" align="center"><strong>Tehty:<br />
		</strong><span class="style3"><?php echo htmlspecialchars($row['item_vuosi']); ?> <?php echo htmlspecialchars($row['item_kuukausi']); ?></span></td>
		<td width="234" align="center"><strong>V&auml;lineet: <br />
		</strong><span class="style3"><?php echo htmlspecialchars($row['item_ttapa']); ?></span></td>
	</tr>
	<tr>
		<td colspan="2">&nbsp;</td>
	</tr>
	<tr>
		<td colspan="2" align="center"><p><?php echo htmlspecialchars($row['item_kuvaus']); ?></p>
		  <p>&nbsp;</p></td>
	</tr>
	<tr>
		<td colspan="2"><?php include("copy.php"); ?></td>
	</tr>
</table>

AkeMake [12.04.2011 17:40:30]

#

En nyt ehdi tuohon koodiin perehtyä, mutta ne virheet saa esille, kun laitat tämän Metabolixin paljon mainostaman rimpsun sinne pääsivun alkuun aivan ensimmäiseksi.

ini_set("error_reporting", E_ALL | E_STRICT);
ini_set("display_errors", 1);

SaQe [12.04.2011 19:01:14]

#

Saan vastaukseksi jokaiseen noihin kohtiin mihin juuri pitäisi tieto hakea tietokannasta:

Notice: Undefined variable: row in /home/tunnus/public_html/kuvapohja.php on line 89 ja niin edelleen...

eli tuo rivi 89 on tuo missä pitäisi hakea tieto kohtaan item_otsikko.

Othnos [12.04.2011 19:25:53]

#

Jos haluat käyttää aikaisempaa koodia niin huomaat, että tiedot tallennetaan muuttujiin $item_id jne. Käytä siis niitä koodissasi. Undefined variable on vapaasti suomennettuna määrittämätön muuttuja eli siihen ei ole laitettu mitään arvoa.

SaQe [18.04.2011 19:35:20]

#

Othnos:

Eli käytänkö mitä muuttujatietoa tuossa tulostuksessa? Anteeksi, se että kysyn asiaa niin, että se pitää selittää rautalangan kautta!

Tietokannassa sarakkeiden otsikot ovat siis ilman tuota "item_" alkua eli muotoa: otsikko ja jokaisessa tietokannan taulun rivissä joka kohdassa on sisältöä.

<?php echo htmlspecialchars($row['item_otsikko']); ?>

Koitin pyöritellä tuota tulostuskohdan koodia erivaihtoehdoilla, mutta en saanut millään sitä toimimaan.

Othnos [18.04.2011 22:54:57]

#

Jos käytät suoraan edellistä koodia pitäisi onnistua seuraavalla tavalla.

// Luetaan rivi kerrallaan $newArray-taulukkoon, josta tiedot löytyvät muodossa $newArray['taulunSarake'] tai $newArray[0] ja indeksi kasvaa sarakkeiden lukumäärän mukaan.
while ($newArray = mysql_fetch_array($result)) {
	echo htmlspecialchars($newArray['id']);
	echo htmlspecialchars($newArray['otsikko']);
	// Jne.
}

Järkevämpi vaihtoehto yleisesti ottaen on kuitenkin tehdä tiedoista ensiksi oma taulukko, joka käydään tulostus vaiheessa vaan foreach-funktiolla läpi. Näin saadaan koodista paremmin jäsenneltyä, koska tiedon haku ja käsittely ovat eripaikassa, kuin tulostus.

// Tehdään tämä tiedoston alussa
if (isset($_GET['annettu_kuva_id'])) {
	// Alustetaan $kuvaTiedot tyhjäksi taulukoksi
	$kuvaTiedot = array();

	// Suoritetaan tietokantakysely
    $kysely = "SELECT * FROM kuvat WHERE id=" . intval(urldecode($_GET['annettu_kuva_id']));
    $tulos = mysql_query($kysely) or trigger_error(mysql_error());

    while ($rivi = mysql_fetch_array($tulos)) {
		// Tallennetaan tiedot muotoon $kuvaTiedot[id]['sarake']
		$kuvaTiedot[$rivi['id']]['otsikko'] = $rivi['otsikko'];
		$kuvaTiedot[$rivi['id']]['kuvaus'] = $rivi['kuvaus'];
		// Jne.
    }
}

// Tulostetaan tiedot halutussa kohdassa
if (isset($kuvaTiedot)) {
	foreach($kuvaTiedot as $kuvaId => $kuvaTieto) {
		?>
		<ul>
			<!-- Tulostetaan kuvan id ja muita tietoja -->
			<li><?php echo $kuvaId; ?></li>
			<li><?php echo htmlspecialchars($kuvaTieto['otsikko']); ?></li>
			<li><?php echo htmlspecialchars($kuvaTieto['kuvaus']); ?></li>
		</ul>
		<?php
	}
}

Edit: Toisaalta sinulla ei tässä tapauksessa tule kuin yhden kuvan tiedot joten saat ne sarakkeiden mukaan taulukkoon suoraan seuraavalla koodilla

$kuvaTieto = mysql_fetch_array($tulos);
// echo htmlspecialchars($kuvaTieto['otsikko']) . htmlspecialchars($kuvaTieto['kuvaus']);

SaQe [19.04.2011 20:51:51]

#

Kiitoksia tosi paljon jälleen! Nyt kuvasivu toimii kuten pitääkin!

Tuossa huomasin, että sillä sivulla, jossa kuvista listataan vain pikkukuvat linkkeineen vuoden ja tekotavan perusteella, niin koodi tekee yhden rivin taulukon. Kun kuvien yhteismäärä kasvaa suureksi niin tuo tulostustaulukko rikkoo muun ulkoasun rakenteen.

Olisiko siis mitään tapaa tuota kuvien tulostusta kontrolloida? Esimerkiksi joka kymmenenen listatun kuvan jälkeen koodi tekisi uuden rivin taulukkoon?

vai voiko tulostusta tehdä muuten kuin taulukkoon?

Othnos [20.04.2011 00:36:07]

#

SaQe kirjoitti:

... Olisiko siis mitään tapaa tuota kuvien tulostusta kontrolloida? Esimerkiksi joka kymmenenen listatun kuvan jälkeen koodi tekisi uuden rivin taulukkoon?

vai voiko tulostusta tehdä muuten kuin taulukkoon?

Voit esimerkiksi luoda muuttujan arvolla 1 ennen kuvien tulostusta ja joka tulostus kierroksella kasvatat muuttujaa yhdellä. Tarkistat vain tulostuksen yhteydessä vaikka jakojäännöksellä onko rivinvaihdon aika.

// Ennen silmukkaa
$rivinvaihto = 1;
$kuviaPerRivi = 10;

// Silmukan sisälle
if ($rivinvaihto % $kuviaPerRivi === 0) {
	echo '</tr><tr>';
}
$rivinvaihto++;

Tulostuksen voi tehdä aivan yhtähyvin ilman taulukkoakin ja taitaa olla jopa semanttisesti oikeampaa tehdä se muulla tapaa? Joku enemmän tietävä saa täsmentää. Voit vaikka tulostaa kuvat peräkkäin ja katkaista rivit <br />-tagilla.

t0ll0 [20.04.2011 02:02:11]

#

Itse olen käyttäny rivittämisessä tämän tyylistä:

// Ennen silmukkaa
$rivinvaihto = 0;
$kuviaPerRivi = 10;

// Silmukan sisälle
$rivinvaihto++;

if($rivinvaihto == $kuviaPerRivi){
 echo "</tr><tr>";
 $rivinvaihto = 0;
}

Periaatteessa aivan sama kuin Othnosin koodi, tässä ei vaan lasketa jakojäännöksiä.

Ei tarvitse käyttää taulukkoa. Kätevämpi tapa olisi varmastikkin ihan listana jolle annetaan css-tyylinä display: inline;


Sivun alkuun

Vastaus

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

Tietoa sivustosta