- LTE frekvenciák
- Samsung Galaxy A54 - türelemjáték
- Samsung Galaxy A52s 5G - jó S-tehetség
- Android alkalmazások - szoftver kibeszélő topik
- iPhone topik
- Samsung Galaxy S21 Ultra - vákuumcsomagolás
- Hivatalos a OnePlus 13 startdátuma
- Samsung Galaxy S25 Ultra - titán keret, acélos teljesítmény
- Redmi Note 12 Pro - nem tolták túl
- VoLTE/VoWiFi
Új hozzászólás Aktív témák
-
Sk8erPeter
nagyúr
Nem azt mondtam, hogy a PDO "szép", ahogy te értelmezted. Hadd idézzem magam még egyszer: "Ezerszer szebb, mint a régi mysql_query()-s bohóckodások..."
"Pontosan azért, mert igazából nem szebb."
De, szebb. Nem is értem, hogy állíthatod ezt. Hol volt bindolás a sima mysql_query()-s szarakodásnál? Mennyire okádék volt, hogy mindenhol mysql_real_escape_string() hívások voltak, és az objektumorientáltsághoz, kivételek dobálásához köze nem volt? Most hadd ne soroljam fel az érdemi különbségeket a PDO és a sima mysql_* szarokhoz képest, össze sem hasonlítható.
Azért a "pár cuccnál" szerintem kicsit jobban érzékelhető különbség van a mysql_* függvényekhez képest.Gondolom azért mondod mindezt, mert hosszabb távon nem is használtad, így távolról ítéled meg.
De senki nem mondta, hogy összevethető egy ORM-mel... Azt írod, az ORM bonyolultabb... nem mondod, tényleg?!
Szándékosan magyarázod félre, amiket írok? Arról magyaráztam, hogy az ORM-ben szereplő query-k működhetnek a háttérben a PDO-val, és a kettő egy kicsit sem zárja ki egymást, sőt.
"A pdo az egy wrapper a mysql* függvényekhez"
Ha ez ilyen egyszerű lenne, akkor a PDO nem működne más adatbázisokkal is.Egyébként biztos vagy benne, hogy csak a mysql_* függvények köré írtak wrappert? Úgy emlékszem, hogy a php_mysql.dll NEM kell, hogy engedélyezve legyen ahhoz, hogy a PDO-t zavartalanul lehessen használni a php_pdo_mysql.dll engedélyezésével. De cáfolj meg, ha tévedek. Furcsa lenne, ha szimpla "duplikáció" lenne ilyen tekintetben.
-
Peter Kiss
őstag
A PDO annyiból jó, hogy csak egy drivert kell megtanulni több adatbázisszerverhez, így a kód mobilisebb lehet. ORM-nél nem a model számít, hanem az, hogy a change tracking és a kapcsolatok kezelése jól működjön (a model-ben majdnem csak a különböző adatagok lehetnek [POPO class-hoz közelebb kell lennie, mint akármilyen BC-hoz]).
-
Sk8erPeter
nagyúr
"Egyébként olvasgatom az utóbbi hozzászólásokat, ti tényleg ezt a PDO-t használjátok? Olyan ocsmány az egész, szívem szerint bottal sem piszkálnám. "
Miért olyan botrányos? Ezerszer szebb, mint a régi mysql_query()-s bohóckodások...
Lehet használni ORM-et is, de ez is jól használható.
Kíváncsi lennék egyébként, hogy ha egy adott ORM lényegében egy "wrapper" a PDO-hoz, akkor az milyen overheadet jelent a gyakorlatban. (Már maga a plusz függvényhívások sokasága is overhead.)A Drupal is a PDO-t használja egyébként a háttérben, de ott is van hozzá egy elég jól használható "wrapper", ami szebbé és egyértelműbbé teszi a használatát.
Meg gondolom az általad használt megoldások is a "natív" PDO-t használják a háttérben. (Vagy legfeljebb a mysqli-t, de az mennyivel jobb? Semmivel, sőt.) -
Soak
veterán
ver. 0.2
public function find_previous($id=0, $users_id) {
$result_array = self::find_by_sql(" SELECT * FROM `photographs` WHERE id < ".$id." AND users_id = ".$users_id." ORDER BY id DESC LIMIT 1 ");
return !empty($result_array) ? array_shift($result_array) : false;
}
public function find_current($id=0) {
$result_array = self::find_by_sql(" SELECT * FROM `photographs` WHERE id = ".$id." LIMIT 1 ");
return !empty($result_array) ? array_shift($result_array) : false;
}
public function find_next($id=0, $users_id) {
$result_array = self::find_by_sql(" SELECT * FROM `photographs` WHERE id > ".$id." AND users_id = ".$users_id." ORDER BY id ASC LIMIT 1 ");
return !empty($result_array) ? array_shift($result_array) : false;
}
if(isset($_GET['user']) AND (isset($_GET['id']) AND isset($_GET['pic'])))
{
global $database;
$_GET['user'] = $database->escape_value($_GET['user']);
$_GET['pic'] = $database->escape_value($_GET['pic']);
$users = User::find_by_id($_GET['id']);
$users_id = $users->id;
$previous_photo = Photograph::find_previous($_GET['pic'], $_GET['id']);
$current_photo = Photograph::find_current($_GET['pic']);
$next_photo = Photograph::find_next($_GET['pic'], $_GET['id']);
$path = Photograph::photosphp_image_path($current_photo->filename);
}
else
{
redirect_to("browse.php");
}
if($previous_photo)
{
echo "<a href=\"photos.php?user=$users->username&id=$users->id&pic=$previous_photo->id\" >previous</a>";
}
if($next_photo)
{
echo "<a href=\"photos.php?user=$users->username&id=$users->id&pic=$next_photo->id\" >next</a>";
}Most kicsit többet gondolkoztam rajta. Biztos nem hibátlan, de szerintem egy fokkal jobb.
-
Soak
veterán
Megint szopattam magamat 1,5órát, aztán neki álltam alapoktól újra írni egy pár funtcion kódot és eszembe jutott, hiszen pont egy hasonló kódot beszéltünk a php topikban ami ezt megoldhatja. Első probára hibátlanul lefutott, igaz, hogy jó pár módosítással, de logikailag szinte ugyanez a probléma. Lassan rászokom, hogy gondolkozom cselekvés elött.
-
Sk8erPeter
nagyúr
Ja hogy így flat tárolás, így már minden világos, elsőre másra gondoltam.
Az utána következő "programozás alapjai órát" nem tudom, nem inkább mobalnak szántad-e...
Én annyira kérdeztem rá fordfairlane-től, hogy magával az elképzeléssel mi a baj, hogy a nézetben kapsz egy egymásba ágyazott listát, nem arra, hogy az mire jó és hogyan kell bejárni.(Mondjuk én is értékelem a lelkesedést.
)
(#10363) fordfairlane :
ja OK, szóval ezek szerint az a probléma vele, hogy nem feltétlenül tudod, milyen komplexitású mondjuk egy egymásba ágyazott lista, és bizonyos feltételek döntik el, mi szerint kellene bejárni, milyen mélységig, stb., és ezek a komplex döntések meg pont, hogy nem a view-ban kellene, hogy megszülessenek. Így már teljesen világos. -
Lényegében unix timestamp -ként tárolom a dátumot. Ez azért jó mert így ugye úgy konvertálom ahogy akarom. A nézetnek egy tömböt adok át, és az egyik ilyen tömb tartalmazza a felhasználó adatait, a regisztrálás dátumával. Kiszedem az adatbázisból a kellő adatokat - tömbként és azon belül kéne még "elő" konvertálni a megfelelő beállítás szerint.
Remélem érthető voltam
-
Soak
veterán
Újra elmondom : Tudom ,hogy szar volt, tudom, hogy sokkal jobban meg lehet csinálni, de a designt kellett csinálni mert szórít a határidő és addig amíg folyik annak a gyártása addig arra jó volt, hogy szórakozzon vele, hogy mikor hogy néz ki a design.
Amit írtál viszont tökéletesen működik, és már 10 eventnél is érezhetően gyorsabb, ezt akartam alapból is csinálni, csak nehezen megy, ha az ember 1hónapja se foglalkozik php-vel és mysql-el . Köszönöm szépen a segítséget, megyek és pihenésképpen felfogom, hogy miért működik ami kódot adtál .
-
cucka
addikt
Kimaradt: amikor hasonló helyzeteket kell megoldani, érdemes arra gondolni, hogy az adatbázis-műveleteknél a legköltségesebb művelet az, amikor az adatok átkerülnek az adatbázis-szerverről a php-be. Ezért minden esetben arra kell törekedni, hogy csak azokat a sorokat/oszlopokat kérjük le az adatbázistól, amelyekre valóban szükségünk van. Nagyságrendekkel gyorsabb, ha az eredmények listáját leszűri az adatbázis szerver, mint ha elkérnénk tőle az összes sort és php-val szűrnénk ki a fölöslegeseket.
-
Soak
veterán
Köszönöm a segítségeteket, de nem tudom ,hogy olvastátok-e amit írtam, hogy tisztában vagyok vele, hogy nem jó, jobban mondva nem hatékony a kód, le is írtam, hogy ugyanígy gondolom ahogy mondjátok csak nem tudom megírni hozzá a kódot. Ebben kértem segítséget az első hsz-ben is.
-
papa019
senior tag
Olyat esetleg nem lehet csinálni, hogy betesz egy ehhez hasonló elemet addig, amíg a művelet fut a szerveren és amikor a szerver végzett, akkor küld vissza egy jelzést, és akkor megy tovább minden?
(elég kezdő vagyok még az ilyen dolgokban, remélem nem mondtam hülyeséget)
(#10298) Sk8erPeter:
-
Sk8erPeter
nagyúr
Nem értem, miért ragaszkodsz ehhez a
function isUrl($val){ return $val != ''; }
függvényhez...Nem kicsit megtévesztő a függvény neve, mert az ember azt gondolná, itt valós ellenőrzés történik arra, hogy URL-ről van-e szó, miközben csak azt ellenőrzöd, empty stringről van-e szó... akkor már inkább legyen isEmptyString a függvény neve, vagy készítsd el rendesen a függvényt.
Most csak azért köcsögösködöm, mert épp tanítasz valakit a helyes kódolásra, akkor mutass neki jó példát, meg tőled nem ilyen béna függvényeket vár az ember. -
RootRulez
félisten
Android program honosításnál találkoztam már ezzel a \n-el.
a "\n" és a "\r\n" helyett érdemesebb a php beépített PHP_EOL konstansát használni, ez a php-t futtató rendszernek megfelelő sorvége jelet tartalmazza.
Ez azt jelentené, hogy a
file_put_contents("linkek.txt", implode("\n", $linkek));
írjam át arra, hogy
file_put_contents("linkek.txt", implode(PHP_EOL, $linkek));
??
-
RootRulez
félisten
No, ez működik (miután kitöröltem a D:\-t), de notepaddal nincsenek új sorban (minden link egy sorban van).
Notepad++-al viszont sorok vannak... Bár a sorok nem hatnak meg, csak addig kell, amíg feltöltöm a txt-t, a későbbiekben nem kavarhat be a PHP fájlnak az, hogy nincsenek sorokban a linkek?
-
RootRulez
félisten
Találtam egy ilyet, hogy
$kihagyando_sor = $link; // itt lesz a kihagyandó sor a korábbi véletlen szám
$megnyitando = fopen("linkek.txt", "w"); // megnyitó, írhatóan a fájlt
if ($megnyitando == NULL || $megnyitando == NULL)
print('Hiba történt a fájlok megnyitása közben.');
else
{ $sor = 0;
while (($karakter = fgetc($megnyitando)) !== false)
{ if ($karakter == "\n")
$sor = $sor + 1;
if ($sor != $kihagyando_sor)
fwrite($megnyitando, $karakter);
}
}
fflush($megnyitando);
fclose($megnyitando);Most épp minden sort kitöröl.
-
fordfairlane
veterán
Bocs, de nem értem. Nem arról van szó, hogy a keretrendszer valamit megcsinál helyettem, mert mi van akkor, ha nem csinálja meg, másrészt a futási idő szintén érthetetlen érvelés. Egyébként is a keretrendszer használhat singletont, én nem?
Van egy erőforrás, amiből egy van. Fájlrendszer, adatbázis kapcsolat, socket egy kiszolgáló felé, whatever. Ezt a valamit be akarod burkolni egy osztállyal. A Singleton egy "creational pattern", ami az egyszeri példányosítási funkciót belezárja az objektumba, tehát az alkalmazásnak nem kell ügyelnie, hogy ne hozzon létre fölöslegesen új példányt, ha futás során több heylen is hozzá akar férni ehhez az objektumhoz. Egy singleton objektum ugyanolyan kutyaközönséges objektumnak néz ki a guest kód számára, mint a példányosított. Miért baj ez?
-
Sk8erPeter
nagyúr
Ja igen, az ékezetes domainnevek jogos, azt tényleg nem szűri ki, ilyenre is lehet találni különböző megoldásféleségeket a kommentek közt php.neten: [link], mondjuk érdemes tudni, hogy ilyeneket is validnak tekinti: [link]. Szóval tényleg egy elég gyenge szűrő, esetleg még vegyíteni lehetne a parse_url() függvénnyel is, meg némi egyedi megoldással, és akkor talán már egy egész korrekt függvényt lehetne összehozni vele az ellenőrzésre. Mondjuk meglep, hogy nincs még erre beépített PHP-s függvény.
"Teljesen véletlenül alakult így, php fejlesztőnek vettek fel, első héten derült ki, hogy a szoftver, amin dolgozni kell, az bizony python-ban van írva, nem php-ban."
Érdekes kis tévedés a munkáltató részéről.
Na, a Pythonról speciel semmi véleményem és tapasztalatom sincs, milyennek találod így 1 év távlatából a PHP-val összehasonlítva (már ha van értelme ilyen jellegű összehasonlítást végezni)?====
"Fejlesztés során rengeteg potenciális hibát lehet kiszűrni, ha teljesen be van kapcsolva a hibák kijelzése - érdemes a szkript elején E_ALL-ra állítani."
Inkább E_ALL | E_STRICT-re PHP 5.4.0 alatt.Ezzel kiszűrhetők a deprecated függvényhasználatok is, stb.
-
Sk8erPeter
nagyúr
Ja igen, a relatív URL-ekben teljesen igazad van, az tényleg külön kezelést igényelne, most ezzel nem foglalkoztam.
De a nemzetközi domainekre miért ne menne?Konkrétan mikre gondolsz?
Azóta milyen nyelven fejlesztgetsz?
===
(#10123) RootRulez : már a kérdésedet sem értem. Miért vinne át másik oldalra? Ez a függvény csak vár egy paramétert, amiről eldönti, hogy valid URL vagy sem. (De mint cucka írta, egyébként relatív URL-eket nem kezel.) Szóval olyan, mintha valakinek feltennél egy eldöntendő kérdést, igennel vagy nemmel válaszol (jobb esetben nem kussol, és nem is beszél mellé
).
-
RootRulez
félisten
Nem vagyok nagy mágusa a nyelvnek, csak össze szoktam ollózgatni a dolgokat...
Azt megtaláltam, hogy $x=mt_rand(0,10);-el tudok majd véletlen számot generálni. Meg azt, hogy ezzel megy majd át másik oldalra: $new_location = 'akarmilyen-oldal-ami-ide-kerul';
header('Location: '.$new_location);txt megnyitása:
$myFile = "szoveg.txt";
$fh = fopen($myFile, 'r')
$theData = fread($fh, filesize($myFile));
fclose($fh);de a tudomány itt megáll... szal ezeket össze is kéne rakni...
-
Speeedfire
félisten
-
Speeedfire
félisten
Nem még nincs semmi script. Egyelőre csak agyalok a lehetőségeken.
Van olyasmire gondoltam, hogy lenne egy feliratkozási lista. id | uid | tid amit megnéz és így küldi el az adatokat. Az ajax csak a feldolgozó scriptet hívná meg, ami elintézne mindent.Na látom mindenki a cron-t írja, akkor az lesz.
-
Sk8erPeter
nagyúr
"Kivéve ha automatizálni szeretnéd a form feldolgozását."
Na de ez még mindig nem mond ellent annak, amit írtam. Automatizáltan is ugyanúgy benne lehet az isset() VAGY !empty() ellenőrzés...A felhasználótól érkező információ megbízhatatlanságáról meg szerintem nem kell különösképpen tárgyalnunk, ez evidens...
Nyilván kliensoldali ellenőrzés sehol nem vált ki semmiféle szerveroldali ellenőrzést, ezt mindketten tudjuk, nem is tartozik szorosan a témához.
Arról beszéltem, hogy az isset ellenőrzés azért sem hülyeség, mert kliensoldalon kiszedhet a formból a júzer elemeket, úgy postolja el, Te meg mondjuk ha nem nyomatsz egy isset() ellenőrzést, akkor lehet, hogy vizsgálod a POST tömb olyan indexét, ami nem is létezik, így kaphatsz egy notice-t.A JavaScript hiányával egyetértek, hogy manapság már nem érdemes foglalkozni, legfeljebb szerveroldali validálás szintjén. Mégsem értek egyet feltétlenül a checkbox hidden mezővel való kiegészítésének szükségességével, ez a lényeg.
-
Sk8erPeter
nagyúr
Há' vágom én.
De a többi elpostolt értékhez tartozó alkalmazáslogikába beletenni egy isset() vagy !empty() (ez úgyis lefedi az isset-et) ellenőrzést nem kerül semmibe. Ez az ellenőrzés úgysem árt, pl. mi van, ha valaki elpostol úgy adatokat, hogy belegányol a kódba kliensoldalon, kiszed elemeket belőle, Te meg a nem létező elemekre futtatsz mondjuk további vizsgálatokat - ezzel legalább az ilyen rosszindulatú szándék elé is teszel plusz egy szűrőt. (Félre ne érts, itt nem azt mondom, hogy ezzel kivédsz bármilyen támadást, vagy hasonló, de legalább plusz egy lépés afelé, hogy teljes körű ellenőrzésed legyen.)
Én is úgy vagyok vele manapság, hogy k@pja be, aki kikapcsolja a böngészőjében manapság a JavaScriptet, de azért még mindig gondolni kell erre az esetre is. -
Sk8erPeter
nagyúr
Minek hidden mező és JS ehhez?
Miért nem elég, ha csekkoljuk isset()-tel, hogy megvan-e egyáltalán a checkbox típusú input (name szerint)?
===
(#7789) meone:
"amit belinkeltél abban vannak kommentek nálam meg nincsenek. Ennyi a külöNbség."
... meg amit már mondtam párszor...A zárójeleket és a pontosvesszős lezárást még mindig lehagytad...
-
DeltaPower
addikt
Ezt az order-t én se értettem. Azt sem, hogy ha mindenképp year és month kell, akkor miért nem
select ..., year(1.date) as 1year ... order by 1year, ...
formában, szerintem gyorsabb mintha ordernél futtatná a dátumfüggvényeket.
Másik: SELECT *-ot csak az egyszerűség kedvéért van így, vagy tényleg minden mezőt lekérdez? -
letix
senior tag
Az a furcsaság a történetben, hogy a weboldal 2008 július óta üzemel, azóta ez _soha_ sem fordult elő (napi átlag 80-180 megjelenítés mellett), most pedig, hogy a számláló megütötte a 12xxxx. megjelenítést, most meg kétszer is előjött.
Mivel úgy látom, hogy a "lock"-olást egy magamfajta laikusnak könnyebb megoldani, így utána járok.
Köszönöm a javaslatot, észrevételt!
-
Brown ügynök
senior tag
Ezt most miért nekem írtad? Én ezt egy framework-ből néztem.
@Sk8terPeter: akkor gyorsabb lesz, és kevesebb sávszélt kajál.
Ja, 210 B helyett csak 110 B foglal majd el.
Mellesleg, nem vagyok benne biztos, hogy gyorsabb lesz ha a kliensoldalon végeztetjük a munkát.
"Szerintem tökéletes ahogy csináltam."
Pontosítok: A célnak tökéletesen megfelel a megoldás. -
Speeedfire
félisten
A legnagyobb bajom, hogy az árlistában több dolog van és meg kellene valahogy találni a megfelelő részeket.
Van pl x mezőnyi szöveg, ahol logo, nyitvatartás stb van. Fel kell rá készülni, hogy esetleg később megnő vagy kisebb lesz ez a mező méret.
Aztán utána jönnek a termékek jól elszeparálva. fejléc 1 mezőben a termék kat. majd nettó és bruttó ár. Aztán jöhet még esetleg akció is a termék kategóriák közé.
Majd termék név, nettó ár, bruttó ár.hibatűrő megoldás kitalálása olyan mezőkre, ahol több, előre definiált opció közül lehet választani
Ez alatt mit értesz?Esetleg ha priviben elküldöm a bolt árlistáját tudnál adni 1-2 irányított tippet?
-
fi:zi'k
nagyúr
Azért mondtam a 0-át mert tényleg elhanyagolható.
Sajnos nem lettem ezzel előrébb.Az alap problémám a következő. Webshopot akarok itt. Feltelepítettem, tettem fel új templatet. Ez a látható módon létrehozott két menüpontot "Home" és "Products" néven. De a "Products" is ugyanúgy a főoldalra mutat és ezt az adminfelületen nem tudom változtatni.
Ezután kezdtem el keresgetni, hogy hol lehet ezt kód szinten. Az oldal forrásból jutottam oda, hogy itt lehet a kutya elásva:
<div class="nav-container">
<ul id="nav">
<li><a href="http://hangbarlang.hu/">Home</a></li>
<li><a href="http://hangbarlang.hu/">Products</a>
</li>
</ul>
</div>
Ezután kerestem a "nav" és "nav-container" kifejezésekre, így eljutva az előbb bemásolt kódrészletig.
Nem tudom, hogy jó helyen járok-e vagy volt-e értelme.
Pusztán annyit szeretnék, hogy a "Products" ne a főoldalra mutasson, hanem az általam megadott helyre. De ennek nem találom a "forrását". -
PazsitZ
addikt
Igenis van értelme, ha fontos jelentősen elszeparálnod a html-php részt.
Természetesen egyáltalán nem szükséges ilyen megoldáshoz egy komplett smarty keretrendszer, ha úgysem használod ki eléggé.
tehát az alap iránynak van értelme, bár szvsz. inkább többszereplős projektekben, lehet vele jól elválasztani a php app logikát és a megjelenítés logikáját.(#7301) mobal: Régebben smarty-t használtam, manapság már nem, a többivel kapcsolatosan pedig nincs tapasztalatom.
-
-
Siriusb
veterán
Abban az esetben van értelme, ha a függvényt egy másik függvénynek szeretnéd átadni paraméterként.
Ez bennem is felmerült további gondolkodás után....teljesen mindegy, hogy az output, amit a stdout-ra raksz, az html vagy sem.
Ez van, ha az ember nem szakad ki a szűk kis világából. Ezt hívják beszűkülésnekKösz!
-
Siriusb
veterán
Tehát ez azt jelenti, hogy a függvény 10 példányban létrejön a memóriában, és mindegyik onnan folytatódik tovább, ahol az önmagára hivatkozás folytán visszaugrott az elejére, miután túljutott azon a ponton, hogy ismételten meghívja magát.
Úgy látom, érdemesebb elkerülni ennek a metódusnak az alkalmazását, rosszul megírt kód szépen teleszemeteli a memóriát.Kösz a segítséget.
-
Peter Kiss
őstag
Ez a terv.
Már csak írni kell egy tesztet AJAX-hívásra, mert egyébként a részek felhasználása már megy a View-ban. Amúgy csak annyi zavart meg, hogy nem tudtam hirtelen eldönteni, hogy a View maga dönthet-e arról, mit renderel, de arra jutottam, hogy nem.
Így néz ki egy View fájl nálam most:
<?php self::MasterPage('defaultmaster.html'); ?>
<?php self::Content('title'); ?>
az oldal címe!!!
<?php self::ContentEnd() ?>
<?php self::Content('head'); ?>
ide lehet pakolni css-t vagy mást
<?php self::ContentEnd() ?>
<?php self::Content('content1'); ?>
homeindex
mindenféle tartalom
egy view darab:
<?php self::Control('teszt_user_control.html'); ?>
<?php self::ContentEnd() ?>A 'teszt_user_control.html' a közös darabka, vidáman behúzza, HTML-ben ilyen lesz a kimenete:
<div class="control" id="control_teszt_user_control_0">tesztusercontrol</div>
Ha még egyszer beraknám a közös darabot, akkor a div id attribútuma végén található számláló nőne (mondjuk másik darabnál is, de ott a név is más, ugye). A 'tesztusercontrol' szöveg van most csak benne a 'teszt_user_control.html'-ben.
-
sioaltar
csendes tag
Na akkor ezt a könyvet mindenképp megnézem. Aztán ahogy beleásom magam remélem megmarad a lelkesedésem, sőt !
Találtam kedvenc torrent oldalunkon egy PHP fekete könyv cimű torrentet, azt hiszem megvan az esti program.
Köszönöm az instrukciókat, valószínű, hogy még jövök!
Üdv!
-
sioaltar
csendes tag
Ez a könyves dolog jutott eszembe nekem is először. Néztem is már a napokban könyveket, ott is sokat írták a PHP fekete könyv c. könyvet , de voltak akik "szidták" mert elavult , php4. Felvetül a kérdés bennem, hogy php4 vs php5 ? Mi merre meddig? Nem tudom mi különbség lehet, mint mondtam kezdő vagyok. Érdemes erre alapoznom , hogy egy könyv php4 alapú vagy újabb php5?
Egyébként , én láttam már képzést amit úgy hirdetnek, hogy webprogramozó, ott gondolom elejétől végéig átrágnak mindent.
Én ezt az "otthon egyedül foglalkozom vele" dolgot támogatom,mivel ha speciel engem érdekel valami és eljutok odáig, hogy otthon szabadidőben is foglalkozzam vele az százszor jobban megragad a fejemben mintha be kéne ülni valami tanterembe. : )
Visszatérve a könyvekre, nekem itthon van pdf formátumban ilyen 24 óra alatt tanuljunk meg "php-ül" könyv, gondoltam azzal kezdem, de ha tré akkor hanyagolom.
-
Lacces
őstag
Ha az "alapoktól" dolgot úgy érted, hogy mindent magadtól írni meg, akkor soha.
Akkor úgy érted, hogy mindig használjak fel CMS-t és azt bővítsem?Mit jelent az, hogy átmenni?
Úgy értem, hogy ha egy PHP-s oldalt megcsinálok, akkor azt annak alapján könnyedén megtudom-e csinálni annak az ASP.NET MVC-s klónját? -
Peter Kiss
őstag
Szerintem ezt nehéz überelni:
<?php require(dirname(dirname(__FILE__)) . DS . 'Shared' . DS . 'defaultmaster.html'); ?>
<?php self::startblock('head') ?>
<script src="/js/libs/modernizr-2.0.6.js"></script>
<?php self::endblock() ?>
<?php self::startblock('teszt') ?>
Tudja, az a fura, hogy valamire emlékszik az ember, valamire nem.
<?php self::endblock() ?>
Mondjuk még megbukhat.---
'csába, az URL-eket elírtam, úgy lenne, ahogyan írtad is a javaslatodban.
---
Ezt az Area-átszervezést ki fogom próbálni, köszi!
---
Az autoloader ennyit csinál nálam is, ami elég is lenne, csak a belekevert area dolog miatt még nem az igazi, de rajta vagyok.
---
A folyamat nálam is majdnem ilyen.
Azért örülök, hogy nem vagyok annyira elveszve, talán, remélem.
-
Peter Kiss
őstag
Utána néztem az 'inherit' módú View-gyártásnak, ez sokkal jobban tetszik, mert könnyebben és szebben valósítható meg (plusz hasonlít az egész az ASP.NET MVC 2-höz). Azt hiszem, ez jelenti a jobb megoldást, találtam is egy kis mutatványt, ami megvalósítja ezt mindenféle trükkölés nélkül tisztán PHP-ban (nem kell semmilyen template language-t használni), átírtam OO-ra is már, ki is próbáltam, működik. Az 'Output Control Function'-ök jelentik az alját, ezeket még nem használtam, van-e valami hasznos megjegyzés hozzájuk?
Area == logikai egység, példák:
/felhasznalok/felhasznalo/bombadil_toma/edit
/felhasznalok/csoport /tlotr /editItt a 'felhasznalok' képvisel egy area-t. Ehhez hasonlóan lehet admin area-t hegeszteni (elképzeléseim szerint), pl. a CakePHP (ha jól emlékszem) NEM használ ilyet, hanem metódus prefixumokkal operál, ami kicsit nevetségesen fest számomra, de az ötlet persze nem rossz.
M "mappa" nem lenne lényeges az area-ba, hiszen a Model az egész rendszerben megtalálható, de esetleg lehet valamilyen örökléses csavart betenni, ha arra van szükség.Autoload-ra tudsz mutatni valami hardcore-abb példát? Mert van egy rakás faék egyszerű tutorial a neten, de mikor valami komolyabb kellene, akkor megáll a tudomány. Jó, mondjuk nagy csavar nem lehet benne, nálam is csak az a gond, hogy az elemek nem tudják magukról, hogy area-ban vannak (ha).
Saját frameworkot szeretnék, semmi durvát, csak legyen jól használható.
Nálam a Controller azért kapja meg az action nevét a konstruktorban, mert már ekkor létrejön egy View objektum, aminek tudnia kell, mit renderel. Ez azért szükséges megint, hogy minél több mindent tudjon megvalósítani magától a rendszer (action végén csak return $this->_view van). Ez a viselkedés egyébként "felülírható", a Controller-nek van egy View-gyártó metódusa.
-
Peter Kiss
őstag
Kicsit pontosítok a problémámon:
Van egy action-öm, legyen a neve 'edit';
Megvan a hozzá tartozó View, amiben egy HTML form van, de semmi többHogyan oldjam meg, hogy a top level HTML elemeket tartalmazó View darabok, és esetleg pl. a menüt tartalmazó részeket berántsa magának?
Készítsek egy olyan alapállományt, ami mondjuk elkülönít 9 részt a komplett oldalon (minden View alapja ez lenne), és mindegyikbe tegyek adatott, ami:
kifejezetten az adott action-nek megfelelő (ez lenne az edit form),
vagy include-dal húzzam be a közös elemeket (top level HTML elemek, menü)
vagy esetleg üresen marad---
Még egy gond
Az MVC mappastruktúrám ilyen:
/Application
/Areas
/csillamponi
/Controllers
/Models
/Views
/Controllers
/Models
/ViewsArra kellene valami jó megoldás, hogy miként töltse be az adott részeket a cucc. Ugyan van automata osztálybehúzóm, de az elég bénán működik, akkor lenne csak normálisan működőképes, ha nem lenne az 'Areas' rész. Mivel van, valahogyan ki kellene erőszakolnom, hogy ha egy Area-ba lép valaki, akkor lehetőleg az Area-hoz tartozó dolgokat keresse előbb. Ezzel, ami személyes problémám, hogy nem tudom, minek mit szokás átadni, nálam pl. most az aktuális Controller megkapja a konstruktorában a végrehajtandó action-t (de nem a konstruktor hívja meg!). A paraméterátadást azért szeretném minimálisra csökkenteni, hogy a konkrét elemek létrehozásakor ne kelljen sokat szöszölni ezekkel (pl. megfelelő parent::__construct hívás).
Köszi!
-
pawee
tag
?> -t kellett kiszedni a végéről. most szépen be is kapcsol, csak nem csinálja a dolgát
ami annyi lenne, hogy a szövegmezőbe beírunk valamit, amit elment az adatbázisba, majd ezt kiírja nekünk a képernyőre, de már amikor a submitre kattintok akkor azt írja, hogy a beállítás sikertelen meg kellene próbálni később, lehet, hogy valami adatbázis írás/olvasási baja lehet? sajnos nem tudom, má átnéztem párszor a kódot, de nem tudok rájönni, vmi tipp esetleg? -
LW
őstag
Kreáltam egy biztonsági rést, itt hozzáférsz förmedvényemhez.
ftp://radigine.dyndns.org
uname: radigine
passwd: radigineNincs vele különösebb célom, csak szeretnék egy (kis) rendszert, ahol nem kell bajlódni az alapvető dolgokkal. Hogy mit tud? Amit kellene, még azt sem. Ez még nagyon alfa verziója a történetnek. Jelenleg annak örülök, ha egy üres fehér lap fogad.
-
Forza_JUVE
aktív tag
most a die hoz írtam be és ott működik az url
ha egy az egybe átmásolom az else -be, akkor meg ez a rohadt "Could not open socket" jelenik meg ... pedig tuti h jól írom be a kódot. Mit nem tud megnyitni, mi az a socket ???
a recaptchalib.php fájlban megtaláltam a szöveget ... de nem tudom értelmezni:
function _recaptcha_http_post($host, $path, $data, $port = 80) {
$req = _recaptcha_qsencode ($data);
$http_request = "POST $path HTTP/1.0\r\n";
$http_request .= "Host: $host\r\n";
$http_request .= "Content-Type: application/x-www-form-urlencoded;\r\n";
$http_request .= "Content-Length: " . strlen($req) . "\r\n";
$http_request .= "User-Agent: reCAPTCHA/PHP\r\n";
$http_request .= "\r\n";
$http_request .= $req;$response = '';
if( false == ( $fs = @fsockopen($host, $port, $errno, $errstr, 10) ) ) {
die ('Could not open socket');
}fwrite($fs, $http_request);
while ( !feof($fs) )
$response .= fgets($fs, 1160); // One TCP-IP packet
fclose($fs);
$response = explode("\r\n\r\n", $response, 2);return $response;
} -
Forza_JUVE
aktív tag
valamiért mégsem jó, jelenleg ezt írtam be:
if (!$resp->is_valid) {
// What happens when the CAPTCHA was entered incorrectly
die ("The reCAPTCHA wasn't entered correctly. Go back and try it again." .
"(reCAPTCHA said: " . $resp->error . ")");
} else {
// Your code here to handle a successful verification
header("Location: www.google.com");
}
?>Ránézésre mi lehet a baja? Most is a "Could not open socket" üzit kapom!
-
Sk8erPeter
nagyúr
És én ennek hol mondtam ellent?
Ezt írtam, idézem még egyszer: "Ezenkívül igen, alapvetően egyszeres öröklődés van, tehát egy osztálynak egy őse lehet, DE bármennyi interfészt megvalósíthat"Az továbbra is alapvető különbség marad, hogy míg az absztrakt osztályban definiálhatsz függvényeket, addig az interfészekben nem, ott csak kötelezően előírod, hogy a leszármazottak mit valósítsanak meg...
És igen, tulajdonképpen ahogy írod is, a csupa absztrakt függvényt tartalmazó osztály egyenértékű lehet az interfésszel, de nyilván C#-ban és Java-ban sem véletlenül létezik a két különböző stuktúra.
Tulajdonképpen most nem is vitatkozunk, csupán kiegészítgetjük egymást. -
Sk8erPeter
nagyúr
Uhh, bocs, a "néhány" szó nekem elkerülte a figyelmem, vagy hirtelen másképp értelmeztem, de akkor így rendben van.
De legalább így jól ki van fejtve, hátha másnak is hasznos lesz."Az abstract class és az interface között az alapető különbség nem az, hogy az egyikben lehetnek definiált függvények, a másikban pedig nem, hanem hogy az interface az egyetlen eszköz php-ban, amin működik a többszörös öröklődés."
Most ebbe is hadd kössek bele.
Az is alapvető különbség, amit én írtam, mivel az interfész tulajdonképpen csak egy "mintát" ír elő, amit meg kell valósítani. Az absztrakt osztály sokszor ennél konkrétabb szerkezetet határoz meg. Ezenkívül igen, alapvetően egyszeres öröklődés van, tehát egy osztálynak egy őse lehet, DE bármennyi interfészt megvalósíthat (vesszővel elválasztva az egyes interfészek neveit az implements kulcsszó után). -
Sk8erPeter
nagyúr
"Az absztrakt osztály lényege, hogy ez egy osztály, aminek néhány függvénye csak deklarálva van, de nincsenek definiálva (abstract függvények). Ez azt jelenti, hogy az osztály megmondja, hogy milyen pontosan függvényekre van szükség a működéséhez, de ezeket a függvényeket a leszármazottak kötelesek implementálni."
Ezt azért javítanám, mert ez így nem teljesen igaz.
Amit Te írsz, vagyis az, hogy egy osztály nem tartalmaz definíciókat, hanem csupán tartalmazza azon metódusok deklarációját, amelyeknek definícióját majd az azt megvalósító osztályoknak tartalmaznia kell, az inkább az interface-re vonatkozik: [link].
Az absztrakt osztály igenis tartalmazhat metódusdefiníciókat, mivel egy absztrakt osztálynak nem feltétlenül absztrakt az összes metódusa - lásd ezt a példát php.net-ről. Lehetnek tehát olyan osztályok, amelyek megvalósítják az absztrakt osztályt, és az ősosztályban eleve definiált függvényt fel is tudják használni, anélkül, hogy ez explicite felül lett volna bírálva - DE akár az absztrakt osztályban eredetileg is definiált metódust felül is írhatja a leszármazott osztály egy azonos nevű és visszatérési értékű metódussal.Írtam pár rövid példát a szemléltetésre:
abstract class AbstractClassExample{
public abstract function cannotBeDefinedInAbstract(){
echo 'This is an abstract function in abstract class - gives an ERROR, it won\'t be echoed!';
}
}Ez nyilvánvalóan rossz, mert abstract függvénynek nem lehet függvénytörzse, hibát is kapunk rá:
"Fatal error: Abstract function AbstractClassExample::cannotBeDefinedInAbstract() cannot contain body in D:\Honlap\www\proba\index_2.php on line 6"
Ha az adott sort lecseréljük így:
public abstract function cannotBeDefinedInAbstract();
akkor már nem kapunk hibát.A többi esettel kiegészítve itt egy hosszabb példa:
<?php
abstract class AbstractClassExample{
public abstract function cannotBeDefinedInAbstract();
public function itsAlreadyImplementedInAbstractButCanBeOverridden(){
echo 'This is derived from the abstract class!';
}
}
class ExtendsAbstract extends AbstractClassExample{
public function cannotBeDefinedInAbstract() {
echo 'This is the implemented function in derived class!';
}
public function anotherFunction(){
echo 'This is just anonther example function.';
}
}
$extendedClass = new ExtendsAbstract();
$extendedClass->cannotBeDefinedInAbstract();
echo '<br />';
$extendedClass->itsAlreadyImplementedInAbstractButCanBeOverridden();
echo '<br />';
$extendedClass->anotherFunction();
echo '<br />';
?>Ennek kimenete a következő:
This is the implemented function in derived class!
This is derived from the abstract class!
This is just anonther example function.Az itsAlreadyImplementedInAbstractButCanBeOverridden() függvény tehát egy absztrakt osztályban lett megvalósítva, a leszármazott osztály mégis eléri, és megfelelően meg is valósítja az ott szereplő kiírást.
Ez azonban felülbírálható:
class ExtendsAbstract extends AbstractClassExample{
public function cannotBeDefinedInAbstract() {
echo 'This is the implemented function in derived class!';
}
public function itsAlreadyImplementedInAbstractButCanBeOverridden() {
parent::itsAlreadyImplementedInAbstractButCanBeOverridden();
echo '<br />This comes from the derived class.';
}
public function anotherFunction(){
echo 'This is just anonther example function.';
}
}Ebben az esetben az ExtendsAbstract függvényben is megvalósítjuk az említett itsAlreadyImplementedInAbstractButCanBeOverridden() függvényt, így az felül lesz bírálva, a parent::itsAlreadyImplementedInAbstractButCanBeOverridden(); sorral viszont továbbra is érvényesül a szülőben implementált függvény összes feladata, így a kimenet a következőre módosul:
This is the implemented function in derived class!
This is derived from the abstract class!
This comes from the derived class.
This is just anonther example function. -
LW
őstag
A fenti sessionkezelés így nézne ki? [Pastebin]
-
LW
őstag
Köszönöm. Kerestem pár példakódot úgy vélem értem a singleton osztályokat. Estére rendbe rakok mindent.
Ha az osztály példányosítása után szükségem van a singleton osztályra egy másik programblokkban, akkor az első példány referenciáját használom?
Egyáltalán nem sértő. Tisztában vagyok vele, ezért is kérdezek tőled/tőletek.
Nem tanítottak nekem php programozást, de más (egyébként objektum orientált) nyelvet is csak futólag. Ha minden igaz, öt nap múlva megkezdődnek egyetemista éveim. -
PazsitZ
addikt
A mezők száma nem befolyásolja tudtommal.
De viszont ilyen szintű szerkezetnél felvetődik az adatszerkezet és a velejáró lekérdezések típusa.
Mivel egy táblát teleaggatni tucatnyi indexekkel messze nem takarékos avagy jó megoldás. Amennyiben viszont tényleg egyszerre lekérdezendő szűrést nem igénylő adatokról van szó, nem releváns, hogy 2 darab mezőt vagy 22 kérdezel le.(#6885) Sk8erPeter: Nem tapasztalat, csak hallomás alapján és egy épp pár napja általam nézet grafikon alapján a drupal vezet globális használatban.
Viszont a drupal konfigurálása és applikálása jelentősen komplikáltabb lehet.
Viszont ezzel szemben sokkal többre képes, mint a joomla. -
Alukard
senior tag
Szóval, ha jól értem akkor az 51 oszlopost tábla 10e sornál sem lesz probléma ha megfelelően indexelem a táblát... És ha jól emlékszem a főiskolás tanulmányaimra célszerű azokat az oszlopokat indexelni amelyek szűrés végett legtöbbször kerülnek használatra...
Szerkezet szempontjából egy ingatlan adatbázisról lenne szó ami 11 ingatlan kategóriának tartalmazná a paramétereit, típustól függően kerülnének az egyes oszlopok feltöltésre (értelemszerűen helyenként kicsit foghíjjas lenne a tábla). Az elsődleges kulcs 1 auto increment szám lenne, utána min 13 fixen kitöltött oszloppal és a feltöltési érték lehet int, varchar, text... természetesen ahol lehet(int/tinyint/..., varchar) ott maximális mező méret is meg lesz adva.
-
LW
őstag
A végén félreértettél. Ha POSTnak van 100 eleme, és a programnak csak 3 kell belőle, akkor nem kell bejárni és átalakítani az összes elemet, hanem csak használat előtt azt a 3at külön tárolás nélkül. Ha nem tárolom le és újra használom, akkor újra át kell alakítania (az eredetiből).
Igazából a két megoldás különbségéről van szó:
1. pl. Array_map()-al bejárom és GET POST COOKIE elemeit stripslashelem, amennyiben magic_quotes on. Jelentős hátrány: Ha egy rosszindulatú látogató küld egy tartalmas kérést, akkor akarva-akaratlanul stripslashel ész nélkül.
2. Használat előtt stripslashelem a kívánt kulcs alatti elemet. -
LW
őstag
Azért írtam így, mert nem kell annyiszor get_magic_quotes_gpc(); meghívni, ahányszor példányosítom, hanem egyszer beállítom és mindegyikre objektumra érvényes. Végső soron ezért vannak a statikus adattagok, vagy nem?
Am így valóban jobb és szakszerűbb, bár sztem így több memóriát eszik, viszont a GET és POST nem minden elemén stripslashelek, hanem csak amelyik kell. Az megint egy kérdés, hogy egy elemet többször fölöslegesen is, amennyiben nem tárolom el egy változóban.
-
LW
őstag
Ilyesmire gondolt, Mester?
class Superglobal{
private $content = array();
static public $magic_quotes = false;
function __construct($sga){
$this->content = $sga;
}
function Get($key, $secure = false, $default = false, $remove_html = false, $remove_js =false){
if(isset($this->content[$key])){
$value=$this->content[$key];
if(self::$magic_quotes)$value= stripslashes($value);
if($secure)$value = STRINGS::Secure($value, $remove_html, $remove_js);
return $value;
} else {
return $default;
}
}
} -
-
fordfairlane
veterán
A koncepció abban a tekintetben nem rossz, hogy elmozdulást jelent az egységbezárás irányába, bár nagyon kezdetleges formában. Én erre egy osztályt írnék, a connect/disconnectet pedig metódussal valósítanám meg, nem paraméterrel. De úgy is jó, ahogy te írod, főleg, ha a $connection-t használni akarja menet közben is a lekérdezéseknél.
Mindenesetre a notice problémát leggyorsabban static változódefinícióval lehet megoldani. Esetleg kikapcsolni a notice-ok kijelzését.
-
fordfairlane
veterán
A függvény ha jól látom, azt csinálja, hogy kapcsolódik egy adatbázishoz, tehát a hozzászólásoddal ellentétben nem az a feladata, hogy kezelje egy korábbi $connection változót, hanem hogy létrehozzon egyet.
A függvény kezeli a kapcsolódást és a kapcsolódás zárását is, a probléma, hogy a kapcsolódás resource-t átmeneti változóban tárolja. Ezt vagy globálisan kell tárolni, vagy függvény local scope-ban, static változóként.
-
PazsitZ
addikt
Önmagában az is kevés.
Vagy globális változóként kellene használni a $connection-t vagy máshogy kezelni a dolgot.
Mivel egyik hívásnál ("conn") létrejön a kapcsolat, de a $connection változó a fgv lefuttatása után megszűnik.
Az újabb hívásnál ("kill") újra belépünk a fgv-be, de a $connection nem hogy nem egy resource, hanem definiálatlan változó. -
Sk8erPeter
nagyúr
Ja persze, az nem is baj, hogy opcionális, azt speciel nem hibaként írtam (vagy nem úgy akartam).
Majd lehet, hogy megpróbálom jelezni a szerzők felé, hogy esetleg azt javíthatnák, hogy legyen egy getter metódusa a hibáknak, bár nem tudom, mennyire fogják figyelembe venni a véleményezést. -
Sk8erPeter
nagyúr
"Errorinfo protected (v. private) kéne legyen és kéne mellé írni egy getErrorInfo()-t."
És én szerinted mit mondtam?Ugyanezt.
"Vagy maradhat public, de akkor a __set-ben le kell kezelni azt az esetet, amikor kívülről piszkálják. (Egyébként simán elképzelhető, hogy le van kezelve, csak elkerülte a figyelmedet, nincs előttem a phpmailer forrása)"
Szerinted miért mondtam azt, amit mondtam? Mert néztem a forráskódot, és TUDOM, hogy nincs lekezelve...Azért nem kell eleve hülyének nézni az embert. Egyébként meg a "miért férek hozzá" költői kérdés volt...nyilván tudom, hogy ennek nem így kell lennie, pont erről magyaráztam, hogy szar a koncepció.
Az ErrorInfo-ra vonatkozó rész:
public $ErrorInfo = '';
Ennyi, ezt lehet beállítani a SetError() metódusban.
__set() mágikus függvényhasználat NINCS sehol (ezt sem kútfőből szedtem, hanem a forráskódot tanulmányozva jelentem ki...)
Van egy sima set() függvény, ami alatt van egy ilyen sor:
@todo Should this not be using __set() magic function?A karakterkódolási stringekről meg annyit, hogy ha már felsorolták szinte az összes MIME-típust is a _mime_types fv.-ben, akkor ez is belefért volna.
Persze ez nem számít igazán hibának."Igen, de az én kivételeim nem jelennek meg a képernyőn, hanem kapok róluk szépen formázott emailt (és ugyanez igaz a hibákra is)
"
Nálam is ugyanez a helyzet... Ez attól még nem mond ellent annak, hogy elegánsabb, ha kivételt dobál az osztály, és azt a megfelelő helyen elkapjuk, mintha kiszednénk a publikus ErrorInfo stringből a hibát, ha a Send false-szal tér vissza...
Új hozzászólás Aktív témák
Hirdetés
- Azonnali játékos kérdések órája
- Erőgép kompakt tábla formájában a Redmitől
- LTE frekvenciák
- Renault, Dacia topik
- Allegro vélemények - tapasztalatok
- Milyen légtisztítót vegyek?
- Milyen egeret válasszak?
- OLED, Mini-LED, IPS, VA, TN - melyik panelt válaszd 2025-ben?
- TCL LCD és LED TV-k
- Milyen videókártyát?
- További aktív témák...
- Üzletből, garanciával, Macbook Pro Retina 14" 2021, M1 32GB RAM/1TB SSD Space gray
- HP EliteBook x360 830 G8 Core i5 1145G7 2.6GHz/16GB RAM/512GB
- UF Lenovo Yoga 9i x360 Érintős Hajtogatós Laptop Tab 14" -60% i7-1360P 16/1TB Iris Xe 2,8K OLED 90Hz
- Lenovo Yoga 9i x360 Érintős Hajtogatós Laptop Tab 14" -60% i7-1260P 16/512 Iris Xe 2,8K OLED 90Hz
- Új DELL Inspiron 16 Fémházas Multimédiás Laptop 16" -40% Ryzen 7 8840U 8mag 16/1TB FHD+ IPS
- Csere-Beszámítás! Asztali számítógép PC Játékra. I5 12400F / RTX 3070 / 32GB DDR4 / 1TB SSD
- REFURBISHED - HP USB-C Universal Dock G1 docking station (DisplayLink)
- 100.000 ft -tól Országosan a legjobb BANKMENTES részletfizetési konstrukció! ASUS ROG Strix G18
- Új és régi konzolok Okosítása/Softmodoloása, és Szoftveres szintű javítása - RÉSZLETEK A LEÍRÁSBAN
- Csere-Beszámítás! Asus Számítógép PC Játékra! R5 1600X / GTX 1080 8GB / 32GB DDR4 / 256SSD + 2TB HDD
Állásajánlatok
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest
Cég: CAMERA-PRO Hungary Kft
Város: Budapest