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)))