S PHP tepre začínám ...

Dobrý den,

hned na úvod bych chtěl upozornit, že s PHP dělám teprve asi měsíc. Sice jsim koupil tu knížku od Kostka o PHP, ale daleko moc nejsem.

Mnohokrát jsem přemýšlel, jak utvořit levé menu, stejné na všech stránkách, tak, abych, když ho potřebuji aktualizovat, ho aktualizoval jen jednou a "ono se to samo přeneslo" do všech ostatních stránek. Ale nepřišel jsem na to. Zatím to na svých stránkách (http://srdce-erinelu.wz.cz) řeším manuálně, tzn, že levé menu měním totálně na všech stránkách manuálně - a to je dosti náročné. Už jsem si všiml, že některé stránky používají index.php misto index. html - myslím, že to je právě kvůli takovýmto menu - ovšem stále tomu nerozumím.

Pokud by mi někdo tuto problematiku trochu osvětlil a s mmými začátky PHP pomáhal, byl bych mu hrozně vděčný.

Předem děkuji!
Na to je docela přímočaré a velice jednoduché řešení.

Jsou to tyto instrukce:
require "nejakytextovydokument";
která na místo <?php require "index.html"; ?> vloží celý dokument index.html, který pak může být společný pro větší počet stránek.

Obdobně funguje instrukce
include "nejakytextovydokument";
která umožňuje vícenásobné vkládání např. cyklech.
Většina stránkej je asi takhle... maj index.php kde je základní lišta a další věci... To co tam potom chceš hodit tak tam dáš require("neco.html");
A budeš tam mít sobor neco.html...
A udělej to třebas takhle udělej odkaz na index.php?id=neco.html
a potom ve scriptu už akorát udělej require($id);
Ale předtím udělej podmínku (file_exists()) zda ten soubor existuje...
>takhle udělej odkaz na index.php?id=neco.html

bacha na to, aby ti tam nezadal nekdo cestu k souboru, ktery nechces pustit ven! dost casto je to pricinou bezpecnostnich problemu nejen zacatecniku... pri trose stesti a tve neopatrnosti se takto muze clovek dostat k souborum, ktere nemaji byt z webu vubec videt...

m.
Mokrát vám všem děkuji za pro mě velmi cenné rady - i když tomu takhle plně nerozumím. Kouknu na ty příkazy do chytré knížky a doufám, že to pochopím. Kdyžtak se opět na něco zeptám - tp je velmi pravděpodobné.

Díky
jednoduse: include("kus_kodu.php"); ti vlozi v miste volani obsah souboru kus_kodu.php (to je vse...) - uz to snad je jasnejsi? to menu das treba do souboru menu.htm a v miste kde ma byt na strankach menu, ho vkladas pomoci include() (resp. require). pokud chces udelat v menu zmenu, pak udelas zmenu pouze v souboru menu.htm...

m.s.
Co dodat;-))
Zdravím!

Tak jsem o tom všem přemýšlel a řadu věcí i otestoval – něco fungovalo, něco ne a něčemu jsem nerozuměl.
Vůbec třeba nechápu ty rady s „id“ – nevím jak by to přesně fungovalo. Ale jinak jsem to snad pochopil.

Zkusil jsem ale tohle: vytvářím stránky v tabulkové úpravě (horní lišta, levé menu, obsah stránky a dolní patička – to tvoří shodnou úpravu na všech stránkách) a zkusil jsem HTML kód rozdělit na dvě části (před tagem <td> jedna část pojmenovaná menu_1.html, a před ukončovacím </td> druhá část pojmenovaná menu_2.html).
Na základě tohoto rozdělení jsem udělal skript se standartizovanými menu (patička, horní lišta, …) a pojmenoval ho index.php

Zde je obsah souboru „menu_1.html“:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">


<head>
<title>Untitled</title>

<meta name="resource-type" content="document">
<meta name="keywords" content="modul, svět, drd, DrD, dračí doupě, Ad&d, Ad&D, fantasy, jeskyně">
<meta name="description" content="Oficiální stránky modulu pro hry na hrdiny Srdce Erinelu">
<meta name="copyright" content="Všechna práva vyhrazena.">
<meta name="distribution" content="global">
<meta name="robots" content="all">
<meta http-equiv="Content-type" content="text/html; charset=windows-1250">
<meta name="author" content="Tomáš Kučera">

<link rel="stylesheet" type="text/css" href="./standart.css">

<style>

p {text-indent: 70px; margin-bottom: 0px; margin-top: 0px}

</style>

</head>

<body>

<script src="autori.js"></script>

<center>
<table border="0" width="760" cellspacing="0">
<tr>
<!--Začátek horní lišty-->
<td colspan="2" height="80" width="760" style="background: url('./image/horni.gif') fixed no-repeat center top; background-color: rgb(251,222,177)">
</td>
</tr>
<tr valign="top">
<!--Začátek levého indexu-->
<td width="170" style="background: url('./image/levy.gif') fixed no-repeat left top; background-color: rgb(251,222,177)">

<a href="uvodem.html" target="_top"><img src="./image/uvodem1.gif" onmouseover="this.src = './image/uvodem2.gif';" onmouseout="this.src = './image/uvodem1.gif';" border="0"></a>
<br>
<a href="vitej.html" target="_top"><img src="./image/vitej1.gif" onmouseover="this.src = './image/vitej2.gif';" onmouseout="this.src = './image/vitej1.gif';" border="0"></a>
<a href="legenda.html" target="_top"><img src="./image/legenda2.gif" onmouseover="this.src = './image/legenda2.gif';" onmouseout="this.src = './image/legenda2.gif';" border="0"></a>
<a href="strucne_dejiny.html" target="_top"><img src="./image/strucne1.gif" onmouseover="this.src = './image/strucne2.gif';" onmouseout="this.src = './image/strucne1.gif';" border="0"></a>


<br>
<br>
<center><img src="./image/ikonka.gif" width="90" height="30" alt="Podpořte náš web!"></center>

<br>
<br>

<center><a href="veverka/veverka.html" target="_blank"><img src="image/vev-iko.gif" border="0"></a></center>

</td>

<!--Začátek obsahu-->
<td width="590" style="background: url('./image/pravy.gif') fixed no-repeat right center; background-color: rgb(251,222,177)">


Zde je obsah souboru „menu_2.html“:

</td>
</tr>
<tr>
<!--Začátek patičky-->
<td colspan="2" width="760" height="80" style="background: url('./image/dolni.gif') fixed no-repeat center bottom; background-color: rgb(251,222,177)">

<center>© 2002 <a href="autori.html" onClick="openWindow();" target="JSL">Paskal</a> a <a href="autori.html" onClick="openWindow();" target="JSL">Tintin</a></center>

</td>
</tr>
</table>
</center>

</body>



A zde „pokus.php“:

<? require "menu_1.html"; ?>

Pokusný text v obsahu stránky.

<? require "menu_2.html"; ?>


A zde je právě ten problém: problém s adresováním. Pokud totiž stránky uložím do adresářů o několika vrstvách, stránka se nenačte. Musel bych totiž adresovat (pro první úroveň) ../menu_1.html, pro druhou úroveň ../../menu_1.html >>>>>>>>>>>> a tak dostávám opět několik různých skriptů –a každý musím zvlášť aktualizovat. Takže mi to práci usnadní jen o cca 60% - a to je málo.

Ještě větší problém ale je, že v menu_1.html adresuji obrázky pro nultou úroveň a pokud budu pracovat ve vyšších úrovních s tím samým skriptem – nebude to fungovat! Protože tam píšu: src="./image/uvodem1.gif", pokud to dám do vyššího adresáře, budu muset psát src="../image/uvodem1.gif". Jinak totiž ty obrázky nemůže najít – vede k nim pak chybná cesta. A to je další spousta skriptů, která mi sice práci při aktualizaci menu pomůže, ale ne dostatečně ….

Napadlo mě to vyřešit pomocí podmínek, ale nějak mi to nefungovalo.

Rozumíte mému problému? Pokud ano, můžete mi s tím pomoci? :-) Ale asi se v tom nevyznáte. co? :-( No, uvidíme, jestli jsem se vyjádřil srozumitelně ... :-)

Děkuji
Ja jsem to snad pochopil, ikdyz cist to jsem opravdu silu nemel :))) ... Ja to mam nekde reseny podobne ...

Bud to delam tak, ze vsechny PHP stranky, ktery includujou tyhle soubory jsou na druhy urovni (A aby v tom byl poradek, tak obecne vsechny soubory roztridim tak, aby byly na druhy urovni)

text/basic/login.php
text/kronika/insert.php
data/kronika/data.dat.php
...

S touhle strukturou jsem si zatim vystacil a je to i celkem prehledny IMHO.


Nebo to delam tak, ze v tom "pokus.php" dam na zacatek ...

$gs_RootDir = "../../";
nebo
$gs_RootDir = "../";

... a tuhle promenou pouzivak ke skladani jmena souboru v includovanych souborech ... $gs_RootDir."img/cosi/neco.jpg"

... a nebo samozrejme muzes pouzit absolutni cesty, kdyz si zjistis, jak je tady na WZ organizovana diskova struktura adresaru.

Radek
pro doplneni radka... cesta odkazu v menu se vzdy bude vztahovat k pozici adresy skriptu, takze s tim pocitej a udelej si prehlednou strukturu adresaru, tak aby jsi se v tom vyznal i za nejakou dobu a soucasne se v nasel az se ponoris prilis hluboko :-)

pouzivat absolutni cestu bych nedoporucoval kvuli snadne prenositelnosti (navic neco se zmeni na serveru a budes muset vse predelavat). kdyz uz, tak ji urcovat pomoci nejake promenne, ktera bude nastavena budto php promennyma nebo (podle me jistejsi) rucne v nejakem konfiguraku...

m.s.
Tak tu mám opět problém .... spiš něčemu nerozumám.

Otázka: ODBC nebo MySQL?

Co z těchto "systémů" mám používat? Nebo, který tenhle server podporuje. Vím, že ODBC je jen ovladač k nativnímu protokulu, pomocí kterého se ditazuje na SQL server. To mi však moc nepomůže.

Holt nevím, co je lepší nebo tak. A co tady funguje.

PS: Není ODBC něco jako "prodloužená ruka" MySQL, pomocí které komunikuje s SQL serverem?

Díkys
A ještě tohle. Můžu si doma na localu vytvořit databázi a pak ji sem jen zkopírovat?
ODBC je jenom protokol, nic vic
takze pokud chces lezt z php do mysql, pouzijes nativni funkce php, pokud muzu doporucit, pouzij nejakou z "knihoven" obalujici (wrapping in english :) standardni funkce do rozhrani nezavisleho na typu databaze, o ten typ zas tak moc nejde, spis kvuli tomu, ze prace s takovou ADODB je prijemnejsi nez psat porad ty mysql_xxx()

kdybys chtel pristupovat k mysql serveru z nejakych win aplikaci, tak by se ti odbc asi hodilo

ad kopirovani databaze: jasne, nebudes sice kopirovat soubory, ale vytvoris si dump databaze a ten pak nalijes pres mysql.wz.cz do sve databaze na serveru
Že vás ale zásobuju otázkama, co?

Mám v databázi tabulku "Registrace" - v ní je položka Cislo (primary key). Chci totiž na mých stránkách vytvořit registraci uživatelů s možnoatí zasílání novinek na mail. Už jsem napsla nějakej skript na přidání užovatele, ale problem ....

Potřebuju, aby se scrupt připojil na Registrace, našel položku Cislo a její nejvyší hodnotu (každý uživatel bude mít svou). Pak to nejvyšší číslo zvýšil o +1 a vrátil zpět společně s údaji o novém reg. užovateli. Ale to vyhledání a navýšení mi nefunguje.

Tady ten script:

<?
do {
@$spojeni = MySQL_Connect(/*PRO WEB:: "mysql.webzdarma.cz", "srdce-erinelu.wz.cz", "moje heslo"*/);
if (!$spojeni):
echo "Nepodařilo se připojitk databázi.\n";
break;
endif;

@$vysledek = MySQL_DB_Query("test" /*PRO WEB: "srdce-erinelu"*/, "select Max(Cislo)+1 from Registrace", $spojeni); /*TADY HLEDÁ ČÍSLO*/

while ($cislo = MySQL_Fetch_Row($vysledek)):
/* echo $cislo[0]."<br>\n"; - vytiskne o jedna větší číslo, než má poslední uživatel, doufám */
endwhile;

}while (false);


$status = true;


do {
if (!IsSet($cislo)):
$status = false;
break;
endif;

@$spojeni = MySQL_Connect(/*PRO WEB: "mysql.webzdarma.cz", "srdce-erinelu.wz.cz", "moje heslo"*/);
if (!$spojeni):
$status = false;
echo "Nepodařilo se připojit k databázi.";
break;
endif;

@$vlozit = MySQL_DB_Query("test" /*PRO WEB: "srdce-erinelu"*/, "INSERT INTO Registrace VALUES ('$cislo', '$Jmeno', '$Prijmeni', '$Nick', '$Email', '$Novinky', '$Heslo1')", $spojeni);
if (!$vlozit):
$status = false;
echo "Data se nepodařilo uložit do databáze.";
break;
endif;

} while (false);

?>

Vím, zase jeden zmatený zdroj, ale je tu malé okno.

Doufám, že to nějaký profík přeluští a poradí mi,co s tím.

PS: A jak bych udělal zasílání novinek na mail?

Dík
>Potřebuju, aby se scrupt připojil na Registrace, našel položku Cislo a její nejvyší hodnotu (každý uživatel bude mít svou). Pak to nejvyšší číslo zvýšil o +1 a vrátil zpět společně s údaji o novém reg. užovateli. Ale to vyhledání a navýšení mi nefunguje.

@$cis = mysql_query("select cislo from inzerat order by cislo desc");
@$cislo = mysql_result($vys_cis,0)+1;
Nebo muzes u toho sloupce Cislo zapnout vlastnost Autoincrement a pak ji pri insertu neuvedes a ona se takhle defaultne bude doplnovat.

Pokud budes chtit toto cislo zjistit pro dalsi pouziti, po insertu zavolas mysql_insert_id ().

Napriklad ...

gf_DBCommand("INSERT INTO t01sys (t01nick_, t01right, t01fname, t01sname, t01email, t01www__, t01icq__, t01sex__, t01icon_, t01cdate, t01caddr) values ('$ps_t01nick_', 1, '$ps_t01fname', '$ps_t01sname', '$ps_t01email', '$ps_t01www__', '$ps_t01icq__', '$ps_t01sex__', 12, '".date("Y-m-d H:i:s")."','$REMOTE_ADDR')");

$ln_t01pk___ = mysql_insert_id ();

Radek
Ta rada s tím adresováním pomocí proměné $root_dir="../" nebo :../../ atd je geniální! Fakt to funguje a je to trivální.

Ještě k tomu číslo - vynechám ho. V databázi nastavím primary key u polozky nick. Potom, když uživatel zadá nick, pak se uloží do databáze. Je tedy vyloučeno, abych měl v databázi dva různé lidi pod stejným nickem? Podle mne ano - a je to vyřešeno. Myslím. Co vy na to?
Constraint Primary Key je pochopitelne i unikatni ... ANO.

Radek
ja to mam na strankach (tema je vo hovnu ale celkem se mi vyvedly ((teda myslim)) udelany tak, ze mam natahovany do stranek script.js ve kterem je to napsane v scriptu pomoci document.write .....

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

v hlavice je tohle (to je to co ti natahne ten soubor se scriptem....)
<SCRIPT language=JavaScript src="script.js"
type=text/javascript></SCRIPT>

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

a nekde v tele stranky mas tohle:

<SCRIPT language=JavaScript>
<!--
zobraz_nabidku();
// -->
</SCRIPT>

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

funkci mas pak definovanou v tom souboru:

<!-- (tohle tam nevkladej) tady ti zacne ten soubor-->
function zobraz_nabidku(){

document.write(' pole co chces zobrazit aby bylo stejne, vlozis sem... ');

}
<!-- (tohle tam nevkladej) a tady ti skonci-->

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

Hodne stesti pri pousech... (nebude-li ti to jasne tak se koukni na http://heaven.wz.cz/diablo)