Új hozzászólás Aktív témák
-
j0k3r!
senior tag
ez tokjo, csak egyatalan nem az, amit az elobb kertel:
"tehát ha van id és about akkor echozza ki, hogy current"no offense: holnap szerintem avval kellene kezdened, hogy atnezed a programozasi alapokat, mert ennel csak komplexebb problemakkal fogsz szembesulni egy weboldal/webalkalmazas elkeszitese soran. ehhez ajanlanam neked ezt a konyvet: [link]
some men just wanna watch the world burn...
-
Sk8erPeter
nagyúr
Akkor megnyugodtam, azt hittem, csak nekem tűnik értelmetlennek.
Egy tanács: inkább add át az ilyen értékeket egy változónak, mielőtt komplexebb vizsgálatokat végeznél rajtuk, mert akkor nem kell állandóan lecsekkolni, hogy létezik-e a megadott indexen bármi.
Tehát így:
$id = isset($_GET['id']) ? $_GET['id'] : NULL;
VAGY
$id = isset($_GET['id']) ? $_GET['id'] : '';... és így tovább.
Utána mehet a vizsgálat:
switch($id){
case 'tökömtudja':
// ...
break;
case 'mittudomén':
// ...
break;
default:
break;
}Sk8erPeter
-
Sk8erPeter
nagyúr
Van. Például ha nem szoksz rá, hogy csekkold, akkor lehet, hogy olyan esetekben is elvárod egy adott tömbindex létezését, amikor tuti, hogy nem fog létezni, megpróbálod felhasználni az értékét, aztán nézel, hogy most mi a szarért nem működik a kódod. Aztán debuggolsz, rájössz, hogy ja, hát persze, mivel ott az az index nincs beállítva. És végül eljutsz oda, hogy csak kéne oda egy ellenőrzés.
Normális nyelvek esetén eleve sikítozik a fordító, nem is lehet ilyen gányolásokat csinálni, vagy kapsz egy buzinagy runtime exceptiont, stb., de a PHP az más. Az megengedi neked, hogy tákolgass.
Persze választhatod azt az utat is, amit sajnos sokan mások még javasolnak is, hogy elkezdesz gányolni: elrejted a hibákat, mintha egy strucc lennél, ami a homokba dugja a fejét, ha para van, aztán csodálkozol, ha közben elmar egy raptor.Sk8erPeter
-
fordfairlane
veterán
Beraksz egy isset-et a feltételvizsgálat elé, oszt jónapot.
if(isset($_GET['clear']) and $_GET['clear'] == 'true')
Ha sok bejövőparamétered van, akkor érdemes másfajta megoldást választani ahelyett, hogy isset-tel szemeteled tele az összes feltételvizsgálatot, de egyetlen paraméter esetében elég ennyi.
x gon' give it to ya
-
fordfairlane
veterán
A 'miért'-re a válasz annyi, hogy a különböző PHP installációkon különböző a hibaüzenetek megjelenítéseinek a beállítása. Mostanában egyre sűrűbb az, hogy a PHP minden hibaüzenetet kiír, még a notice-okat is, illetve production installnál nem kiírja, hanem logolja.
Ez sokszor azt eredményezi, hogy a régebbi, "legacy" kódsorok, amik eddig jól működtek, most mindenféle noticeokat produkálnak.
[ Szerkesztve ]
x gon' give it to ya
-
Sk8erPeter
nagyúr
Szerintem senki nem fog tudni itt konkrét határokat húzni neked, a legjobb válasz erre megint az "attól függ".
Attól is függ, hogy elbírsz-e az 50000+ felhasználóddal, hogy milyen szerverek vannak a háttérben, mennyire erőforrás-kímélő a kód, stb.
Ettől függetlenül nyilván nem véletlen, hogy nagyobb projektekhez már azért a PHP-t legfeljebb vegyítve használják (lásd Facebook), a Stack Exchange családhoz tartozó oldalak (Stack Overflow, Super User, stb.) már ASP.NET-ben készülnek, stb.A Symfony meg azért jó, amiért jó általában egy keretrendszer, hogy egységesebbé teszi, szigorúbb szabályok közé szorítja, de egyben elősegíti és gyorsítja a kódolást.
"a php mellett nagy érv, hogy könnyű és gyors eredményt produkál, olcsón"
Ez igaz.
Ezzel együtt ez sajnos sokszor a minőség rovására is megy. (Lásd nagyszámú olcsó, csakis PHP-n nevelkedett, szűkebb látókörű, és/vagy fejlődni nem akaró munkaerő.)Sk8erPeter
-
j0k3r!
senior tag
ezen meg egy kicsit javitani kellene szerintem. a $logged_in valtozonak az osztalyon belul lenne a helye, raadasul a zarojelezes se stimmel, valamint nem kavarnam ossze a session kezelest es a user autentikaciot egy osztalyon belul.
en egy egyszerubb session kezelo osztalyt ilyen funkciokkal tudnek elkepzelni: start, set, get, unset, destroy (utobbi ketto mehetne egy helyre - pl.: egy default ertekkel rendelkezo parameterrel)
az autentikaciot tartalmazo osztaly meg a "session wrapper" osztaly segitsegevel manipulalna a $_SESSION tombot
mod: ja meg ugye erdemes lenne a camelCase nevkonvenciot kovetni
[ Szerkesztve ]
some men just wanna watch the world burn...
-
fordfairlane
veterán
Ha a user bármilyen nevet adhat a feltöltendő filenak akkor az lehet potenciális biztonsági rés?
Lehet, mivel a filekezelő függvények nem szimpla fájlnévként értelmezik a fájlnév paramétert, így pl. komplett elérési utat is lehet megadni. A fájlnévben vezérlőkarakterek is lehetnek, amik szegmentálják a nevet. Ilyen pl. a \ vagy unixon a /.
[ Szerkesztve ]
x gon' give it to ya
-
Tele von Zsinór
őstag
Felettem kolléga már írt egyet, de hozzáteszem a magamét: sok formátumban (kiragadott példa: jpeg) van megjegyzés mező, ahová azt írsz, amit akarsz. Akár php kódot is. És akkor képzeld el, ha ezt .php kiterjesztéssel mented a feltöltött fileok (általában nyilvánosan elérhető) mappájába.
Én valami autogenerált értéket szoktam névként használni (például a hozzá kapcsolódó tábla primary key-ét).
-
Sk8erPeter
nagyúr
Itt már leírtam a fájlnevekre vonatkozó dolgot, arra semmit nem reagáltál. (whitelist)
A leírás mezőt meg általában a képtől/bármi egyéb fájltól külön szokták kezelni, nem is minden képformátum támogatja a leírás "beleégetését" (vagy nem tudom, erre gondoltál-e), adatbázisban a file-hoz tartozó id-val rendeled össze a kiegészítő mezőket (maga a fájlnév, leírás, szerző, stb.).
A leírásban lévő karaktereket meg a szokásos módon szűröd (pl. legegyszerűbb példaként htmlentities()-t is használva, stb.), adatbázisban tárolod, és nem fájlban.Sk8erPeter
-
Sk8erPeter
nagyúr
Te tettél fel kérdést felhasználó által megadott fájlnevekről, és én erre reagáltam... Arra mondtam, hogy whitelisteket érdemes alkalmazni.
Egyébként szerintem értelmesebb egy beszédes képnév, mint egy névben lévő id, ami totál semmitmondó, ha ránéz az ember. Azt nem tudom, SEO-szempontból mennyit nyom a latba, de elvileg ennek is lehet szerepe, hogy maga a fájlnév is legyen beszédes. Ettől még olyan id-t generálsz bele PLUSZBAN, amilyet akarsz.
A képeket normális esetben így is-úgy is id szerint tárolod az adatbázisban, amihez - mint említettem - tárolod az egyéb adatait is, ezek közül a fájlnév is csak egy a sok közül, vagyis nem a kép egyértelmű azonosítására szolgál, az "csak" egy fizikai elérhetőség, de jó esetben úgy tárolod, hogy tök mindegy, mikor, mire változtatod a fájlnevet, attól még beazonosítható marad a kép.=======
(#10228) ArchElf : OK.
Én egyébként olykor ciklusoknál is az $i és $j és $k és egyebek helyett beszédesebb indexneveket használok, de persze csak akkor, ha ennek a kódban van az olvashatóságot javító szerepe (sokszor van).
A lokális változónevek tekintetében én egyelőre a kódjaimban az underscore-t használom túlsúlyban, mostanában vettem fel a camelCase-zel kódolás szokását PHP-nél is.[ Szerkesztve ]
Sk8erPeter
-
Sk8erPeter
nagyúr
Gondolom ezekre a függvényekre gondolsz: imagepng és társai, mutat is példát, hogyan tudsz PHP segítségével képeket kiíratni a böngészőbe:
<?php
$im = imagecreatefrompng("test.png");
header('Content-Type: image/png');
imagepng($im);
imagedestroy($im);Esetleg megoldás lehet, hogy mindenféle kép megjelenítését átirányítod .htaccess-szel egy PHP-fájlba, amiben elvégzed a nézettség naplózását, megnézed, milyen kiterjesztésű a kép, és aszerint használod a headert, majd használsz imagepng-t, imagejpeg-et vagy a többit.
Sk8erPeter
-
Cathfaern
nagyúr
Mi számít kép megnézésének? Ha már a thumbnailt látja, vagy ha konkrétan rákattint egy képre?
Bár a lényegen sokat nem változtat: felteszem magát a képet php-ból iratod ki. Elég ha a kiiratásra írsz egy functiont, ami a kiírás mellett incrementálja az adott képhez tartozó számlálót is. Legalábbis szerintem nem nagyon van értelme ennél jobban túlbonyolítani -
Soak
veterán
Ezzel a kóddal oldottam meg a foreach között :
$id = $photo->id;
mysql_query("UPDATE photographs SET views = views+1 WHERE id=".$id." ");Mondjuk ez egyelőre minden frissítésnél növel egyet, szóval vissza lehet vele élni, mármint e-péniszt növelésre, de ezt majd később oldom meg
-
zzolika
aktív tag
Az oldalon van egy input form, sok mezõvel, és van két gomb, amit szeretnék ha megnyomásra két különbözõ PHP eljárást indítana el, de maradna ugyanebben a ablakban.
A gombnyomásra aktualizálja a form néhány mezõjét.
Ezért raktam a PHP eljárást ugyanabban az oldalba, hogy ne nyíljon meg új ablakban.
<form name="form_vegar" method="post" action="">
Tehát az action üres, ugyanitt kéne keresnie a meghívott függvényt is.
Ha üres az action, akkor mit indít el?
<input name="Submit" type="submit" value="Szamol" onClick="szamol()">
Mert így nem megy ha PHP függvény a szamol(), csak ha Javascript.szerk: Kezdem érteni. Tehát a gombra csak egy külsõ fileban megadott xxxx.php-t tudok elindítani, (mivel a php függvény igazából nem is létezik a kliens oldal számára, amíg a szerver ki nem számolta és el nem küldte, csak az eredményt kapja meg a kliens böngészõ) amit a szerver számol ki.
Tehát ezt a fügve'nyt mindenképpen külön file-ba kell tennem, hogy el tudjam indítani. Meg lehet oldani azt, hogy ugyanebben az ablakban maradjak, csak frissüljön a tartalma?[ Szerkesztve ]
-
Soak
veterán
Az éjjel megálmodtam. Elválik majd, hogy mennyira bírja a szerver.
public static function show_all_relevant_event(){
$friends = Relation::find_all_friends($_SESSION['user_id']);
$events = self::find_all();
foreach($events as $event){
$author_id = $event->users_id;
foreach($friends as $friend){
$friend_id = $friend->friend_id;
if($friend_id == $author_id){
$filename = $event->photograph_filename;
$username = $event->users_username;
$datetime = strtotime($event->dateofcreation);
$mysqldate = date("F j, G:i ", $datetime);
echo "itt van a kontent";
}
}
}
}A find_all functio már alaprból csökkenő sorrendbe adja az eventeket.
-
Sk8erPeter
nagyúr
"az action="" azt jelenti, hogy a form hol keresi a függvényt"
Nem, az azt jelenti, hogy megadod, HOVA, melyik feldolgozó fájlba küldöd el a form adatait. Nem keres semmilyen függvényt, és ennek önmagában még a PHP-hoz sincs köze. A megadott metódusoknak a HTTP-protokollhoz van köze, meg a böngészők működési mechanizmusához. Az action attribútumban megadott feldolgozó fájl akár nyugodtan lehetne ASP.NET fájl is."valamint fontos a name is mert a $_POST onnan tudja, hogy most ő van porondon."
A $_POST nem tud semmit. Az csak egy tömb, a kapott adatokkal. A name attribútum valóban kell, mert szerveroldalon csak így kapod meg a bevitt adatokat.[ Szerkesztve ]
Sk8erPeter
-
Sk8erPeter
nagyúr
Bocs, de muszáj megint pontosítanom, nem kötekedésből, csak hogy ne vezessen félre senkit. Ne vedd rossz néven, én sem szoktam, ha korrigálnak, sőt, ha jó a korrekció, annak örülök is.
"Magyarul, ha te a böngésző elött ülsz és megnézed a forráskódot akkor csak html lesz
benne."
Nem feltétlenül HTML, ha más content type-ra vonatkozó headert küldött ki a szerver, és nem HTML-tartalmat rakott össze."Ezzel eléred azt, hogy ugymond a te gépeden egy könyvtár ki lesz nevezve servernek"
Könyvtár nem lehet kinevezve szervernek.
A WAMP mozaikszóban benne van az Apache is, na az a szerver (webszerver). Az Apache-hoz tartozó különböző hostokhoz pedig különböző gyökérkönyvtárak tartozhatnak, mindez csupán beállítás kérdése. Az alapértelmezett, localhosthoz tartozó gyökérkönyvtárat is könnyen át lehet állítani az Apache megfelelő konfigurációs fájljában. De ugyanezt a gyökérkönyvtárat tetszőleges számú másik (virtual)hosthoz beállíthatod.Sk8erPeter
-
Sk8erPeter
nagyúr
Nem kell túlbonyolítani, de ha már tanítasz, ne hülyeségeket verj a diákod fejébe...
Ezt írtad:
"Ezzel eléred azt, hogy ugymond a te gépeden egy könyvtár ki lesz nevezve servernek"
ez nem igaz, és félre is vezeti, ezért ezt is írhattad volna:
"A WAMP telepítése után lesz egy c:\wamp\www könyvtárad, amibe pakolhatod a http://localhost címen elérhető weboldalad tartalmát, és már tesztelheted is."
Nincs túlbonyolítva.Sk8erPeter
-
-
zzolika
aktív tag
Ennyit még tudok, hogy a php kódot a szerver hajtja végre, és csak az eredményt adja vissza a kliensnek.
Egy egyszerû kérdést tettem fel, hogy hogyan lehet meghívni egy gomb megnyomására egy PHP függvényt. Bocs hogy nem tudom magamtól, ezért kérdeztem. A topic címe nem az hogy PHP csak profiknak... -
Most 2 query-t intézel az adatbázis felé, az egyik egy nagy halom felesleges rekordot is visszaad, míg a másik (find_all_friends) jó eséllyel felesleges oszlopokat is lekérdez.
A megoldást egy tárolt eljárás jelentené, ami paraméterben megkapja a $_SESSION['user_id']-t, majd visszaadja csak azt, amit kell. A logikát már leírtad, SQL-ben sem lesz nehéz megfogalmazni, mit is szeretnél. Ha ezt így összehozod, akkor egyetlen felesleges műveletet sem fogsz végezni.
-
cucka
addikt
Már írták a tárolt eljárást, de szerintem a függvényed által szállított végeredményt egy normálisan összerakott sql lekérdezés is vissza tudná adni. Egy join (főleg, ha még index is van hozzá) összehasonlíthatatlanul gyorsabb és jobb megoldás, mint ha ugyanezt php-ban bohóckodod össze.
-
cucka
addikt
Egy ilyen sql-el érdemes elindulni:
select events.* from events where users_id in (select friend_id from relations where users_id={$user_id}) order by dateofcreation ascAz in()-ben található lekérdezés kiszedi a $user_id-hez tartozó barátok azonosítóját (ide php-ban be kell helyettesíteni a $user_id változót. A külső lekérdezés meg egyszerűen listázza az events táblát, leszűrve a megfelelő felhasználói azonosítók szerint. Ha a barát adataira is szükség van, akkor bejoin-olod a users táblát is és kész.
A te php-s megoldásod annyi soron megy végig, amennyi a userek és a relációk számának szorzata, tehát az algoritmusod négyzetes.
Ebben az sql-es megoldásban a belső lekérdezés csak egyszer fut le és az index miatt logn időben végez, a külső lekérdezés pedig végigfut az összes soron, de egy index létrehozásával ezt szintén meg tudja oldani logn időben.
Gondolatkísérlet: tegyük fel, hogy nő az oldalad látogatottsága. Tegyük fel, hogy az eredetihez képest tízszer annyi felhasználó van, ami mondjuk húszszor annyi relációt jelent. Ez esetben:
- az én lekérdezésem nagyjából ugyanannyi idő alatt végez a kereséssel, mint előtte
- a te php-s megoldásod 200-szor ( ) annyi műveletet fog végezni, mint előtte[ Szerkesztve ]
-
cucka
addikt
Félreértettél, nem azért írtam ilyen sokat, hogy leszóljalak, hanem hogy meg is magyarázzam, hogy az általam írt megoldás miért jobb, mit a tied.
Általában akkor szoktam ide írni, amikor úgy érzem, a válaszomból a másik fél tanulhat is valamit. Ha csak simán meg kell oldani/le kell kódolni egy feladatot, azt úgy hívom, hogy munkahely. -
trisztan94
őstag
Hát én megvettem 60 dolcsiért a Coda 2-őt, amit mindenki dicsér, nem találok benne hibakeresőt php-hoz, a Coda 1-ben bezzeg volt.. Textmate 46 dolcsi, nincs most annyim sajna, a trial meg már lejárt. Amúgy tényleg remek kis progi, dehát nem tudok mit csinálni
https://heureka-kreativ.hu
-
Sk8erPeter
nagyúr
A linkbe tedd bele a fotónak mondjuk az id-ját, és aszerint szűrj.
Pl. /photos.php?id=123123Így már lesz $_GET['id']-d.
De felhasználótól érkező adatot soha ne hagyj ellenőrizetlenül!
Mielőtt adatbázis-query-t futtatnál, escape-eld - de inkább jobbat javaslok, használj prepared statementeket!
Ezt muszáj belinkelnem: [link].Szerk.:
echo " <a href=\"photos.php?page={$i}\">{$i}</a> ";
HELYETT pedig lehetne
echo ' <a href="photos.php?page='.$i.'">'.$i.'</a> ';[ Szerkesztve ]
Sk8erPeter
-
Sk8erPeter
nagyúr
Pedig "elég magától értetődő mi történik", épp Te írtad.
"csak hogyan linkelen egy olyan id-t amit elvileg adott környezetben nem látok, mivel minden esetben csak 1 képet kapok"
Mi az, hogy "adott környezetben nem látod"?
Normális esetben egy képhez egyetlen id tartozik, tehát egyértelműen azonosítja.
Az offsetnek pedig a címben is megadhatod a kezdetét és végét, vagy ahogy most is csinálod, egyszerűen megadod a page számát, és akkor nyilván nem kell id a címbe.Szerk.: egyébként most látom, hogy itt az id-vel user id-t azonosítasz... nem tudom, milyen rendszert használsz, miért így van megoldva, és ennek mi értelme. Meg van egy ilyen:
if(!isset($_GET['id']) AND !isset($_GET['user']))
{
$id = $_SESSION['user_id'];
}A $_SESSION['user_id'] biztos, hogy be lesz ezelőtt állítva?
Egyébként minél többet nézem, annál kevésbé világos a megvalósítás miértje.
[ Szerkesztve ]
Sk8erPeter
-
Sk8erPeter
nagyúr
Hát meg kellene különböztetni a kép id-ját és a page-et: a page-dzsel csak megadod, hogy az adatbázisból lekért, korlátozott mennyiségből hanyadik oldalt szeretnéd megjeleníteni.
De elvileg hasonlót csinál a kódod is, tehát csak limitálja a lekért mennyiséget, és megad egy bizonyos offsetet is, ahányadik rekordtól meg akarod mutatni az eredményhalmazt.
Szóval itt még egyáltalán nem jön képbe a képnek a konkrét id-ja...Vegyük azt, hogy pl. van 200 képed. Egy oldalon 20 képet jelenítesz meg, tehát az 1. oldal lekérése így néz ki:
SELECT * FROM photographs LIMIT 0, 20
aztán a 2. oldal megmutatása:
SELECT * FROM photographs LIMIT 20, 20
a 3. oldalé:
SELECT * FROM photographs LIMIT 40, 20
a 4. oldalé:
SELECT * FROM photographs LIMIT 60, 20
és így tovább...(Utóbbi egyébként ekvivalens ezzel:
SELECT * FROM photographs LIMIT 20 OFFSET 60
)A képekhez tartozó linkekbe meg belegenerálhatod a photo_id-t...
Remélem szép lassan közelebb kerülünk a megoldáshoz. Kérdezz, ha valami még nem érthető.[ Szerkesztve ]
Sk8erPeter
-
Sk8erPeter
nagyúr
"Na most, ha valaki nézi ezt a nagy képet akkor szeretném ha tudná linkelni is, nem direkt linkként - fehér háttéren a kép-, hanem a konkrét oldalt amin van, mindenestől."
Hát ez azért necces, mert ha bekerülnek újabb képek az adatbázisba, vagy törölsz párat a régiek közül, akkor teljesen megváltozik a sorrend, tehát mondjuk ami addig az 1. oldalon volt, pl. 20 újabb kép után a 2. oldalra tolódik.
Az még esetleg kerülő megoldás lehet, hogy $_GET paraméterként megadod a photo_id-t és még egy egyéb paramétert is, ami jelzi, hogy galériaszerűen akarod megjeleníteni, tehát legyen előtte és utána is kép, vagy csak utána, stb... ekkor adatbázisból ennek megfelelően kérdezed le az eredményeket, hogy mindenképp köztük legyen a megadott photo_id-val jelölt kép is.
Az előző-következő nyilak kezelése meg nem olyan nehéz, de ahogy elnéztem, ez nálad kezelve is van valahogy a $pagination->has_previous_page() és $pagination->has_next_page() metódusokkal.
De egyébként ha az adott képet nagyban meg lehet nézni, tehát az van a "középpontban" akkor most hirtelen nem világos számomra, miért nem jó az, hogy a photo_id szerint direkt linkeled be, és akkor attól még felajánlhatod az előző-következő képeket, és lekezeled azt az esetet is, ha azóta a képet törölték: ha ez a helyzet, akkor pl. megjeleníted a teljes galériát (esetleg jelezheted azt is, hogy azóta az adott képet törölték), vagy hasonló.[ Szerkesztve ]
Sk8erPeter
-
wis
tag
Megnéztem a kepfeltoltes.hu-t, de nem tudom mire gondolsz.
Gondolom a képek linkelése valahogy így néz ki:
http://valami.hu/kep.php?id=65&galeria=4Na most annyi, hogy hozzáadsz egy újabb feltételt:
http://valami.hu/kep.php?id=65&galeria=4&datum=20120712Ezt belerakod egy nem írható szövegmezőbe, vagy akárhova ahonnan az user egyszerűen kimásolhatja.