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:

              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>";
              };
<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ő.";
                    }
                  }
Képfeltöltés (adatfüggetlen):
                  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
                    }
                  };
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...

<html>  
  <body><form enctype="multipart/form-data" action='a_ujmarka.php' method='post'>  
    <?php  
      //EZ ITT A $_POST és $_FILES DEBUG INFÓJA  
      print_r($_POST);  
      print_r($_FILES);  
    ?>  
    <table width='600' border='2'>  
      <tr>  
        <td colspan='2'>  
          <a href='a_szerk.php' method='post'><img width='64' height='64' title='Karbantartás' alt='Karbantartás' border='0' src='lista.jpg' /></a>  
          <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>  
          <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>  
          <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>  
          <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>  
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  
          <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>  
          <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>  
        </td>  
      </tr>  
      <tr>  
        <td colspan='2'>  
          <h2>Új márka</h2>  
          <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>  
            <font color='red'><b>  
              <?php  
                //VIZSGÁLJA A JELSZÓT  
                if(isset($_POST["pwd"]) && $_POST["pwd"]!="teszt"){  
                  //HIBÁS  
                  echo "A jelszó hibás!";  
                } else if (isset($_POST["pwd"])){  
                  //HELYES, HA VAN ÚJ:  
                  if (isset($_POST["t"])) {  
                    // FELÜLÍRJA AZ ADATBÁZIST  
                    if($fh=##kukac##fopen("marka.ab","w")){  
                      for($i=0;$i<count($_POST["t"]);$i++){  
					  if(!empty($_POST["t"][$i])){
                        $str=$_POST["t"][$i]."\n";
                        fwrite($fh,$str);  }
                        echo "x";  
                      }  
                      fclose($fh);  
                      echo "Adatbázis módosítva.";  
                    } else {  
                      //NEM ÍRHATÓ  
                      echo "Az adatbázis nem hozzáférhető.";  
                    }  
                  }  
                  //KÉPEK FELTÖLTÉSE  
                  if(isset($_FILES["f"])){  
                    for($i=0;$i<count($_FILES["f"]["name"]);$i++){
                      if(!empty($_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  
                    }  
                  };  
                }  
                unset($_POST);  
                unset($_FILES);  
              ?>  
            </b></font>  
        </td>  
      </tr>  
      <tr>  
        <td>  
          <b>Márkanév</b>  
        </td>  
        <td>  
          <b>Logó</b>  
        </td>  
      </tr>  
            <?php  
              if(file_exists("marka.ab")){  
               
				$arr=file("marka.ab");
                for($i=(count($arr)-1);$i>=0;$i--){
                  echo " <tr> <td> <input type='text' name='t[$i]' value='$arr[$i]' /> $arr[$i] </td> <td>";  
                  echo "<img src='/logo/$i.jpg' /><input type='file' name='f[$i]'/> </td> </tr>\n\n"; 
                }  
              } else {  
                echo " <tr> <td> Az adatbázis nem olvasható. Nem létezik, vagy le van tiltva az elérés. </td> </tr>";  
              };  
            ?>  
      <tr>  
        <td>  
            Új márka: <?php  
              echo "<input type='text' name='";  
              if(count($arr)>0){  
                $i=count($arr);  
                echo "t[$i]";  
              } else {  
                echo "t[0]";  
              }  
              echo "' />";  
            ?>  
        </td>  
        <td>  
            Logó: <?php  
              echo "<input type='file' name='";  
              if(count($arr)>0){  
                $i=count($arr);  
                echo "f[$i]";  
              } else {  
                echo "f[0]";  
              }  
              echo "' />";  
            ?>  
        </td>  
      </tr>  
      <tr>  
        <td colspan='2'> 
            Jelszó: <input type='password' name='pwd'/><input type='submit' value='Mehet!' />  
        </td>  
      </tr>  
    </table></form>  
  </body>  
</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)))