ugrás a tartalomhoz

Dinamikus HTML-űrlap tömbváltozó-generálás PHP-ban

Pi-Tec · 2008. Május. 7. (Sze), 10.52
Ü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:
  1. if($fh=fopen("marka.ab","r")){  
  2.   $arr=array();  
  3.   while(!feof($fh)){  
  4.     $arr[]=fgets($fh,4096);  
  5.     //beolvassa a fájl rekordjait a tömbbe  
  6.   }  
  7.   for($i=count($arr);$i>0;$i--){  
  8.     echo " <tr> <td> <input type='text' name='t[$i]' value='$arr[$i]' /> $arr[$i] </td> <td>";  
  9.     //eredeti szöveggel feltöltött mező  
  10.     echo "<img src='/logo/$i.jpg' /><input type='file' name='f[$i]' /> </td> </tr>";  
  11.     //kép, mellette upload felület  
  12.   }  
  13.   fclose($fh);  
  14. else {  
  15.   echo " <tr> <td> Az adatbázis nem olvasható. Nem létezik, vagy le van tiltva az elérés. </td> </tr>";  
  16. };  
<tr>
<td>
Új márka: <?php
  1. echo "<input type='text' name='";  
  2. if(isset($arr)){  
  3.   $i=count($arr);  
  4.   echo "t[$i]";  
  5. else {  
  6.   echo "f[0]";  
  7. }  
  8. echo "' />";  
?>
</td>
<td>
Logó: <?php
  1. echo "<input type='file' name='";  
  2. if(isset($arr)){  
  3.   $i=count($arr);  
  4.   echo "f[$i]";  
  5. else {  
  6.   echo "f[0]";  
  7. }  
  8. echo "' />";  
?>
</td>
</tr>

Adatmódosítás (képtől független):
  1. if (isset($_POST["pwd"])){  
  2. //HA VAN "t": (mondjuk mindig van változás, hülye vagyok - ez egy fölös ellenőrzés :D)  
  3. if (isset($_POST["t"])) {  
  4.   // FELÜLÍRJA AZ ADATBÁZIST  
  5.   if($fh=fopen("marka.ab","w")){  
  6.     fwrite($fh,$_POST["t"][0]);  
  7.     for($i=1;$i<count($_POST["t"]);$i++){  
  8.       $str="\n".$_POST["t"][$i];  
  9.       fwrite($fh,$str);  
  10.     }  
  11.     fclose($fh);  
  12.     echo "Adatbázis módosítva.";  
  13.   } else {  
  14.     //NEM ÍRHATÓ  
  15.     echo "Az adatbázis nem hozzáférhető.";  
  16.   }  
  17. }  
Képfeltöltés (adatfüggetlen):
  1. if(isset($_FILES["f"])){  
  2.   for($i=0;$i<count($_FILES["f"]);$i++){  
  3.     if(isset($_FILES["f"]["name"][$i])){  
  4.       $str=$_FILES["f"]["name"][$i];  
  5.       if($_FILES["f"]["type"][$i]=='image/jpeg'){  
  6.         $userftype = ".jpg";  
  7.       } else if($_FILES["f"]["type"][$i]=='image/pjpeg'){  
  8.        $userftype = ".jpg";  
  9.       } else if($_FILES["f"]["type"][$i]=='image/JPG'){  
  10.         $userftype = ".jpg";  
  11.       } else {  
  12.         $userftype = "FAIL";  
  13.       }  
  14.       if($userftype != "FAIL"){  
  15.         $uploaddir = "/logo/";  
  16.         $uploadfile = $uploaddir . basename($i . $userftype);  
  17.         if (move_uploaded_file($_FILES["f"]["tmp_name"][$i], $uploadfile)) {  
  18.           echo "A kép ($str) feltöltése sikeres.";  
  19.         } else {  
  20.           echo "A kép ($str) feltöltése sikertelen!";  
  21.         }  
  22.       } else {  
  23.         echo "A kép ($str) rossz formátumú, nem került feltöltésre!";  
  24.       }   
  25.     } //ha nincs fájlnév, csendben átugorja  
  26.   }  
  27. };  
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! ;)
 
1

Itt az elözö téma..

Ronyn · 2008. Május. 7. (Sze), 14.12
bol szedett kód javitott változata...
Szerintem többet nézegesd a forráskódot,és akkor talán Neked is feltünt volna néhány hiba...
  1. <html>    
  2.   <body><form enctype="multipart/form-data" action='a_ujmarka.php' method='post'>    
  3.     <?php    
  4.       //EZ ITT A $_POST és $_FILES DEBUG INFÓJA    
  5.       print_r($_POST);    
  6.       print_r($_FILES);    
  7.     ?>    
  8.     <table width='600' border='2'>    
  9.       <tr>    
  10.         <td colspan='2'>    
  11.           <a href='a_szerk.php' method='post'><img width='64' height='64' title='Karbantartás' alt='Karbantartás' border='0' src='lista.jpg' /></a>    
  12.           <a href='a_ujtermek.php' method='post'><img width='64' height='64' title='Új termék' alt='Új termék' border='0' src='taska.jpg' /></a>    
  13.           <a href='a_ujcsalad.php' method='post'><img width='64' height='64' title='Új család' alt='Új család' border='0' src='csalad.jpg' /></a>    
  14.           <a href='a_ujtipus.php' method='post'><img width='64' height='64' title='Új kategória' alt='Új kategória' border='0' src='tervrajz.jpg' /></a>    
  15.           <a href='a_ujmarka.php' method='post'><img width='64' height='64' title='Új márka' alt='Új márka' border='0' src='marka.jpg' /></a>    
  16.           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;    
  17.           <a href='a_letolt.php' method='post'><img width='64' height='64' title='Feketedoboz mentése' alt='Feketedoboz mentése' border='0' src='dobozle.jpg' /></a>    
  18.           <a href='a_feltolt.php' method='post'><img width='64' height='64' title='Feketedoboz betöltése' alt='Feketedoboz betöltése' border='0' src='dobozfel.jpg' /></a>    
  19.         </td>    
  20.       </tr>    
  21.       <tr>    
  22.         <td colspan='2'>    
  23.           <h2>Új márka</h2>    
  24.           <p>Itt új márkát vihetsz fel, vagy írhatod át a már meglévőket. A feltett képek csak .jpg formátumúak lehetnek.</p>    
  25.             <font color='red'><b>    
  26.               <?php    
  27.                 //VIZSGÁLJA A JELSZÓT    
  28.                 if(isset($_POST["pwd"]) && $_POST["pwd"]!="teszt"){    
  29.                   //HIBÁS    
  30.                   echo "A jelszó hibás!";    
  31.                 } else if (isset($_POST["pwd"])){    
  32.                   //HELYES, HA VAN ÚJ:    
  33.                   if (isset($_POST["t"])) {    
  34.                     // FELÜLÍRJA AZ ADATBÁZIST    
  35.                     if($fh=##kukac##fopen("marka.ab","w")){    
  36.                       for($i=0;$i<count($_POST["t"]);$i++){    
  37.                       if(!emptyempty($_POST["t"][$i])){  
  38.                         $str=$_POST["t"][$i]."\n";  
  39.                         fwrite($fh,$str);  }  
  40.                         echo "x";    
  41.                       }    
  42.                       fclose($fh);    
  43.                       echo "Adatbázis módosítva.";    
  44.                     } else {    
  45.                       //NEM ÍRHATÓ    
  46.                       echo "Az adatbázis nem hozzáférhető.";    
  47.                     }    
  48.                   }    
  49.                   //KÉPEK FELTÖLTÉSE    
  50.                   if(isset($_FILES["f"])){    
  51.                     for($i=0;$i<count($_FILES["f"]["name"]);$i++){  
  52.                       if(!emptyempty($_FILES["f"]["name"][$i])){  
  53.                         $str=$_FILES["f"]["name"][$i];    
  54.                         if($_FILES["f"]["type"][$i]=='image/jpeg'){  
  55.                           $userftype = ".jpg";    
  56.                         } else if($_FILES["f"]["type"][$i]=='image/pjpeg'){    
  57.                             $userftype = ".jpg";    
  58.                         } else if($_FILES["f"]["type"][$i]=='image/JPG'){    
  59.                           $userftype = ".jpg";    
  60.                         } else {    
  61.                           $userftype = "FAIL";    
  62.                         }    
  63.                         if($userftype != "FAIL"){    
  64.                           $uploaddir = "./logo/";    
  65.                           $uploadfile = $uploaddir . basename($i . $userftype);    
  66.                           if (move_uploaded_file($_FILES["f"]["tmp_name"][$i], $uploadfile)) {    
  67.                             echo "A kép ($str) feltöltése sikeres.";    
  68.                           } else {    
  69.                             echo "A kép ($str) feltöltése sikertelen!";    
  70.                           }    
  71.                         } else {    
  72.                           echo "A kép ($str) rossz formátumú, nem került feltöltésre!";    
  73.                         }     
  74.                       } //ha nincs fájlnév, csendben átugorja    
  75.                     }    
  76.                   };    
  77.                 }    
  78.                 unset($_POST);    
  79.                 unset($_FILES);    
  80.               ?>    
  81.             </b></font>    
  82.         </td>    
  83.       </tr>    
  84.       <tr>    
  85.         <td>    
  86.           <b>Márkanév</b>    
  87.         </td>    
  88.         <td>    
  89.           <b>Logó</b>    
  90.         </td>    
  91.       </tr>    
  92.             <?php    
  93.               if(file_exists("marka.ab")){    
  94.                  
  95.                 $arr=file("marka.ab");  
  96.                 for($i=(count($arr)-1);$i>=0;$i--){  
  97.                   echo " <tr> <td> <input type='text' name='t[$i]' value='$arr[$i]' /> $arr[$i] </td> <td>";    
  98.                   echo "<img src='/logo/$i.jpg' /><input type='file' name='f[$i]'/> </td> </tr>\n\n";   
  99.                 }    
  100.               } else {    
  101.                 echo " <tr> <td> Az adatbázis nem olvasható. Nem létezik, vagy le van tiltva az elérés. </td> </tr>";    
  102.               };    
  103.             ?>    
  104.       <tr>    
  105.         <td>    
  106.             Új márka: <?php    
  107.               echo "<input type='text' name='";    
  108.               if(count($arr)>0){    
  109.                 $i=count($arr);    
  110.                 echo "t[$i]";    
  111.               } else {    
  112.                 echo "t[0]";    
  113.               }    
  114.               echo "' />";    
  115.             ?>    
  116.         </td>    
  117.         <td>    
  118.             Logó: <?php    
  119.               echo "<input type='file' name='";    
  120.               if(count($arr)>0){    
  121.                 $i=count($arr);    
  122.                 echo "f[$i]";    
  123.               } else {    
  124.                 echo "f[0]";    
  125.               }    
  126.               echo "' />";    
  127.             ?>    
  128.         </td>    
  129.       </tr>    
  130.       <tr>    
  131.         <td colspan='2'>   
  132.             Jelszó: <input type='password' name='pwd'/><input type='submit' value='Mehet!' />    
  133.         </td>    
  134.       </tr>    
  135.     </table></form>    
  136.   </body>    
  137. </html>    
Hasonlitsd össze a sajátoddal,és ha valahol nem érted a módositás okát,kérdezz.
2

Köszönöm a segítséget!

Pi-Tec · 2008. Május. 7. (Sze), 18.30
Kösszeh! Már komolyan falra mársztam ettől a hülye űrlaptól...

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! =*
3

Hmm.))

Ronyn · 2008. Május. 7. (Sze), 20.47
Hmm,itt korántsem folyamatot "könnyitö" módositásokról van szó,hanem arról hogy egyáltalán müködöképes legyen az a folyamat...))):D
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)))