Hirdetés

2024. május 4., szombat

Gyorskeresés

Útvonal

Fórumok  »  Szoftverfejlesztés  »  PHP programozás (kiemelt téma)

Hozzászólások

(#10451) fordfairlane válasza Soak (#10449) üzenetére


fordfairlane
veterán

Én erre egy egyszerű flasht használtam, ami a paraméterben kapott képfájlt megjelenítette. Sokan vízjeleket használnak, így bárhogy mentik le a képet (a screenshot mindig működik, bárhogy is trükközöl), látszik a forráshely.

x gon' give it to ya

(#10452) Soak válasza cucka (#10450) üzenetére


Soak
veterán

Többször leírtam, hogy ezzel maximálisan egyetértek, de amíg egy a userek 85%a annyit tud a webről, hogy hova kell beírni a címet, addig plusz 20perc munkát megér, ha csak a felét eltántorítja.

(#10453) fordfairlane válasza Soak (#10452) üzenetére


fordfairlane
veterán

Így van. Nem megakadályozni kell a kép lementését, csak megnehezíteni annyira, hogy az átlag felhasználó kedvét elvegye.

x gon' give it to ya

(#10454) trisztan94 válasza Sk8erPeter (#10446) üzenetére


trisztan94
őstag

if ($handle = opendir($dir)) {

while (false !== ($file = readdir($handle))) {

if ($file != "." && $entry != "..") {

$filecontent = file_get_contents($dir . $file);

$length = strlen($filecontent);
$dataArray[$i++] = array(substr($filecontent, 0, $num), substr($filecontent, $num, $length ));

}
}

closedir($handle);
}
$totfiles = $i;

$page = isset($_GET['page']) ? $_GET['page']-1 : 0;
echo "<br/>";

for($x=$page*6; $x < $totfiles && $x < ($page+1)*6; $x++) {
$data = $dataArray[$x];
?>
<div class="visible">
<?php echo '<p class="ingatlan">' . $data[0] . $data[1] . '</p>'; ?>
</div>
<?php
}

Itt a 2 ciklus :o érdekes, a képes oldaoon működött. JA, most ilyen 10k+ ismeretlen karaktereket dob be.

https://heureka-kreativ.hu

(#10455) Sk8erPeter válasza trisztan94 (#10454) üzenetére


Sk8erPeter
nagyúr

Ha jól értettem, az eredeti problémád az volt, hogy a képeket NEM TÖLTI FEL, nem a kiíratással volt a para.
Tehát a move_uploaded_file() is valami ciklusban kéne, hogy lefusson.

Sk8erPeter

(#10456) Soak


Soak
veterán

Keresgettem so-n , és linkelték ott ezt a siteot http://ideone.com/ , ha mindenki ismeri akkor tekintsétek semmisnek a hsz-t, de hasonló a jsFiddle-hez, csak tud php-t is. Megmutatja egy kód eredményét.

(#10457) Soak


Soak
veterán

Sziasztok !

A pár oldalon keresztül való beszélgetés után, nekiálltam megcsinálni. Sikerült is, viszont egy valamiben nem vagyok biztos, de elöbb itt a kód . Figyelem! Még fejlesztési fázisban van, szóval a külalak és egyéb most még nem az igazi, van más amin fent lehet akadni :)) .

Tehát :

Egyelőre ez van a Class-ban

public static function find_relevant_3($id=0, $users_id=0) {
global $database;
global $previous;
global $current;
global $next;
$users_id = $database->escape_value($users_id);
$id = $database->escape_value($id);
$previous = self::find_previous($id, $users_id);
$current = self::find_current($id, $users_id);
$next = self::find_next($id, $users_id);

foreach($previous as $previous){
global $previous_pic_id;
$previous_pic_id = $previous->id;
}



foreach($current as $current){
global $current_pic_id;
global $photo_users_id;
global $photo_filename;

$current_pic_id = $current->id;
$photo_users_id = $current->users_id;
$photo_filename = $current->filename;
}


foreach($next as $next){
global $next_pic_id;
$next_pic_id = $next->id;
}

}

public static function find_previous($id=0, $users_id) {
global $database;
$users_id = $database->escape_value($users_id);
$id = $database->escape_value($id);
return self::find_by_sql(" SELECT * FROM `photographs` WHERE id < ".$database->escape_value($id)." AND users_id = ".$users_id." ORDER BY id DESC LIMIT 1 ");


}


public static function find_current($id=0, $users_id=0) {
global $database;
$users_id = $database->escape_value($users_id);
$id = $database->escape_value($id);
$users_id = $database->escape_value($users_id);
return self::find_by_sql(" SELECT * FROM `photographs` WHERE id = ".$database->escape_value($id)." AND users_id = ".$users_id." LIMIT 1 ");
}


public static function find_next($id=0, $users_id) {
global $database;
$users_id = $database->escape_value($users_id);
$id = $database->escape_value($id);
return self::find_by_sql(" SELECT * FROM `photographs` WHERE id > ".$database->escape_value($id)." AND users_id = ".$users_id." ORDER BY id ASC LIMIT 1 ");

}

Ez pedig magán a pagen:

Photograph::find_relevant_3($_GET['p'], $users_id);
if(empty($previous_pic_id))
{
$previous_pic_id = "";
$previous_pic_link = "";

}
else
{
$previous_pic_link = "<a href=\"photos.php?user=$users->username&id=$users->id&p=$previous_pic_id\" >previous</a>";
}
if(empty($next_pic_id))
{
$next_pic_id = "";
$next_pic_link = "";

}
else
{
$next_pic_link = "<a href=\"photos.php?user=$users->username&id=$users->id&p=$next_pic_id\" >next</a>";
}

if($_SESSION['user_id'] == $photo_users_id )
{
$delete = "Delete";
}
else
{
$delete = "";
}
$path = Photograph::photosphp_image_path($photo_filename);

echo "<div class=\"photos_pics\" ><a href=\"../$path\" ><img src=\"../$path\" alt=\"\" name=\"start_pic\" class=\"photos_pic\"></a><a href=\"../delete_photo.php?id=$current_pic_id\">$delete</a>";


?>
</div>

<div id="pagination"><?php
echo $previous_pic_link;
echo $next_pic_link;

?>
</div>

Szóval az elsődleges problémám, mint látszik is, 3 funkcióbol jön össze a dolog, magyarul 3szor kell elmenni az adatbázishoz. Saját kútfőből ilyenre sikerült, amit Sk8erPeter irt, nekem nem működik, betettem phpmyadminba magában is, mindig csak az első eredményt adja vissza.

Bármiféle építő kritikát szívesen veszek.

(#10458) cucka válasza Soak (#10457) üzenetére


cucka
addikt

Elnézést, ha belepofázok, de jól láthatóan nem értetted meg az OOP lényegét:
- Az osztályod statikus függvényeket tartalmaz, ami azt jelenti, hogy nem csináltál mást, mint egy névteret globális függvényeknek.
- A függvényeid globális változókat változtatnak, ahelyett, hogy rendes (matematikai) függvényként működnének: a függvény kap n darab bemeneti paramétert, ami alaján kiszámolja az eredményt. Ennyit csinál, nem többet. Nem módosítja a paramétereit. Nem nyúl ki a globális névtérbe. Sőt, igyekezni kell mellékhatás-mentesre csinálni (nyilván sokszor elkerülhetetlen).

A fentiek miatt elkerülheted a rengeteg global deklarációt.

Továbbá itt van ez a kódrészlet:
$previous = self::find_previous($id, $users_id);
...
foreach($previous as $previous){
global $previous_pic_id;
$previous_pic_id = $previous->id;
}

- Ciklusban deklarálod a globál változót, biztos ami biztos? :D
- A foreach-ben érdemes kerülni a névütközést.
- A ciklusod annyit csinál, hogy végigmegy a previous tömbön, majd az utolsó elemnek eltárolja az id-ját egy globális változóba. Minek ehhez végigmenni a previous tömbön?
- Ha a previous tömb utolsó elemére van csak szükséged, miért nem azt adja vissza a függvényed?
- Mi van, ha az első képen állsz és nincs previous? Nem kezeled le az esetet, kiírsz egy üres stringet bele a html-be.
- Ugyanez a foreach megismétlődik a $current változónál, ami viszont nyilvánvalóan nem egy tömb, mert egy aktuális elem van. Ott mi szükség rá? (Vagy mégis tömb? A kódból nem derül ki, és ez nagy baj)

Még:
- A $_GET['p'] értékét háromszor escape-eled ki, amíg bekerül az adatbázisba. Ha valóban van az értékben egy olyan karakter, amit ki kell escape-elni, akkor a kódod nem fog működni.
- Az empty() nyelvi elemet (figyelem, ez nem függvény) érdemes elkerülni, jól meg tudod sz*patni magad vele.
- Mivel a php-ban nem látod, hogy melyik változó milyen típusú, érdemes beszédesebb neveket adni - például ami tömb, az többes szám, vagy a függvény paramétereknél $id helyett $pic_id - így nem kell nyomozni, ha fél év múlva tovább akarod fejleszteni a kódodat, akkor el is fogod tudni olvasni

[ Szerkesztve ]

(#10459) Soak válasza cucka (#10458) üzenetére


Soak
veterán

Igazad van, tényleg nem értem az OOP lényegét, csak sejtem. A kérdéseket költőinek veszem :) . Megfogadom amiket írtál, egy részét már kijavítottam a hsz óta.

(#10460) Speeedfire


Speeedfire
nagyúr

Nincs valami egyszerű megoldás az ingyenes domain-ek szűrésére? Most fel van sorolva pár, de nem a legjobb megoldás szerintem így. :U
Meg az összeset nem is ismerem. :(

elseif (preg_match("/(uw.hu)|(atw.hu)|(extra.hu)|(blogspot.com)|(blogger.com)|(blog.hu)/", $_POST['url'])) {

[ Szerkesztve ]

Fotóim https://fb.com/toth.szabolcs.art || IG: http://instagram.com/_tothszabolcs_ || Weblapom http://szabolcs-toth.com

(#10461) Soak válasza cucka (#10458) üzenetére


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.

(#10462) Sk8erPeter válasza Soak (#10457) üzenetére


Sk8erPeter
nagyúr

foreach($previous as $previous){
foreach($current as $current){
foreach($next as $next){

A lényeget cucka már leírta, de nekem a fentiektől nyílt ki legjobban az agyam. :D Nem is tudom, ez működik-e így egyáltalán, bár valószínűnek tartom, hogy inkább nem, és felmerül, hogy felül is írja a változót...
De ezek szerint a foreach használatának logikája sem jött át, vagy nem vágom, ilyet miért toltál be a kódodba.

Példa jó használatra:
foreach($ezatömböd as $ezazaktuáliskulcs => $ezazaktuálisérték){
}

vagy csak
foreach($ezatömböd as $ezazaktuálisérték){
}

De ne legyen már ugyanaz a neve a tömbnek és az aktuális értéknek...

(#10461) Soak : annyira rondán van indentálva a kódod, hogy őszintén szólva nem sok kedvem van a végignézésére.
Mit használsz PHP-fejlesztésre? Csomó IDE-ben van automatikus formázás, pl. NetBeans-ben Alt+Shift+F.
DW: [link].

=========

(#10458) cucka :
"Az empty() nyelvi elemet (figyelem, ez nem függvény) érdemes elkerülni"
Szerintem nem kell kerülni, tudni kell, hol indokolt a használata.
Akár debuggolásra is jól jöhet.
És/vagy ha az ember számíthat NULL, 0 vagy false értékekre is valamilyen oknál fogva.
Persze mielőtt mondanád, azzal egyetértek, hogy jobb szigorú szabályokhoz kötni, adott függvények/metódusok mivel térhetnek vissza, de előfordulhat olyan eset, hogy nem vagy biztos benne, milyen jellegű típus várható az empty()-nek megfelelőek közül, és nincs kedved típusonként ellenőrizni.
Persze a konkrét esetben valóban nem indokolt, de általános értelemben szerintem nem feltétlenül igaz, hogy kerülni kell.

[ Szerkesztve ]

Sk8erPeter

(#10463) Soak válasza Sk8erPeter (#10462) üzenetére


Soak
veterán

Tudom, hogy mikent mukodik a foreach, egyszeruen lusta voltam mar szarakodni vele es mukodott, de legfokepp azert mert mar akkor tudtam, hogy szar az egesz, ezert nem figlalkoztam vele. :D

Dw nem formazza a phpt

[ Szerkesztve ]

(#10464) Sk8erPeter válasza Soak (#10463) üzenetére


Sk8erPeter
nagyúr

Az ilyen lustaságok miatt aztán később verni fogod a saját fejed a falba. :K
"Dw nem formazza a phpt"
Tipp: ne azt használd PHP-fejlesztéshez. :DDD

Sk8erPeter

(#10465) wolandino


wolandino
tag

Sziasztok!

Van egy MS SQL adatbázisom, amit linux környezetben szeretnék használni és ugyancsak arról a linux szerverről elérni, amin nem mellesleg PHP fut.
Windows-os környezetben ugyanezt pofonegyszerűen elértem egy ilyen kóddal:

$connection = odbc_connect("Driver={Microsoft Access Driver (*.mdb)};DBQ=". realpath("./teszt.mdb").";", "ADODB.Connection", "");

de linux alatt sehogy sem akar összejönni, pedig már végignyálaztam a netet vagy kétszer ezügyben:(

Ha tudna valaki segíteni, akkor nagyon hálás lennék.

Köszönettel,
W.

(#10466) CSorBA


CSorBA
őstag

Korábban javasolták itt többen az IntlDateFormatter osztályt. Sajnos nem nagyon felelt meg mégsem, mivel (lehet én voltam figyelmetlen, de) nem nagyon tudtam beállítani a megjelenést, azaz kb kimerült 4 megjelenítési módban. Mivel nekem ez nem volt elég, így maradtam a saját fordító osztálynál, ami előre definiált patternek szerint jeleníti meg a dátumot. Sajnos nem vagyok benne biztos, hogy nyelvtanilag sikerült eltalálnom minden lehetőséget, de azért próbálkoztam. Ha valakit érdekel, megtekinthető [itt], ha valakinek kellene, az dobjon rám egy privit.

(#10467) Fecogame


Fecogame
veterán

Erre tudtok valami okosat? :)

Le kellene cserélnem az SMF fórummotort egy Vbulletin-re. A konvertálás még okés is lesz, de hogyan tudom egyszerre mindkét fórummotort működtetni, ha ugyanazon domain név alatt működik mindkettő?

:R

Lassú a mobilinterneted? 4G/LTE antennák, közvetlenül raktárról ---> http://bit.ly/LTE_Antennak

(#10468) trisztan94 válasza Sk8erPeter (#10455) üzenetére


trisztan94
őstag

Na, és ezzel mi a baj? :D feltölti a képet csak az src-be nem tudom berakni. És azt hogy a többi képet is listázza ha több van az hogy nézne ki?:D

if(isset($_FILES['files'])){

foreach($_FILES['files']['tmp_name'] as $key => $tmp_name){

move_uploaded_file($tmp_name, "ingatlan/kepek/ {$_FILES['files']['name'][$key]}") or die("asd");
}}

// Ha eddig eljön a scipt akkor a kép már a szerveren van
// beleírjuk a fileba a címet meg mindent
$datum = getdate();
$fh = fopen($uploadsDirectory . $cim . '.txt','w');
$stringData = "<br/>\n<article>\n<header class='ing_header'>" . $cim . "\n</header>" . "\n<div class='fokep_wrapper'><img class='fokep' src='". $uploadsDirectory2 . $_FILES['files']['name'][$key] . "' alt='".$cim."'</div><div class='tobbikep'></div><p>" . $leiras . "\n</p>\n<footer class='ar'>" . $ar . "\n</footer>\n</article>\n\n<br/>";

[OT]Heti utolsó kérdés, I promise![/OT]

[ Szerkesztve ]

https://heureka-kreativ.hu

(#10469) daninet


daninet
veterán

Üdv!

Egy kis pénzkereseti lehetőséget ajánlok, mert az én képességeimet ez már meghaladta :) Egy webshopba kellene beletákolni pár sort (árukereső trusted shop automatikus emailje), illetve a payU bankkártyás fizetéshez kell egy kimeneti fájl egy dokumentáció alapján.

Joomla 1.5, Virtuemart webshop. Pénzben megegyezünk, nem határidős csak legyen kész belátható időn belül. Privátban írjon akit érdekel a dolog :R :R

Miért vegyem meg, ha 3x annyiért, 3x annyi idő alatt megépíthetem? ´¯`·.¸¸.·´¯`·.¸><(((º>

(#10470) Sk8erPeter válasza CSorBA (#10466) üzenetére


Sk8erPeter
nagyúr

Akkor már pakold fel phpclasses.org-ra vagy ehhez hasonló helyre, ha már ópenszósz lesz a kód. :D

Sk8erPeter

(#10471) Sk8erPeter válasza Fecogame (#10467) üzenetére


Sk8erPeter
nagyúr

Már magát az elgondolást sem értem, miért jó azonos domain alatt két különböző fórummotort működtetni... Nem tudod összeolvasztani?
Megoldhatod aldomainekkel és alkönyvtárakkal is: pl. a főoldalon van két választási lehetőség, Fórum 1 és Fórum 2 linkekkel, ha valaki ráklattyol egyikre, akkor átirányít a http://example.com/forum1 VAGY http://example.com/forum2 címre, ahol teljesen függetlenül működik a két motor. Az adatbázis lehet közös, prefixek alkalmazásával.

Sk8erPeter

(#10472) Sk8erPeter válasza trisztan94 (#10468) üzenetére


Sk8erPeter
nagyúr

"feltölti a képet csak az src-be nem tudom berakni"
A $stringData változód már a cikluson kívül van... magát a kiíratásra vonatkozó, konkatenált stringet is a cikluson belül kellene összeállítani (a foreach-en belül). Úgyis ott rakod össze a végleges elérési utat, ahova át kellene mozgatni, tehát akkor lehet az az src attribútum értéke.

=======

(#10465) wolandino : ahogy elnézem, közben megtaláltad a megoldást. :)

[ Szerkesztve ]

Sk8erPeter

(#10473) trisztan94 válasza Sk8erPeter (#10472) üzenetére


trisztan94
őstag

Köszönöm szépen ! :D:D

https://heureka-kreativ.hu

(#10474) Soak


Soak
veterán

Sziasztok !

Írtam egy functiont arra, hogy kilistázzam userek szerint az üzeneteket. Örülnék, ha lenne kedve valakinek kritizálni meg véleményt alkotni. [link] . A formázás itt tényleg szar.

(#10475) Sk8erPeter válasza Soak (#10474) üzenetére


Sk8erPeter
nagyúr

Használd ezt a formázót, ha nem sikerül másként...:
http://beta.phpformatter.com/

Szétb@szhatja azért is a formázást, mert public functionnel kezded kapásból, és nem adsz nevet az osztálynak. Nyilván most csak kivágtad a megfelelő részt, de akkor ne az ideone.com-ra rakd, hanem a pastebinre, ha előbbire, akkor legalább adj egy nevet az osztálynak, és tedd oda kommentbe a három pontot, ami jelöli, hogy ott amúgy van más is. (Hogy ne legyen itt ezen az oldalon syntax error.)

if(isset($_GET['i']))
Már eleve rossz kezdés szerintem. Itt már szerintem nem kellene $_GET, $_POST és hasonlókhoz nyúlni, hanem a megfelelő helyen be kellene ezeket állítani, legalábbis ez ebben a formában csúnya osztályon belül.
Ezenkívül mi az az "i"? Miért szopatod magad ilyen kulcsokkal? Miért nem használsz beszédesebb neveket, teljes szavakat?
Én kimegyek a fazonomból az ilyenektől, elég utálatos feladat, amikor más kódját kell kotorásznod, és ilyeneket látsz, egyből letépnéd a fejét annak, aki írta ezt a kódot, és még egy nyomorék kommentet sem rakott oda. Ha már agilis szoftverfejlesztés, akkor már a kód legyen beszédes.

$messages = self::find_messages_by_sender_id($_GET['i']);
Miért static függvényhívás? Miért kevered a szezont a fazonnal? Egyáltalán minek ide static függvény?
Erről már korábban is volt szó, cucka is említette neked.

foreach($messages as $message)
Összesen háromszor?? :Y Mi a francnak mész végig rajta külön-külön?!
Ugye tudod, hogy ez így háromszor annyi időbe is kerül (és egyébként totál értelmetlen)?

if(strlen($message->body) > 140){$dots = "...";} else {$dots = "";}
Ez is több helyen szerepel, az már eleve gáz, de amúgy is: mi értelme van? Ennyiből kb. semmi.
Ha le kell vágni a törzsből valamennyit, mert adott karaktermennyiséget túllép, akkor azt egy tök különálló truncate() metódusban végezd el, ne ugyanebben a függvényben. A default karakterlimit pedig a függvény egyik paramétere lehet, default értékkel. Vagy tárold pl. osztályváltozóként a limitet, de inkább előbbi.

Aztán egyszer a $message_username változót használod, egyszer a $message->sender_username-et. Abszolút semmi értelme. Egyébként sincs értelme itt átadni másik változónak.

$senders = array();
foreach($messages as $message){
if(array_key_exists($message->sender_username,$senders)){
$senders[$message->sender_username]++;
}
else{
$senders[$message->sender_username] = 1;
}
}

Ennek magyarázd már el légyszi, mi értelme, mert szerintem kb. semmi.
Miért kotorászol a $senders-ben, amikor egy üres tömbbel tetted előtte egyenlővé?

Tovább nem volt kedvem keresgélni a hibákat, ezek csak első blikkre tűntek fel, némi fájdalmat okozva. :D Bocs, de ez így iszonyatosan gány. A kritikákon ne sértődj meg, mert Te kérted. :K

Sk8erPeter

(#10476) Soak válasza Sk8erPeter (#10475) üzenetére


Soak
veterán

A $_GET['i'] a tesztelés miatt volt ilyen beszédes, plusz már nem szerepel a funkcióban , csak igy könnyebb nekem szarakodni, ha fejlesztem.

A staticot kijavítottam már. Rossz beidegződés volt. Mostmár sejtem az OOP-t és az elöttről maradt.

A 3 foreach azért van, mert legrosszabb esetben 2 fut le, de nem tudtam jobban megoldani, hogy ki tudjam jelezni egy usertől hány üzenet van. Végig fut, megcsinalja az array-t aztán kiiratom az arrayból, hogy mennyi van. Ezért irtam ide, mert kezdő vagyok, nyitott vagyok az ötletekre . Azért egyenlő egy üres tömbbel, mert különben hibaüzenetet dobál, hogy nincs definiálva...

if(strlen($message->body) > 140){$dots = "...";} else {$dots = "";}
Ez is több helyen szerepel, az már eleve gáz, de amúgy is: mi értelme van? Ennyiből kb. semmi.
Ha le kell vágni a törzsből valamennyit, mert adott karaktermennyiséget túllép, akkor azt egy tök különálló truncate() metódusban végezd el, ne ugyanebben a függvényben. A default karakterlimit pedig a függvény egyik paramétere lehet, default értékkel. Vagy tárold pl. osztályváltozóként a limitet, de inkább előbbi.

Azt tényleg gáz, hogy így szerepel itt, de ezt a static hibával egyidejüleg javitottam

Nem sértődöm meg abszolút, miért tenném? :D Folyamatosan tanulok, nem ez a szakmám, csak hobbi.

[ Szerkesztve ]

(#10477) Shkiz0


Shkiz0
nagyúr

Sziasztok.

Adott nekem egy Mikrotik router, ami úgy van belőve, egy helyi intranetes hálózaton, wake on lan segítségével indíthassam a gépemet.
Nos ez működik is, nincs semmi gond. Van a helyi tárhelyemen egy start.php amit ha elindítok akkor adja ki a parancsot, és indul el a gép. Így néz ki:

<?php
$MT_CIME="ip cim";
$LOGIN="user";
$PW="pass";

require('class.php');
$API = new routeros_api();
$API->debug = false;


if ($API->connect($MT_CIME, $LOGIN, $PW)) {


$API->comm("/tool/wol", array(
"mac" => "MAC adress",
"interface" => "interface"));
print "tetszőleges szöveg amit kiír, miután lefutott a parancs és mindent rendben talált" ;





$API->disconnect();
}


?>

Na most én azt szeretném, hogy ezen tetszőleges szöveg helyett mondjuk egy kép legyen.
Azt hogyan tudnám megoldani, egyáltalán lehetséges ez?

Köszönöm előre is a válaszokat.

Új hardverek számlával, garanciával érd PM.

(#10478) fordfairlane válasza Shkiz0 (#10477) üzenetére


fordfairlane
veterán

Miféle kép, mindig ugyanaz? Mert akkor egyszerű, print "szöveg" helyett print '<img src="itt/akep.png">', például.

x gon' give it to ya

(#10479) Shkiz0 válasza fordfairlane (#10478) üzenetére


Shkiz0
nagyúr

ugyanaz lenne.

Új hardverek számlával, garanciával érd PM.

(#10480) Shkiz0 válasza Shkiz0 (#10479) üzenetére


Shkiz0
nagyúr

:R
Így már oké.

Új hardverek számlával, garanciával érd PM.

(#10481) Sk8erPeter válasza Soak (#10476) üzenetére


Sk8erPeter
nagyúr

"A 3 foreach azért van, mert legrosszabb esetben 2 fut le, de nem tudtam jobban megoldani, hogy ki tudjam jelezni egy usertől hány üzenet van."
Akkor sem értem a logikát, hogy miért kell különbontani, és három különálló, de teljes mértékben egyező ciklusban megoldani, amit meg szeretnél, ezzel háromszorosára növelve a ciklus futási idejét...

"Azért egyenlő egy üres tömbbel, mert különben hibaüzenetet dobál, hogy nincs definiálva..."
Még mindig nem érthető, mit is akarsz üres tömbbel... array_key_exists-szel vizsgálgatsz egy nyilvánvalóan nem létező kulcsot, mivel üres a tömb? Mi értelme?

Sk8erPeter

(#10482) Soak válasza Sk8erPeter (#10481) üzenetére


Soak
veterán

Akkor sem értem a logikát, hogy miért kell különbontani, és három különálló, de teljes mértékben egyező ciklusban megoldani, amit meg szeretnél, ezzel háromszorosára növelve a ciklus futási idejét...

Te hogy oldanád meg? Van egy foreach akkor amikor van beállítva $_GET['id'] , van egy arra amikor nincs (akkor az összes üzenetet hozza ki, amikot van beállítva akkor csak egy usertől) , már külön functionba. A harmadik azért van akkor amikor nincs $_GET['id'] , mert végigmegy az arrayon, beírja mindenkihez, hogy hány üzenet van tőle és így ki tudom iratni userenként az üzenetszámot. Ha ezt berakom abba amikor az üzeneteket listázza akkor nem tudtam megoldani az üzenetszám kiratást.

Még mindig nem érthető, mit is akarsz üres tömbbel... array_key_exists-szel vizsgálgatsz egy nyilvánvalóan nem létező kulcsot, mivel üres a tömb? Mi értelme?

Az lett volna az értelme, hogy elösször biztosan le kell futnia, mivel az első vizsgálatnál még nem volt üzenet és fogalmam sincs ki a feladója az első üzenetnek. Ezért az elsőt beleírja és ha tőle jött még 3 akkor azokat már ignorálja és csak a következő legfrissebbet rakja ki, másik usertől.

(#10483) Sk8erPeter válasza Soak (#10482) üzenetére


Sk8erPeter
nagyúr

"Te hogy oldanád meg?"
Egyetlen ciklussal. :DDD
De őszintén szólva már a kérdést sem értem. Egymás alatt, azonos metódusban szerepel háromszor ez:
foreach($messages as $message)
Akkor ebből nyilvánvaló, hogy pontosan ugyanazt csinálják, tehát nem értem, miért nem pakolod egyszerűen egybe azt, amit számomra érthetetlen okból különválasztottál, és vizsgálgatod a feltételeket a cikluson belül.

Leegyszerűsítem olyan példára, aminél egyszerűbbet már nem tudnék mondani az adott helyzetre:

foreach($messages as $message){
echo 'ELSŐ blablabla';
}

if($tokmindegy){
foreach($messages as $message){
echo 'MÁSODIK blablabla';
}
}

if($ezismindegy){
foreach($messages as $message){
echo 'HARMADIK blablabla';
}
}

ehelyett miért ne lehetne így:

foreach($messages as $message){
echo 'ELSŐ blablabla';
if($tokmindegy){
echo 'MÁSODIK blablabla';
}
if($ezismindegy){
echo 'HARMADIK blablabla';
}
}

Capisce? :F

"Az lett volna az értelme, hogy elösször biztosan le kell futnia, mivel az első vizsgálatnál még nem volt üzenet és fogalmam sincs ki a feladója az első üzenetnek. Ezért az elsőt beleírja és ha tőle jött még 3 akkor azokat már ignorálja és csak a következő legfrissebbet rakja ki, másik usertől."
Miért találna bármit is egy üres tömbben? :F
Most gondolj már bele, ez olyan, mintha lenne egy tök üres kosárkád, és elkezdenél keresgélni benne izomból egy piros színű labdát, amikor tudod jól, hogy az a kosár tök üres.

Sk8erPeter

(#10484) Soak válasza Sk8erPeter (#10483) üzenetére


Soak
veterán

Az előző hsz.-edben az volt a problémád, hogy a function elött döntsük el, hogy if(isset($_GET['xyz'])) . Ami szerintem is jó, ezért van egy function ami akkor fut ha van, meg van egy ha nincs. De ezt irtam az elöbb is. Tehát az egyik esetben nincs probléma, mivel egy foreach van és kész. (abban a functionba) . A másiknál van az, hogy elötte kell egy foreach (nekem), hogy az arrayba szépen beírja kitől hány üzenet jött, mert nem tudtam úgy ezt megcsinálni, ha egy foreachel akartam megoldani. Amikor épp az adott elemet vizsgálom akkor honnan tudom, hogy van-e még több üzenet attól a feladótól időrendbe hátul? Lehet, hogy én nem értem amit te nem értesz és valamit benézek. Vagy csak egyszerűen a foreach mehanizmusát gondolom rosszul.

Miért találna bármit is egy üres tömbben?
Most gondolj már bele, ez olyan, mintha lenne egy tök üres kosárkád, és elkezdenél keresgélni benne izomból egy piros színű labdát, amikor tudod jól, hogy az a kosár tök üres.

Értem, hogy mit mondasz, de épp ez a cél, hogy nem fog találni elsőre semmit, ha semmit nem talál akkor azt jelenti, hogy az adott usert sem. Most ha jól gondolom akkor arra gondolsz, hogy tegyem bele azt is, hogy ha az array üres akkor mivan? Mert akkor ugyan ott vagyok, nem?

(#10485) Sk8erPeter válasza Soak (#10484) üzenetére


Sk8erPeter
nagyúr

"Az előző hsz.-edben az volt a problémád"
Ácsi, kicsit rosszul közelíted meg a kérdést. Nekem aztán nem probléma, ha gányolsz, de tanácsot kértél.

$_GET: Akkor totál félreértetted, amit mondtam. Annyit javasoltam, hogy a $_GET, $_POST és hasonló tömbökhöz közvetlenül már ne nyúlj az objektumodban, hanem add át paraméterként a tartalmukat a metódusnak, állítsd be a konstruktorban, vagy fogalmam sincs, hogyan oldd meg, de a metóduson belül ne közvetlenül használd már ezeket a tömböket, mert szerintem nem szép. Komolyabb rendszerekben sem nagyon szoktam látni, hogy közvetlenül nyúlkálnak hozzá az osztályon belül. De ahogy érzed.

A foreach egy egyszerű bejáró algoritmus, semmi extra mutatvány nincs a dologban. De ha háromszor használsz foreach-et, akkor háromszor járod be. Ez felesleges.
Ez most a kosaras példánál maradva olyan, mintha lenne egy kosarad, ami tele van kék, fekete, piros golyókkal, és neked az lenne a feladatod, hogy ezeket külön kosarakba gyűjtsd színek szerint; te pedig úgy oldanád meg, hogy először átnéznéd a kosarat, és kiszednéd a pirosakat a saját kosarába, majd ha ezzel végeztél, akkor megint átnéznéd a kosarat, csak a kék golyókra koncentrálva, aztán harmadik alkalommal is átnéznéd, akkor már csak a fekete golyókat keresgélve, miközben ezt megoldhattad volna úgy is, hogy az épp kezed ügyébe kerülő golyót a megfelelő kosárba pakolod, szín szerint.

$senders tömböd:
itt már részletesen leírtam, mi a probléma vele. Nem igazán vágom, mit nem értesz belőle, de megpróbálom még egyszer elmagyarázni, kiemelve a lényegi részt:

$senders = array();
if(array_key_exists($message->sender_username,$senders))

Elmagyarázva szavakkal, a kosaras példával:
$kosár = tök üres
ha a $kosárban van piros színű golyó, akkor csináld ezt:

Vágod?

Sk8erPeter

(#10486) Cathfaern válasza Sk8erPeter (#10485) üzenetére


Cathfaern
nagyúr

"A foreach egy egyszerű bejáró algoritmus, semmi extra mutatvány nincs a dologban. De ha háromszor használsz foreach-et, akkor háromszor járod be. Ez felesleges."
Nem feltétlenül. Amennyiben az első foreachen belül megváltoztatsz valamit a tömbön, akkor lehet értelme mégegyszer bejárni (elvileg ugyanazt a tömböt, gyakorlatilag nyilván akkor már nem ugyanazon mész végig). És ahogy láttam, itt pontosan erről van szó.

"$senders = array();
if(array_key_exists($message->sender_username,$senders))
Elmagyarázva szavakkal, a kosaras példával:
$kosár = tök üres
ha a $kosárban van piros színű golyó, akkor csináld ezt:
Vágod?"

Az idézett kódban nem ez történik. Ha megnézed, akkor ahogy végigmegy a foreach-en, pakolgat bele a senders tömbbe. A kiürítés miatt először igen, üres lesz, de ha többször is szerepel ugyanaz a "sender_username" a messagesben, akkor utána a senders tömb adott kulcsánál már ott lesz valami (a korábban beállított 1, vagy az inkrementált érték)

[ Szerkesztve ]

(#10487) Sk8erPeter válasza Cathfaern (#10486) üzenetére


Sk8erPeter
nagyúr

Na, most felraktam ide, hogy normálisan nézzen ki, így már legalább látható is, mi van a kódban... :O
Csak most látom át, így, hogy ki is lehet valamit belőle venni, hogy csak az else ágban van a másik kettő foreach... :U A $senders-re vonatkozó részt tényleg félreértettem... hát igen, nem árt, ha normálisan van indentálva a kód....
$senders = array();
foreach ($messages as $message) {
if (array_key_exists($message->sender_username, $senders)) {
$senders[$message->sender_username]++;

} else {
$senders[$message->sender_username] = 1;
}
}

Tehát magyarul akkor ad hozzá a $senders adott kulcsánál lévő számhoz plusz egyet, ha már létezik az adott kulcs a felhasználó nevével, egyébként eggyel egyenlő... :W
Igazad van, ezt sem láttam át a korábbi ocsmány kód miatt (az is igaz, hogy eléggé átrohantam rajta).
Ettől függetlenül továbbra is fenntartom, hogy ezt nem így kéne, nemsokára írom, miért. Áll a többi dolog is, azzal a módosítással, hogy ezek szerint nem fut le mindhárom ciklus, mert külön vannak. A statikus függvényhívásokra, változókra, egyebekre (pl. truncate() külön függvény/metódus, stb.) vonatkozó dolgok is állnak.

"Amennyiben az első foreachen belül megváltoztatsz valamit a tömbön, akkor lehet értelme mégegyszer bejárni (elvileg ugyanazt a tömböt, gyakorlatilag nyilván akkor már nem ugyanazon mész végig). És ahogy láttam, itt pontosan erről van szó."
Nézd meg még egyszer, a $messages tömbön nem változtat semmit az első ciklusban. Csak kigyűjti a $senders tömbbe a megfelelő neveket, a hozzájuk tartozó üzenetek számát. Aztán ezt használja fel a második foreach-nél, és ennyi.
Az a baj, hogy feltételezem, a find_messages_by_users_id() metódusában eleve van már egy ciklus, ami bejárja az adatbázisból lekért eredményeket. Így tehát összesen 3 darab (!) ciklus lesz mégis, mert még ezt is be kell járni még egyszer. Úgy lehetne ezt redukálni mondjuk max. 2-re, hogy eleve egy normális query-t ír, ami felhasználók szerint csoportosítva kéri le az üzeneteket, aztán amikor ezt az eredményhalmazt bejárja PHP-vel, akkor eleve felhasználónként gyűjti egy tömbbe az üzeneteket. Akkor meg már lehetne használni ezeken a gyorsabb count() függvényt is, amivel egyből megkapná, hány darab üzenet tartozik a felhasználóhoz, meg csak a kiíratáshoz kellene bejárni.
Úgy már nem lenne gány.

[ Szerkesztve ]

Sk8erPeter

(#10488) DeltaPower válasza Soak (#10484) üzenetére


DeltaPower
őstag

Ha jól értem ezt, az IF első része arra vonatkozik, ha egy adott feladótól érkező üzeneteket akarsz listázni, a második része pedig a feladók listája.

Három foreach tényleg fölösleges, még ha max 2 fut is le, főleg hogy minddel végigmész az összes üzeneten.

Én ilyesmi megoldást ajánlok:
function list_messages()
{
if( $_GET['i'])
{
$messages = self::find_messages_by_sender_id($_GET['i']);
}
else
{
$messages = self::find_messages_by_users_id($_SESSION['user_id']);
$sender_list=getSenderListWithCount($_SESSION['user_id']);
}

foreach ($messages as $message) { ... }

}

function getSenderListWithCount($cimzett_id)
{
// SELECT COUNT(message_id), ... WHERE cimzett_id={$cimzett_id} GROUP BY sender_id
}

"Moonshine Whiskey (70°, ízesítés nélküli) van. Fincsi" - Teebee - "De az kiírtaná az egész családomat..Akkor is ha csak én innék belőle.." - forintuser

(#10489) Cathfaern válasza Sk8erPeter (#10487) üzenetére


Cathfaern
nagyúr

Igen ezen gondolkoztam is, hogy beleírjam, nem szép megoldás, de azért nem is teljesen értelmetlen :)
De szerintem ez tipikusan olyan kód, amit jobb lenne elejétől kezdve (onnantól, hogy funckió szinten mit szeretne az ember, tényleges programozást teljesen elfelejtve) újragondolni.

(#10490) Soak


Soak
veterán

Köszönöm mind a hármótoknak a hozzáadott értéket. :R Ezek alapján kicsit újragondolom az egészet és egy kicsit jobban összerakom. Remélem nem sokára összefoglalom az eredményt.

(#10491) Sk8erPeter válasza Cathfaern (#10489) üzenetére


Sk8erPeter
nagyúr

Igen, ezzel teljesen egyetértek. :K

(#10490) Soak : szívesen!

Sk8erPeter

(#10492) Peter Kiss


Peter Kiss
senior tag
LOGOUT blog

PHP-t tanulóknak, használóknak mutatnám az alábbi könyvet:
PHP Master: Write Cutting-Edge Code

Szerintem elég használható darab, és még ráadásul up-to-date is.

(#10493) j0k3r! válasza Peter Kiss (#10492) üzenetére


j0k3r!
senior tag

a konyvon tul en meg egy oldalt ajanlanek a php-val foglalkozoknak: [link] - erdemes feliratkozni az rss-ukre, szerintem egesz jo minosegu es temaju cikkekbe is bele lehet botlani (pl.: [link])

some men just wanna watch the world burn...

(#10494) randras


randras
veterán

Helló,

jelenleg PHPExcel-lel manipulálok PHP alól XLS fájlokat probléma nélkül, a gondom viszont az, hogy az XLS-t utána PDF-ben kéne elmentenem. A PHPExcel tudja ezt is, viszont folyton kifut az időből/memóriából konvertálás közben, szóval kellene valami másik módszer erre.

Ha lenne valami ötletetek, megköszönném! :R

(#10495) xTc válasza randras (#10494) üzenetére


xTc
aktív tag

Esetleg próbáld meg azt hogy a php.ini-ben set_time_limit változót nagyobbra állítod.

(#10496) randras válasza xTc (#10495) üzenetére


randras
veterán

Más megoldást találtam, köszönöm! :R

(#10497) Sk8erPeter válasza randras (#10496) üzenetére


Sk8erPeter
nagyúr

Mégpedig? :)

Sk8erPeter

(#10498) Soak


Soak
veterán

Sziasztok !

Az miért van, hogy a phpmyadmin ( 3.4.10.1 ) a saját gépemen nagyon lassú, mintha kb 128kbps-vel neteznék. A szerveren viszont működik rendesen, csak a net szab határt neki (de igazából az sem mert olyan mintha nem lenne késlekedés) . Ugyanaz az adatbázis, szinte üres, szóval nem az én gépem a gyenge. Nem a parancsok végrehajtásánál, hanem pl. egy oldal frissitésénél kb 6-7sec mire betölt. Kerestem a neten, többeknek volt ilyen hiba, de megoldást nem találtam.

[ Szerkesztve ]

(#10499) randras válasza Sk8erPeter (#10497) üzenetére


randras
veterán

Excel-lel kimentettem HTML-be, kitakarítottam a kódból a mocskot, és végül úgy néz ki, mPDF-el generálom majd a PDF-et.

(#10500) mobal válasza Soak (#10498) üzenetére


mobal
MODERÁTOR

Én elsőre valamilyen web kiszolgáló problémára gondolnék. Hogy miért? Routeren a phpmyadmin nekem is tetű lassú, igaz ott a vas egy "router".

"Ott szimatol a sarkadban vasfogait csattogtatva, minden egyes hétköznapod: kirúzsozott medvecsapda."

Útvonal

Fórumok  »  Szoftverfejlesztés  »  PHP programozás (kiemelt téma)
Copyright © 2000-2024 PROHARDVER Informatikai Kft.