Jump to content
GSForum - Segélyvonal

PHP kérdésem van


Recommended Posts

Posted

Ennyi az össz. kód:

<?php
    $x=33400;
    $x=$x/1024;
    echo printf("%.2f\n", $x);
?>

 

És ez a kimenet forrása:

32.62

6

Posted

Az echo és a printf páros lesz a ludas. Szerintem kiírja az echo, hogy a printf hány karaktert küldött ki a kimenetre, mert hogy ezt adja vissza a printf.

Posted

Így is ugyan az a helyzet:

 

<?php
    $x=33400/1024;
    $x=printf("%.2f\n", $x);
    echo $x;
?>

Posted

használd a sprintf() függvényt. a printf() függvény alapból kiírja, nem kell echo.

Posted

Szuper.. köszönöm!

Posted

Mondjuk én az echo-t hagytam volna el, de így sem rossz.

  • 2 weeks later...
Posted
PHP Manual: Unless the array is referenced, foreach operates on a copy of the specified array and not the array itself.

Ha nem mutatóként adod át, akkor másol.

Ennek neki kellene futni még egyszer... Hogyan lehet referencia szerint megadni egy tömböt, ha az alábbira

 

foreach(&$array as $key => $value)

azt mondja, hogy

 

Parse error: syntax error, unexpected '&' in akármi.php on line 947

:hmm:

 

Vagy félreértjük a dolgot, és a fenti (ez esetben meglehetősen szerencsétlenül megfogalmazott) mondat magára a foreach 2-3. paraméterére vonatkozik, amennyiben a $key => $value nem a tényleges $kulcs és $érték, hanem azok másolatai. Ez esetben azonban nincs szó arról, hogy a foreach kétszer annyi helyet foglalna (aka lemásolja a tömböt), hanem csak a tömb éppen aktuális elemeit másolja. Mert arra van példa a doksiban is, hogy

 

foreach ($assray as $key => &$value)

Mely esetben a $value ténylegesen az $array tömb egy eleme. Szóval, konfúz.

 

Posted

Ki nem próbáltam, de elvben mûködnie kell.

<?php
function foo(&$array)
{
    foreach($array as $key => $value)
    {
        ...
    }
}

?>

Posted

Nálam ilyen hal le 5.2.akárhányas PHP mellett, 5.3.akárhányon hibátlan.

Posted
Ki nem próbáltam, de elvben működnie kell.

Működni működik, de ez a foo-nak adja át referenciaként a tömböt, nem a foreach-nek. Ettől még a foreach ugyanúgy nem referenciaként kapja (és "lemásolja", ha lemásolja).

 

Elküldtem a kérdést programozó ismerősöknek, remélem, hogy rábólintanak. (Rosszabb esetben számukra is revelációértékű lesz.)

 

---

 

Programozó ismerősök vakarják a fejüket és vitatkoznak.

 

Az egyik villantott egy olyan példát, amelyben van egy 10 elemű tömbünk, amin elindulunk foreach-csel, és amikor az első elemhez érünk, kitörlünk belőle 5 elemet. A foreach végigmegy az eredeti 10 elemen. :huh: WTF.

 

Erre azt mondja a másik, hogy a PHP-ban minden referencia szinten megy, egy $a = $b is ugyanarra a memóriaszeletre "mutat", egészen addig, amíg valamelyiknek meg nem változtatjuk az értékét, amikor is a megváltoztatott új memóriaszeletet kap. Tehát simán lehet, hogy a fenti példában egészen addig ugyanazokon a memóriaszeleteken ugrál a foreach, amíg el nem kezdjük kitörölni a tömb hátsó elemeit, amikor is elágazik a két történet. A harmadik azt mondja, hogy régen futott bele foreach-csel memória problémába, míg a while simán végigfutott a tömbön.

 

:facepalm:

Posted

Neeeee. :D Ha addig nem oldódna meg, július 6-a után nekiesem ennek. :P Legutóbb a C# memóriakezelésével játszottam el, az is szeret érdekes dolgokat produkálni.

riskawarrior
Posted
Erre azt mondja a másik, hogy a PHP-ban minden referencia szinten megy, egy $a = $b is ugyanarra a memóriaszeletre "mutat", egészen addig, amíg valamelyiknek meg nem változtatjuk az értékét, amikor is a megváltoztatott új memóriaszeletet kap. Tehát simán lehet, hogy a fenti példában egészen addig ugyanazokon a memóriaszeleteken ugrál a foreach, amíg el nem kezdjük kitörölni a tömb hátsó elemeit, amikor is elágazik a két történet.

 

+1

A PHP on-the-fly másol, ha lemásolsz egy változót az valójában csak akkor másolódik ha valamelyiket módosítod. Régen így volt, kétlem, hogy egy ilyen remek dolgot kivennének a késõbbi verziókból.

  • 2 weeks later...
Posted

Egy olyat szeretnék elérni, hogy localhostról egy külsõ szerver adatbázisához csatlakozok. Ilyen lehet, és csak nekem nem sikerül a google segítségével sem? :)

Posted

A külsõ szerveren engedélyezve van a mysql távoli hozzáférés?

Posted

Egy meglehetõsen érdekes problémába futottam bele.

 

Fejlesztek 1 weboldalt.. nem az éles oldalon hanem egy al mappában (akarmi.hu/xy)

 

Amikor készen voltam kérték hogy töltsem fel az éles oldalra.

 

Na itt jöttek a galibák. Az összes inculde nem mûködött. Minden include-ot az indexre kell betenni.

 

Aztán ami még jobban idegesít, hogy nem mûködik az is_file() függvény. Ugyanis ezzel hívom be az al oldalakat.

Most kénytelen voltam megoldani egy sima isset() ellenõrzéssel..

 

Ráadásul eddig az index.php oldalhoz tudtam állítani a mappahivatkozásokat.. de miután áttettem az éles oldalra már az adott fájl helyéhez képest kell hivatkozni.

 

 

 

A szerver Win 2008 és IIS. Ha van valakinek valami jó ötlete az jelentkezzen.

Posted

PHP doksiban is_file-nál írja valaki:

 

I have noticed that using is_file on windows servers (mainly for development) to use a full path c:\ doesn't always work.

 

I have had to use

C:/foldertowww/site/file.ext

 

so I preform an str_replace('\\', '/', $path)

Sometimes I have had the \ instead of / work. (this is using apache2 on XP)

 

but for sure you cannot have mixed separators.

Hátha.

 

Nálunk az include-oknál relatív mappahivatkozások vannak (includes/classes/akarmi). Ennek nyilván feltétele, hogy php csak a weboldal gyökérkönyvtárából fut, így ahhoz képest működik a relatív hivatkozás.

Posted

Sejtem én is hogy win és az IIS lesz a ludas (még soha nem használtam ijjet).. de fõleg azt nem értem hogy egy mappával beljebb miért mûködik..

Posted

Hogyan adtad meg a hivatkozásokat? /xy vagy ./xy

Posted

Na most nem értem mire gondolsz.. de inkább leírom a konkrétumokat:

 

index.php:

if(is_file("pages/".$_GET['s'].".php")){
    include("pages/".$_GET['s'].".php");
}else{
    include("pages/main.php");
}

 

Mondjuk "?s=akarmi"

 

akarmi.php tartalma:

if(!isset($_GET['d'])) $_GET['d']="xy";
  if(is_file("pages/akarmi/".$_GET['d'].".php")){
    include("pages/akarmi/".$_GET['d'].".php");
  }

 

Tehát ha meghívod a "?s=akarmi" -t akkor az akarmi mappából vagy kiválasztja a default oldalt ha nincs $_GET['d'], vagy a $_GET['d']-nek megfelelõ oldalt szintén az akarmi mappából include-olja be.

 

remélem érthetõen írtam le :)

Posted

Persze, de szemlátomást mégsem /xy-nal adod meg a hivatkozást, amit arpsoft kérdezett... Végül is részletkérdés, ha nem működik. Milyen hibát dob?

Posted

Semmilyent.. egyszerûen nem hozza be az oldalt hanem a default (main.php) oldalt hívja be.

 

De amikor ezt:

if(!isset($_GET['d'])) $_GET['d']="xy";
  if(is_file("pages/akarmi/".$_GET['d'].".php")){
    include("pages/akarmi/".$_GET['d'].".php");
  }

 

Átírom erre:

if(!isset($_GET['d'])) {
    $_GET['d']="xy";

    include("akarmi/".$_GET['d'].".php");
  }

 

Akkor mûködik.

Posted

Az is_file() hamisat ad vissza, mert nem mûködik relatív hivatkozással. Kérdezd le a DOCUMENT_ROOT-ot, és azzal konkratenáld össze jól (szeparátorok) az átadott paramétert, és utána ellenõrizd.

Posted

Eredmény:E:\web\xy

 

Ok.. már csak azt nem értem.. hogy egy mappával beljebb miért mûködött?

 

Ekkora különbség van hogy gyökérben használod vagy nem?

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...