parseGETintoString PHP függvény

Írta: | 2008. február 27. | kategóriák: Blogolok, PHP, Web

Hosszabb kimaradás után ismét van egy kevés időm, amikor a WebPillangóval is tudok foglalkozni. Sajnálom, a kissebb-nagyobb szüneteket, nem szánédkosak. A bejegyzés azért született, mert ismét azon találtam magam, hogy dinamikusan ki kell cseréljek egy vagy több változót a _GET szuperglobális tömbben. A mellékelt függvény kicseréli és kiírja a kívánt eredményt. Az első paraméterben azt adjuk meg, hogy melyik változót szeretnénk cserélni a második paraméter értékére. Mindkét bemeneti változó lehet karakterlánc, de az első mindenképpen az kell legyen. Amennyiben az első paraméter üres, a függvény listázza a formázott modosítatlan _GET tömböt. Ha nem létezik a helyettesítésre szoruló változó, akkor azt a _GET tömb utolsó elemeként beszúrja a függvény a paraméterként átadott értékkel.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
< ?php
function parseGETintoString($variable, $newValue){
  if ( empty($_GET) ) return; // ha nincsenek elemei a _GETnek, nem fut tovább a függvény
 
  $isFirstVar = true; // segédváltozó
  $wasChanged = false; // segédváltozó
 
  foreach( $_GET as $var => $varVal){
    if ($isFirstVar){ // csatolási operátor teszt
      echo "?";
      $isFirstVar = false;
    }else{
      echo "&amp;";
    }
 
    echo $var."=";
 
    if ( strcmp($var, $variable) == 0 ){ // cserélésre szoruló változó teszt
      echo $newValue;
      $wasChanged = true;
    }else{
      echo $varVal;
    }
  }
 
  if ( !empty($variable) && !$wasChanged  ){ // ha a változó nem szerepel, de meg van határozva
    echo "&amp;".$variable."=".$newValue;
  }
}
?>

Köszönöm BlackYnek a második változatot:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
< ?php
  function parseGETintostring(Array $newData, $fullUrl = false) {
    static $urlParts = array();
 
    if(!$urlParts) {
      $urlParts = parse_url($_SERVER['REQUEST_URI']);
    }
 
    $params = array_merge($_GET, $newData);
    $string = '';
 
    foreach($params as $field => $value) {
      $string .= $field . '=' . htmlentities(urlencode($value));
      $string .= "&amp;";
    }
 
    $string = '?' . substr($string, 0, strlen($string) - 5); /* Levágjuk a végérol az utolsó &amp;-ot */
 
    if($fullUrl) {
      return $urlParts['path'] . $string;
    } else {
      return $string;
    }
  }
?>


Értékeld a bejegyzést!

Loading ... Loading ...

A bejegyzésre érkező kommenteket elérheted RSS 2.0 formájában vagy emailben is:

A bejegyzéshez tartozó trackback cím, illetve a permalink.

A megjegyzéseket kérlek, tedd fel érthető és illendő módon, ne fikázz le másokat, mert nem tudnak valamit, amit te már igen. A kommentár lehetőleg függjön a bejegyzéshez :)

kötelező
kötelező, titok marad
ha nincs, maradjon üres



Szvsz. jobb lenne, ha stringet adna vissza a közvetlen kiírás helyett. Továbbá ha inkább tömb paramétert várna (így aztán a végleges tömböt egy sima array_merge($_GET, $ujtomb)-el állíthazná elő…). Általánosabb célú lenne.

BlackY

BlackY 2008. február 27. - 22:16

Teljesen egyet értek veled. Hogy ne kiírja, hanem egy karakterláncként visszaadja az eredményt, csupán egy parányi átalakítást igényel. Arra, hogy tömbök legyenek a bemenetek valójában gondoltam, de mivel én ezt a kódot használtam és időm sem igen akadt átírni (a kommenteket leszámítva), nem valósult meg az ötlet. Az array_merge() nem jutott eszembe 🙂
Ha esetleg van időd/kedved megírni az elképzelt kódot, szívesen látnám az oldalon 🙂

Avatar Tupacko
2008. február 27.
23:43

A 2. kód nem jó.
Kipróbáltam erre a tömbre:
$a = array(“egy”=>”1″,”ketto”=>”2″,”otvenegy”=>”51”);

/tupacko.php?egy=1&ketto=2&otveneg

Ezt a részt:
$string = ‘?’ . substr($string, 0, strlen($string) – 5);

Átírnám erre:

$string = ‘?’ . substr($string, 0, -1);

És már megy is rendesen 🙂

skera 2008. február 28. - 12:25

Jó volt az eredetileg is, csak a wordpress csúnya, gonosz és buta 🙂 és az _andjel_amp; szöveget kicserélte _andjel_-re. (És mivel úgy szabványos, ne a substr-inget paraméterezd át, inkább a $string .= ‘_andjel_’; sort javítsd $string .= ‘_andjel_amp;’; -ra.

BlackY

BlackY 2008. február 28. - 14:11

Kijavítottam, nem vettem észre, hogy átcserlélte &-re(inkább az aposztrófokkal volt gondja … első módosításkor rengeteg kérdőjel jelent meg helyette).

Avatar Tupacko
2008. február 28.
15:15

És tulajdonképpen ez a script mire is jó? Azt értem mit csinál..De mikor hasznos?

Logan 2008. március 1. - 12:15

Vannak esetek, hogy megakarsz valtoztatni egy erteket a _GET tombben, pl. oldallapozaskor, de dinamikusan kell tenned azt, mert pl. egy form gettel kuldi le az ertekeket es azok nem szabad elvesszenek lapozaskor.

Avatar Tupacko
2008. március 1.
22:22

Ezt a kódot használom, oldalváltó/lapozó linkek generálásához, egy vendégkönyvben.
Nálam az a hiba jelentkezik ha esetleg valaki átírja a címsorban szereplő értéket mondjuk erre( hülye júzer mért ne tenné?):

http://localhost/vendegkonyv.php?cmd=list&page=http://

Ezt a hibaüzenetet generálja:

Warning: parse_url(/vendegkonyv.php?cmd=list&page=http://) [function.parse-url]: Unable to parse URL in C:\Program Files\EasyPHP 2.0b1\www\HOHH.org\inc\functions.php on line 49

Valószínűsítem hogy ezzel a sorral van a gondja:

$urlParts = parse_url($_SERVER[‘REQUEST_URI’]);

A probléma megoldásán gondolkozom, addigis gondoltam jobb ha szólok.

scripter-man 2008. július 2. - 02:16

Sajnos ez a PHP hibaja. A kovetkezo linken bovebben olvashatsz a problema alakulasarol: bugs.php.net/bug.php?id=38143

Avatar Tupacko
2008. július 2.
11:06

Helló!

Először is köszönöm a gyors választ, másodszor pedig megmutatnám, hogy sikerült kiküszöbölnöm a problémát. Sikerült elhárítanom a hibaüzenet megjelenítését, egy borzasztó egyszerű módszerrel. 🙂 Mégpedig úgy, hogy mivel jelen esetben a $_GET[‘page’ ]változó értékeként csak pozitív egész szám típusú inputot várok, csak ilyet fogadok el a változóból.
Ellenkező esetben teszek róla hogy ilyen típus érkezzen.

if ( !isset( $_GET[‘page’] ) && empty( $_GET[‘page’] ) ) {
$_GET[‘page’] = 1;
} else {
if ( (!ctype_digit( $_GET[‘page’] ) ) || $_GET[‘page’] <= 0 ){
$_GET[‘page’] = 1;
}
}

scripter-man 2008. július 2. - 19:09

Igen, ez egy megoldas a te specifikus problemadra 🙂 Sajnos a hibat a PHPban kellene kivedni, hogy a parse_url() ne zavarodjon meg, ha http protokolt talal a parameterek kozt, viszont ezt mar csak a fejlesztok tehetik meg 😀
Koszonom, hogy leirtad a megoldast. Ha esetleg valaki ugyan ebbe vagy hasonlo nehezsegbe utkozik, lesz ahova fordulnia:)

Avatar Tupacko
2008. július 4.
11:17

Üdv!

Nekem olyan kérdésem lenne hogy akkor mi a megoldás ha “szép url-t” használok pl.: oldalam.hu/tartalom. és mondjuk ajaxal lapozok akkor hogy tudom kiegészíteni hogy /oldal/1 Előre is köszi

Török Zsolt 2009. január 31. - 01:25

Ahoz ez a függvény nem működik. Más a logikája az egésznek, mivel az AJAX csak egy bizonyos részét cseréli ki az oldalnak, tehát csak egy részkérés megy a szerverhez.
Egy megoldás lehet a következő:
JavaScripttel kicseréled az URL, ilyenre:
oldalam.hu/tartalom#1

oldalam.hu/tartalom#999…

AJAXszal elkuldod a kerest a szervernek, hogy adja vissza neked az Xedik oldalon megjelenitendo tartalmat.

Amikor pl mar bele vagy lapozva a húszadik oldalra, akkor mielőtt megváltoztatnád az URLt egyszer le kell kérd, hogy hanyadik lapon vagy (az URLbol levágod egy string művelettel) és ahoz hozza kell adj egyet, majd az új értékkel felülírod az URLt és lekéred az új oldal tartalmát.

FIGYELJ! Nagyon figyelj arra, hogy az oldal elerese es az oldalszamok kozt legyen #jel, mert hanem amikor megvaltoztatod az URLt, akkor automatikusan ujratoltodik az uj oldal. Ha hasznalod a #jelt, akkor a bongeszo azt erti belole, hogy az oldalam.hu/tartalom oldal egy olyan reszet akarod megjeleniteni, ami az oldalon belol egy 1, 2, vagy ahanyadik oldalon vagy helyen talalhato. Ha tobbet akarsz tudni a #-rol, akkor olvass utana az A NAME strukturanak (HTML, linkek, anchor neven hamar ratalalsz).

Kérlek, ha további kérdésed van, látogass el a fórumra 🙂

Sok sikert!

Avatar Tupacko
2009. január 31.
12:50