Portál AbcLinuxu, 10. května 2025 08:08

Dotaz: PHP názov premennej v premennej...

23.12.2008 12:18 marallo | skóre: 4 | blog: marallo | Dubnica nad Vahom
PHP názov premennej v premennej...
Přečteno: 706×
Odpovědět | Admin

Dobrý deň, mám problém s ktorým si neviem rady.

Mám skript, kde je niekoľko premenných ($PREM1, $PREM2, $PREM3). A teraz potrebujem poslat názov tejto premennej cez $_GET["premenna"].

Asi je to dost nezrozumitelné, tak napíšem čo presne potrebujem.

Otvorím stranku: http://skript.php?premenna=$PREM1

 v skripte vyberiem premennu cez $_GET["premenna"], a zistím ci sa jej obsah rovná "1"

Niečo ako: if ($_GET["premenna"] == "1") {...}

 

Dúfam že ma aspoň niekto pochopí, asi je to divné riešenie, ale ináč si to neviem predstaviť, niesom profík, som iba samouk...

Dík za rady...

diakritiku neuznavam, a na chyby kaslem...
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

stativ avatar 23.12.2008 12:48 stativ | skóre: 54 | blog: SlaNé roury
Rozbalit Rozbalit vše Re: PHP názov premennej v premennej...
Odpovědět | | Sbalit | Link | Blokovat | Admin

Jednou jsem to také potřeboval, je to popsáno v jednom komentáři v dokumentaci. Bohužel je to dost prasácké, proto jsem se radši vydal jinou cestou.

Ať sežeru elfa i s chlupama!!! ljirkovsky.wordpress.com stativ.tk
stybla avatar 23.12.2008 13:53 stybla | skóre: 29 | Praha
Rozbalit Rozbalit vše Re: PHP názov premennej v premennej...
Odpovědět | | Sbalit | Link | Blokovat | Admin
rad bych pomohl, ale nepochopil jsem :-(
switch
nebo
if (isset($_GET['premenna']))
{
 $premenna = $_GET['premenna'];
 if ($premenna == $PREM1) { ... } 
 elseif ($premenna == $PREM2) { ...}
 ...
 else { ... }
}

ale je to porad switch-like. zkus se prosim vice rozepsat, treba i kus kodu. fakt moc nechapu v cem je problem :-/
stybla avatar 23.12.2008 13:56 stybla | skóre: 29 | Praha
Rozbalit Rozbalit vše Re: PHP názov premennej v premennej...
nebo skutecne v prohlizeci otevrit URL jako 'http://domain.tld/index.php?premenna=$PREM1' kde premenna bude obsahovat string '$PREM1'? fuj! :-s
stybla avatar 23.12.2008 14:34 stybla | skóre: 29 | Praha
Rozbalit Rozbalit vše Re: PHP názov premennej v premennej...

aha, opravdu nazev promenne. vazne to nejde jinak? par veci uz jsem napsal a zatim jsem se bez takoveho reseni obesel ... opravdu to nejde? :-) co napriklad pouzit switch a na zaklade hodnoty $promenna resp. $_GET['promenna'] vyvolat prislusne akce?
a jak uz jsem psal nize; pokud pouzivas promenne, tak to predelej. je to vec, ktera by mela byt vsude vypnuta a napr. v PHP6 bude odebrana (3x hura), v PHP5 je snad vypnuta v zakladni konfiguraci.
jeste doporucim pouzivat if (isset($_GET['promenna']) ... ) { ... }. vyhnes se tak chybe, kdyz nebude $promenna v $_GET nastavena. je samozrejme vhodne osetrit, jak se v takovem pripade zachovat.

stybla avatar 23.12.2008 14:34 stybla | skóre: 29 | Praha
Rozbalit Rozbalit vše Re: PHP názov premennej v premennej...
pokud pouzivas promenne
globalni promenne, samozrejme.
Tarmaq avatar 23.12.2008 14:13 Tarmaq | skóre: 39
Rozbalit Rozbalit vše Re: PHP názov premennej v premennej...
Odpovědět | | Sbalit | Link | Blokovat | Admin

taky dost dobre nechapu k cemu by to bylo dobre, posilat si nazev promenne a ne jeji hodnotu.. muzete to trochu popsat?

Don't panic!
23.12.2008 14:24 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: PHP názov premennej v premennej...
Odpovědět | | Sbalit | Link | Blokovat | Admin
$GLOBALS ???
stybla avatar 23.12.2008 14:26 stybla | skóre: 29 | Praha
Rozbalit Rozbalit vše Re: PHP názov premennej v premennej...
tak pokud se jedna o globalni promenne, doporucuji se obloukem vyhnout. kazdy rozumne nastaveny server ma vypnute (... opravdu kazdy? :-) )
23.12.2008 18:23 Sinuhet | skóre: 31
Rozbalit Rozbalit vše Re: PHP názov premennej v premennej...
Odpovědět | | Sbalit | Link | Blokovat | Admin
<?php

$prem1 = 10;
$prem2 = 20;
$prem3 = 30;

echo ${$_GET['premenna']};

// -> http://host/skript.php?premenna=prem1

?>

Ale neni prilis dobry napad umoznit uzivateli takto "nakukovat" (ci hure, zapisovat) prakticky do libovolne promenne. Jestli si nepisete nejaky debugovaci (ci jaky) nastroj ciste pro sebe, tak bych doporucoval pouzit zmineny switch (nebo lepe pole se jmeny validnich promennych) a striktne vymezit k jakym promenny lze takto pristupovat.

Josef Kufner avatar 23.12.2008 18:45 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: PHP názov premennej v premennej...
Odpovědět | | Sbalit | Link | Blokovat | Admin
Zkus ještě popsat účel, kterému má tvoje řešení sloužit. Tuším jednodušší a hezčí řešení na obzoru.
Hello world ! Segmentation fault (core dumped)
andrej.hrubsa avatar 24.12.2008 13:17 andrej.hrubsa | skóre: 8
Rozbalit Rozbalit vše Re: PHP názov premennej v premennej...

Akosi som nepochopil čo sa Marollo pýtal, ale tvoje riešenie by ma zaujímalo. Ako napísať napríklad automatické presmerovanie inak ako cez GET z adresy?

Napríklad toto:

header("location:http://".$_SERVER["SERVER_NAME"]."/subor.php?nazov_premennej=$hodnota_premennej")

Linux je pre tých čo sa chcú na počítači hrať. Pre tých čo musia žiaľ aj pracovať je tu len Windows :-(
stybla avatar 24.12.2008 14:31 stybla | skóre: 29 | Praha
Rozbalit Rozbalit vše Re: PHP názov premennej v premennej...
a na takovem reseni je neco spatneho? jinak muzes vyuzit napriklad $_POST ;)
andrej.hrubsa avatar 24.12.2008 15:08 andrej.hrubsa | skóre: 8
Rozbalit Rozbalit vše Re: PHP názov premennej v premennej...

Neviem ako. Prepíš moje location tak, aby v adrese nebola priamo uvedená premenná.

Linux je pre tých čo sa chcú na počítači hrať. Pre tých čo musia žiaľ aj pracovať je tu len Windows :-(
stybla avatar 24.12.2008 16:29 stybla | skóre: 29 | Praha
Rozbalit Rozbalit vše Re: PHP názov premennej v premennej...
Bud z formulare, ktery bude mit method="post", nebo pres HTTP header.
A stale nechapu, co se ti na $_GET nelibi. Posilat akce pres $_POST? GL & HF!
Josef Kufner avatar 24.12.2008 17:13 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: PHP názov premennej v premennej...
Pokud máš stránku na kterou někdo pošle GET a ty chceš tentýž GET předat na jinou, lze to udělat třeba takto:
$get_str = '';
$sep = '?';
foreach($_GET as $k => $v) {
  $get_str .= $sep.urlencode($k).'='.urlencode($v);
  $sep = '&';
}
header("Location: http://".$_SERVER['SERVER_NAME'].'/soubor.php'.$get_str);
Nebo třeba takto:
header('Location: http://".$_SERVER['SERVER_NAME'].'/soubor.php?'
    .join('&', array_map(sprintf,
            array_pad(array(), '%s=%s', count($_GET))
            array_map('urlencode', array_keys($_GET)),
            array_map('urlencode', $_GET))
     );
(Asi to bude trosku pomalejší než ten první kousek kódu, ale je to hezčí ;-))
Hello world ! Segmentation fault (core dumped)
Josef Kufner avatar 24.12.2008 17:15 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: PHP názov premennej v premennej...
A nebo ještě takto:
header('Location: http://".$_SERVER['SERVER_NAME'].'/soubor.php'
   .preg_replace('/^[^?]*/', '', $_SERVER['REQUEST_URI']));
Tenhle kousek je asi vůbec nejhezčí.
Hello world ! Segmentation fault (core dumped)
andrej.hrubsa avatar 24.12.2008 23:44 andrej.hrubsa | skóre: 8
Rozbalit Rozbalit vše Re: PHP názov premennej v premennej...

Ja v php nie som ešte celkom doma a preto nad mojím dotazom možno budete krútiť hlavou, ale kde je v tejto hlavičke nazov_premennej a hodnota_premennej?

Linux je pre tých čo sa chcú na počítači hrať. Pre tých čo musia žiaľ aj pracovať je tu len Windows :-(
Josef Kufner avatar 25.12.2008 02:57 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: PHP názov premennej v premennej...
Oni jsou trošku stydlivý, tak se schovali...
Hello world ! Segmentation fault (core dumped)
27.12.2008 22:23 Christof | skóre: 22 | Havířov
Rozbalit Rozbalit vše Re: PHP názov premennej v premennej...

A nebo ještě takto:

header('Location: http://".$_SERVER['SERVER_NAME'].'/soubor.php?'.$_SERVER['QUERY_STRING']);

Tenhle kousek je asi vůbec nejhezčí.

Tarmaq avatar 25.12.2008 12:14 Tarmaq | skóre: 39
Rozbalit Rozbalit vše Re: PHP názov premennej v premennej...
Odpovědět | | Sbalit | Link | Blokovat | Admin

ono by se docela hodilo, kdyby uz konecne reagoval marallo jakozto autor.. Takto nikdo nevime co vlastne chce ;] a jestli uz je s nejakym navrhnutym resenim spokojen..

Don't panic!
26.12.2008 23:02 marallo | skóre: 4 | blog: marallo | Dubnica nad Vahom
Rozbalit Rozbalit vše Re: PHP názov premennej v premennej...
Odpovědět | | Sbalit | Link | Blokovat | Admin

Ospravedlňujem sa že reagujem až teraz, ale viete, boli vianoce, stres, panika...

Takže vidím že ste moc nepochopili čo potrebujem, a niektore z vašich príspevkov som ani ja nepochopil.

Mám blog, v databáze v jednej tabuľke všetky zápisky. Tieto majú rôzne kategórie (linux, ženy, komunicticke_kecy, fasisticke_kecy). Pri písaní zápiskov označím do ktorých kategórii zápisok patrí. (môže patriť napríklad do kategórii zeny, a fasisticke_kecy). Takže v tabuľke v databázi mám pre každú kategóriu stĺpec, a ak je v ňom "1", tak zápisok patrí do tejto kategórie.

Mám spravený PHP kód že pre každý riadok tabuľky spraví niečo ako:

if ( $tag_linux == 1 ) {
echo vypíš článok;}

A ja teraz potrebujem z menu poslať to $tag_linux, aby skript vedel akú kategóriu ma vypísať. Zatial mám pre každú kategóriu inú stránku, ale to je na houby. Iné riešenie ma nenapadá. Dúfam že už je to jasnejšie...

Dík za dalšie rady...

diakritiku neuznavam, a na chyby kaslem...
vlastikroot avatar 26.12.2008 23:38 vlastikroot | skóre: 24 | blog: vlastikovo | Milevsko
Rozbalit Rozbalit vše Re: PHP názov premennej v premennej...
Blbe ty tabulky clenis .... udelej si jednu tabulku s ID primary klicem s auto increment a nazvem kategorie, a do tanulky s clankama dej jeden sloupec s ID kategorie. Pak pomoci vsech ruznych SQL selectu vyberes cokoliv chces.
We will destroys the Christian's legion ... and the cross, will be inverted
Josef Kufner avatar 27.12.2008 02:13 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: PHP názov premennej v premennej...
Doporučuju nastudovat alespoň základy o relačních databázích.

Tohle by bylo vhodné rozdělit do tří tabulek:
  1. clanky (id_clanky, nazev, datum, text): Tabulka s články, každý článek má jedinečné ID (primární klíč), obyčejný index nad sloupcem 'datum'
  2. kategorie (id_kategorie, nazev): Tabulka s kategoriemi, každá kategorie má jedinečné ID
  3. clanky_kategorie (id_kategorie, id_clanky): Tabulka s vazbami mezi články a kategoriemi (páry ID článku--ID kategorie), primární klíč bude přes oba sloupce
Seznam článků v kategorii získáš lehce:
SELECT c.*
FROM (clanky c, clanky_kategorie ck)
WHERE c.id_clanky = ck.id_clanky
   AND ck.id_kategorie = $id_kategorie
   AND c.datum < NOW()
ORDER BY c.datum DESC
Seznam všech článků s názvem jejich kategorií třeba takto:
SELECT c.*, GROUP_CONCAT(k.nazev SEPARATOR ', ') AS nazev_kategorie
FROM (clanky c, clanky_kategorie ck, kategorie k)
WHERE c.id_clanky = ck.id_clanky
   AND ck.id_kategorie = k.id_kategorie
   AND c.datum < NOW()
GROUP BY c.id_clanky
ORDER BY c.datum
Netestoval jsem to, ale mělo by to fungovat.
Hello world ! Segmentation fault (core dumped)
stativ avatar 27.12.2008 09:54 stativ | skóre: 54 | blog: SlaNé roury
Rozbalit Rozbalit vše Re: PHP názov premennej v premennej...

Mrkni se na první příspěvek (ten můj ;-) ), myslím, že je to opravdu to, co chceš. Ta funkce v odkazovaném komentáři vrátí jméno proměnné, která je mu předána. A to jméno pak můžeš vesele používat.

Příklad (definici té funkce sem psát nebudu);

$testovaci_promenna = "foo";
$jmeno = vname($testovaci_promenna);
echo $jmeno;

Vypíše "testovaci_promenna" (samozřejmě bez uvozovek).


Ať sežeru elfa i s chlupama!!! ljirkovsky.wordpress.com stativ.tk
andrej.hrubsa avatar 27.12.2008 12:52 andrej.hrubsa | skóre: 8
Rozbalit Rozbalit vše Re: PHP názov premennej v premennej...

Ako vidíš, je viacero riešení. Ja by som navrhoval len jednu tabuľku (id, článok, kategoria1, kategoria2, kategoria3...) a potom menu by bola priamo zadaná premenná ktorá by bola ako kľúč pre výber článkov z databázi. Podobné návody nájdeš v základných manuáloch.
A z menu daj odkaz napríklad <a href=subor.php?nazov_premennej=hodnota_premennej>. Hodnotu premennej v subor.php dostaneš cez GET.
V tvojom pripade:
$tag = $_GET["$hodnota_premennej"];
pripojenie databázy;
výber tabuľky;
výpis z tabuľky pre $tag == 1

Linux je pre tých čo sa chcú na počítači hrať. Pre tých čo musia žiaľ aj pracovať je tu len Windows :-(
27.12.2008 13:14 Zdeněk Burda | skóre: 61 | blog: Zdendův blog | Praha
Rozbalit Rozbalit vše Re: PHP názov premennej v premennej...

Když neumíš programovat/sql, neuč to o statní... Marallo - použij to co radí J.K., to je totiž funkční a použitelné řešení. Když budeš hledat informace o tom co to vlastně je, tak hledej SQL a vazba N:M.

-- Nezdar není hanbou, hanbou je strach z pokusu.
andrej.hrubsa avatar 27.12.2008 14:48 andrej.hrubsa | skóre: 8
Rozbalit Rozbalit vše Re: PHP názov premennej v premennej...

Možno to neviem, som len začiatočník, ale tak isto ako som to popísal tu, nájdeš aj v návodoch a manuáloch a z praxe viem, že to funguje :-)
A mimochodom Tarmaq v podstate napísal také isté riešenie. Takže nechcem dávať rozumy hlavám ako ty, ale najjednoduchšie riešenie býva najlepšie.

Linux je pre tých čo sa chcú na počítači hrať. Pre tých čo musia žiaľ aj pracovať je tu len Windows :-(
andrej.hrubsa avatar 27.12.2008 14:57 andrej.hrubsa | skóre: 8
Rozbalit Rozbalit vše Re: PHP názov premennej v premennej...

A este jedna pripomienka.

Marallo sa pýtal ako to tam dostať z menu, nie ako sa robí výpis z tabuľky.

Tri tabuľky ako píše JK sú OK, ale i tak by pre to čo požaduje Marollo postačovala jedna tabuľka. Veď chce len zopár stabilných kategórií. Netreba hneď robiť stránku ako internetový obchod. To je ako dávať do auta motor z tanku...

Linux je pre tých čo sa chcú na počítači hrať. Pre tých čo musia žiaľ aj pracovať je tu len Windows :-(
Toman avatar 27.12.2008 17:41 Toman | skóre: 29 | blog: Tomanův blog | Kostelec nad Orlicí
Rozbalit Rozbalit vše Re: PHP názov premennej v premennej...
Tak ale zase kdyz uz neco delam, tak to delam poradne, ono auto totiz zvladne jet taky jen treba na dva valce, tak proc do nej davat ctyri. Ale jednou, az za nim budes chtit tahnout vlek, tak se ti ctyri valce budou hodit. Proto je lepsi to udelat tedka poradne, nez pak pri nejakem budoucim rozsireni prekopavat pulku veci.
Tarmaq avatar 27.12.2008 13:26 Tarmaq | skóre: 39
Rozbalit Rozbalit vše Re: PHP názov premennej v premennej...

Tabulku mas udelanou spatne, jak tu psali ostatni (dobre to popsal josef Kufner).

Pokud presto chces zachovat stavajici schema, k reseni stejne nepotrebujes znat nazev promenne.. k cemu to je dobre nedokazu pochopit ani ted.
Ja bych to udelal nasledovne:

$nazev_kategorie = $_GET['cat'];
$q = db_query("SELECT * FROM clanky WHERE ".$nazev_sloupce." = 1");

Pokud nechces, aby uzivatel videl v url nazev sloupce, tak si muzes udelat nejake pole aliasu. Napr:

$categories = array(
  '1' => 'linux',
  '2' => 'zeny',
  '3' => 'kscm',
  '4' => 'ss'
);
$nazev_sloupce = $categories[$_GET['cat']];
$q = db_query("SELECT * FROM clanky WHERE ".$nazev_sloupce." = 1"); 

 Jak vidis, zadne ifovani netreba..

Don't panic!
27.12.2008 18:03 moira | skóre: 30 | blog: nesmysly
Rozbalit Rozbalit vše Re: PHP názov premennej v premennej...
Presne, nejlepsi rada jakou muzes dostat, je neresit "nazev promenne v promenne" ale cele to udelat jinak a lepe. Navrhu jak na to tady padlo dost, takze to nebudu zbytecne opakovat. Rozumim ze kdyz je clovek nezkuseny, tak ho obcas napadne pekna silenost, tak si snad vezmes rady od ostatnich k srdci a prekopes to :) Jinak se z toho stejne zblaznis, az bys to nejak rozsiroval.
Překladač ti nikdy neřekne: "budeme kamarádi"
Josef Kufner avatar 27.12.2008 18:17 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: PHP názov premennej v premennej...
Pokud se na to nevykašle, tak to překope tak jako tak. Otázkou je jen "kdy" a kolik ho to bude stát zbytečné dřiny navíc... Pečlivost při programování je vlastně jen důsledek lenosti.
Hello world ! Segmentation fault (core dumped)
Tarmaq avatar 27.12.2008 20:37 Tarmaq | skóre: 39
Rozbalit Rozbalit vše Re: PHP názov premennej v premennej...

jo jinak ted kdyz to po sobe ctu tak tam vidim chybku.. ten prvni radek ma byt samozrejme

$nazev_sloupce = $_GET['cat'];
Don't panic!
Josef Kufner avatar 27.12.2008 21:47 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: PHP názov premennej v premennej...
Také by se hodilo dodat, že pokud se někdo podívá na adresu kterou vypíše sprintf("...?cat=%s", urlencode("1 IN (SELECT SUM(LENGTH(c4.nazev)) FROM clanky c1 LEFT JOIN clanky c2 ON 1 = 1 LEFT JOIN clanky c3 ON 1 = 1 LEFT JOIN clanky c4 ON 1 = 1 GROUP BY c.nazev) OR 1")), tak bude mít tvůj server na nejbližších pár hodin o zábavu postaráno. Další možnosti si už bystrý čtenář domyslí sám ;-)
Hello world ! Segmentation fault (core dumped)
Tarmaq avatar 28.12.2008 00:07 Tarmaq | skóre: 39
Rozbalit Rozbalit vše Re: PHP názov premennej v premennej...

presne tak... ukazka byla jen nastrel. Moznosti zabezpeceni jsem v ni neresil - slo spis o nazorne reseni, jednoduche k pochopeni ;]

Don't panic!
7.1.2009 21:20 marallo | skóre: 4 | blog: marallo | Dubnica nad Vahom
Rozbalit Rozbalit vše Re: PHP názov premennej v premennej...

Díky moc, presne to som potreboval.

Už je to vyriešené, nevedel som že sa to dá spraviť tak jednoducho.

A pre všetkých: takáto tabuľka mi plne vyhovuje...

diakritiku neuznavam, a na chyby kaslem...

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.