Dinamikus HTML-űrlap tömbváltozó-generálás PHP-ban
Üdv mindenki, kösz, hogy benéztetek!
Már indítottam egy ilyen jellegű témát, csak túl szétszórtra sikeredett. A problémám, hogy egy felhasználóbarát admin-felületen szeretnék tetszőleges mennyiségű input-mezőt létrehozni, melyet az oldal Submit után önmagának POST-ol.
A lényeg az lenne, hogy egy szövegfájlból beolvas a PHP egy adattömböt, és ennek alapján generál egy <TABLE>-t, amiben <INPUT name='szoveg[#]' type='text' value='azelozoszoveg'> és <INPUT name='kep[#]' type='file'> mezők vannak.
A pikantériája a dolognak, hogy fordított sorrendben kell kiírásra kerüljenek, ezért nem használhatom a szoveg[] és kep[] változóneveket, és csökkenő for() ciklust kell alkalmazzak, miután kigyűjtöttem az adatokat.
A szövegeket tartalmazó fájl és a képeket tartalmazó mappák engedélyei be vannak állítva.
A HIBA ott kezdődik, hogy írni kéne a fájlokba, meg feltölteni a képeket. Az adatbázist üressel írja felül, a képet pedig nem hajlandó feltenni.
Ahogy leellenőriztem a $_POST-ot és a $_FILES-t kiderült, hogy a tömbváltozókból csak a legutolsó megy át.
A kapcsolódó kódrészletek:
Kiírás: <tr>
<td>
Új márka: <?php ?>
</td>
<td>
Logó: <?php ?>
</td>
</tr>
Adatmódosítás (képtől független):Képfeltöltés (adatfüggetlen):Ezt követően unsettelem a $_POST és $_FILES változókat, hogy ne legyen jelszó és adat-újraküldés. A kiírás csak EZ UTÁN történik meg. (Működik ez? Vagy van valami jobb, de egyszerű?)
Szóval, a probléma adott, csak az utolsó listaelemet hajlandó betárazni a POST változóba... (igaz, csak egysoros az adatbázis, lehet, hogy csak az elsővel nem megy)
A segítségeteket előre is köszönöm, a kódot meg implementáljátok egészséggel! ;)
■ Már indítottam egy ilyen jellegű témát, csak túl szétszórtra sikeredett. A problémám, hogy egy felhasználóbarát admin-felületen szeretnék tetszőleges mennyiségű input-mezőt létrehozni, melyet az oldal Submit után önmagának POST-ol.
A lényeg az lenne, hogy egy szövegfájlból beolvas a PHP egy adattömböt, és ennek alapján generál egy <TABLE>-t, amiben <INPUT name='szoveg[#]' type='text' value='azelozoszoveg'> és <INPUT name='kep[#]' type='file'> mezők vannak.
A pikantériája a dolognak, hogy fordított sorrendben kell kiírásra kerüljenek, ezért nem használhatom a szoveg[] és kep[] változóneveket, és csökkenő for() ciklust kell alkalmazzak, miután kigyűjtöttem az adatokat.
A szövegeket tartalmazó fájl és a képeket tartalmazó mappák engedélyei be vannak állítva.
A HIBA ott kezdődik, hogy írni kéne a fájlokba, meg feltölteni a képeket. Az adatbázist üressel írja felül, a képet pedig nem hajlandó feltenni.
Ahogy leellenőriztem a $_POST-ot és a $_FILES-t kiderült, hogy a tömbváltozókból csak a legutolsó megy át.
A kapcsolódó kódrészletek:
Kiírás:
- if($fh=fopen("marka.ab","r")){
- $arr=array();
- while(!feof($fh)){
- $arr[]=fgets($fh,4096);
- //beolvassa a fájl rekordjait a tömbbe
- }
- for($i=count($arr);$i>0;$i--){
- echo " <tr> <td> <input type='text' name='t[$i]' value='$arr[$i]' /> $arr[$i] </td> <td>";
- //eredeti szöveggel feltöltött mező
- echo "<img src='/logo/$i.jpg' /><input type='file' name='f[$i]' /> </td> </tr>";
- //kép, mellette upload felület
- }
- fclose($fh);
- } else {
- echo " <tr> <td> Az adatbázis nem olvasható. Nem létezik, vagy le van tiltva az elérés. </td> </tr>";
- };
<td>
Új márka: <?php
- echo "<input type='text' name='";
- if(isset($arr)){
- $i=count($arr);
- echo "t[$i]";
- } else {
- echo "f[0]";
- }
- echo "' />";
</td>
<td>
Logó: <?php
- echo "<input type='file' name='";
- if(isset($arr)){
- $i=count($arr);
- echo "f[$i]";
- } else {
- echo "f[0]";
- }
- echo "' />";
</td>
</tr>
Adatmódosítás (képtől független):
- if (isset($_POST["pwd"])){
- //HA VAN "t": (mondjuk mindig van változás, hülye vagyok - ez egy fölös ellenőrzés :D)
- if (isset($_POST["t"])) {
- // FELÜLÍRJA AZ ADATBÁZIST
- if($fh=fopen("marka.ab","w")){
- fwrite($fh,$_POST["t"][0]);
- for($i=1;$i<count($_POST["t"]);$i++){
- $str="\n".$_POST["t"][$i];
- fwrite($fh,$str);
- }
- fclose($fh);
- echo "Adatbázis módosítva.";
- } else {
- //NEM ÍRHATÓ
- echo "Az adatbázis nem hozzáférhető.";
- }
- }
- if(isset($_FILES["f"])){
- for($i=0;$i<count($_FILES["f"]);$i++){
- if(isset($_FILES["f"]["name"][$i])){
- $str=$_FILES["f"]["name"][$i];
- if($_FILES["f"]["type"][$i]=='image/jpeg'){
- $userftype = ".jpg";
- } else if($_FILES["f"]["type"][$i]=='image/pjpeg'){
- $userftype = ".jpg";
- } else if($_FILES["f"]["type"][$i]=='image/JPG'){
- $userftype = ".jpg";
- } else {
- $userftype = "FAIL";
- }
- if($userftype != "FAIL"){
- $uploaddir = "/logo/";
- $uploadfile = $uploaddir . basename($i . $userftype);
- if (move_uploaded_file($_FILES["f"]["tmp_name"][$i], $uploadfile)) {
- echo "A kép ($str) feltöltése sikeres.";
- } else {
- echo "A kép ($str) feltöltése sikertelen!";
- }
- } else {
- echo "A kép ($str) rossz formátumú, nem került feltöltésre!";
- }
- } //ha nincs fájlnév, csendben átugorja
- }
- };
Szóval, a probléma adott, csak az utolsó listaelemet hajlandó betárazni a POST változóba... (igaz, csak egysoros az adatbázis, lehet, hogy csak az elsővel nem megy)
A segítségeteket előre is köszönöm, a kódot meg implementáljátok egészséggel! ;)
Itt az elözö téma..
Szerintem többet nézegesd a forráskódot,és akkor talán Neked is feltünt volna néhány hiba...
Köszönöm a segítséget!
Az adatbázisnál az eszközölt (egyébként a folyamatot valóban könnyítő) módosítások jelen esetben azért kártékonyak lennének a végeredményre:
1. A rendszernek támogatni kell a névtelen (üres sor) márkákat.
2. Az felületnek nem szabad támogatni a márkatörlést. (mert akkor komolyabb, kapcsolatos adatbázis kell)
3. A fájl végére ez a ciklus berak egy üres sort. (fent már taglaltam, miért baj)
A képfeltöltésnél viszont az empty() nagyon jól jött (legutóbb egy éve használtam talán, amikor tanultam a nyelvet), és a file() is lerövidíti jópár sorral a kódot. Látszik, hogy nem bújtam eleget a PHP függvénytárat...
A "./logo/" meglepett, egy másik szerveren a feltöltő tökéletesen le tudta kezelni pont nélkül is... O_o
Még egyszer nagyon szépen köszönöm! =*
Hmm.))
Többek között a file() sem csak röviditési céllal került bele...
Sebaj,elötted s lehetöség fejleszteni)))