Autor Zpráva
Sabracon
Profil
Ahoj,
potřeboval bych poradit, jak dál už jsem zoufalí a nemůžu na internetu najít uspokojující odpověď.
Nejdříve popíšu problém.

Mam přes cyklus výpis tabulek z mysql kde jsou výrobci a v nich jejich polozky. Vypisují se mi položky, kde u každé je checkbox a možnost zvolit si počet kusů. Po odeslání formuláře se vše zapíše do souboru.
Podařilo se mi rozběhat ten výběr položek a uložení do souboru na základě výrobce, ale celý večer nemůžu přijít nato, jak k tomu přilepit <input type=text value=mj>.

Jde mi o to, aby při odeslání vybraných položek se uložili i inputy kde jsem napsal počet kusu k vybrane polozce. Jde to vubec udelat ?

částečný kod formulare:

      $sklad = array ("Eden", "Franke", "Gelco", "Grohe", "Hansa", "Imagine", "Jika", "LB", "Lebon", "Weber", "Nimco", "Polysan", "Rol", "RolTechnik", "Ronal", "Santech", "SDK", "Voda");
      
     for($p = 0; $p < count($sklad); ++$p){ 
    print "<h3 onclick=zobrazSkryj('oddil_".$sklad[$p]."')>".$sklad[$p]."</h3> 
           <div id=oddil_".$sklad[$p]." class=skryvany>
              <br />
              
              <input type='hidden' name='vyrobce' value='".$sklad[$p]."'>";
            
          /////////////////////////////////////////////////////////////////////////////////////////////////////////    Sklady
                include "db.php";    
                   mysql_set_charset("utf8");
               $sql=MySQL_Query("SELECT * FROM $sklad[$p] LIMIT 0, 1000");
               
               print "<table border=1 frame=below rules=rows><tr><td>ID</td><td>Název</td><td>MJ</td><td>Nákupní cena</td><td>Cena bez DPH</td><td>Číslo katalogu</td></tr>";

                    while ($zaznam = MySQL_Fetch_Array($sql)){
                         $id=$zaznam['id'];
                 print "<tr><td><input type=hidden name=sklad value=$sklad[$p]><input type='checkbox' name='vybrat[".$zaznam['id']."]' value='1'></td><td>".$zaznam['popis']."</td><td><input type='text' name='mj[]' value='".$zaznam['mj']."' size='3'></td><td>".$zaznam['car_kod']."</td><td>".$zaznam['cena_bez']."</td><td>".$zaznam['id_kat']."</td></tr>";
   
                    
                    }
                   
                    
           
            
          
           print "</table>
      
            
                      
            <br />
            
                <br /> <br />
            <h3 onclick=zobrazSkryj('oddil_".$sklad[$p]."')>Skrýt obsah</h3>
             </form>
            
            </div>    
<br />   ";
       }
    

a tady je kod pro ulozeni:

$vyrobce = $_POST ['sklad'];

foreach($_POST['vybrat'] as $id => $vybrat)
                  {
             foreach($_POST['mj'] as $mj => $mjj){     
                  $sql = MySQL_Query("SELECT * FROM $vyrobce WHERE $vyrobce.id='$id'");
                    $zaznam = MySQL_Fetch_Array($sql);
                    
                  $soubor = fopen("../klienti/$slozka/$slozka.txt", "a+");
                  fwrite($soubor, $zaznam ['popis']."|".$mj."|");
                  fwrite($soubor, $zaznam ['cena_bez']."|\n");
                  fclose($soubor);
                       }
                   
                  }


Děkuji moc za pomoc. Třeba to bude primitivní a předpokládám,že ano :)
Taps
Profil
Sabracon:
nebude stačit jen ?
<?
   fwrite($soubor, $zaznam ['popis']."|".$mjj."|");
?>
Sabracon
Profil
Upravil jsem ještě řádek ve formuláři
print "<tr><td><input type=hidden name='sklad[".$zaznam['id']."]' value=$sklad[$p]><input type='checkbox' name='vybrat[".$zaznam['id']."][".$sklad[$p]."]' value='1'></td><td>".$zaznam['popis']."</td><td><input type='text' name='kusy[]' value='' size='3'></td><td>".$zaznam['car_kod']."</td><td>".$zaznam['cena_bez']."</td><td>".$zaznam['id_kat']."</td></tr>";
   

Kde vlastně posílám dvě pole sklad[".$zaznam['id']."] a 'vybrat[".$zaznam['id']."][".$sklad[$p]."]

A při zpracování dotazu takto:
foreach($_POST['vybrat'] as $id => $vybrat)

                  { 

           foreach($vybrat as $p => $pp)

           { 

                  foreach($_POST ['kusy'] as $mj => $mjj){

                       if(empty($mjj)){

                       }else{

                  $sql = MySQL_Query("SELECT * FROM $p WHERE $p.id='$id'");

                    $zaznam = MySQL_Fetch_Array($sql);

                  $soubor = fopen("../klienti/$slozka/$slozka.txt", "a+");

                  fwrite($soubor, $p."|".$zaznam ['popis']."|".$mjj."|");

                  fwrite($soubor, $zaznam ['cena_bez']."|\n");

                  fclose($soubor);

                 }

                  

              }          

                 }  

A tady jsem docílil toho, že mi do souboru při výběru třeba 3 položek uloží každou položku 3x a z počtem kusů jsem zadal 5,4,3, které jsem zadal.



A do souboru mi to zapíše takto:


Eden|AL 19 L-EDEN- závěsná horní skříňka||5 241,00|
Eden|AL 19 P-EDEN- závěsná horní skříňka||5 241,00|
Eden|AL 23-EDEN- zrcadlo v AL rámu||4 295,00|
Eden|AL 19 L-EDEN- závěsná horní skříňka|5|5 241,00|
Eden|AL 19 L-EDEN- závěsná horní skříňka|4|5 241,00|
Eden|AL 19 L-EDEN- závěsná horní skříňka|3|5 241,00|
Eden|AL 19 P-EDEN- závěsná horní skříňka|5|5 241,00|
Eden|AL 19 P-EDEN- závěsná horní skříňka|4|5 241,00|
Eden|AL 19 P-EDEN- závěsná horní skříňka|3|5 241,00|
Eden|AL 23-EDEN- zrcadlo v AL rámu|5|4 295,00|
Eden|AL 23-EDEN- zrcadlo v AL rámu|4|4 295,00|
Eden|AL 23-EDEN- zrcadlo v AL rámu|3|4 295,00|

Snad to popisuji správně. Jedná se mi o Vybrání položky z řádku, zadání počet kusu a správné zapsání do souboru, tak abych s tím mohl hned pracovat a vypisovat zboží s počtem kusů.

Děkuji moc za pomoc.
Sabracon
Profil
Popsal bych to ještě jednoduše jak bych si to představoval, aby to bylo lépe pohopitelné.


Soubor formular.php
<form action='uloz.php' method='post'>
Vyrobci

Srouby

<input type=hidden name='sklad[1]' value=Srouby> <input type='checkbox' name='vybrat[1][Srouby]' value='1'> srouby 15cm dlouhe , Zvolte pocet kusu<input type='text' name='kusy[]' value='' size='3'> Cena 15,- ks.
<input type=hidden name='sklad[2]' value=Srouby> <input type='checkbox' name='vybrat[2][Srouby]' value='1'> srouby 20cm dlouhe , Zvolte pocet kusu<input type='text' name='kusy[]' value='' size='3'> Cena 5,- ks.
<input type=hidden name='sklad[3]' value=Srouby> <input type='checkbox' name='vybrat[3][Srouby]' value='1'> srouby 30cm dlouhe , Zvolte pocet kusu<input type='text' name='kusy[]' value='' size='3'> Cena 20,- ks.

Hmozdenky

<input type=hidden name='sklad[1]' value=Hmozdenky> <input type='checkbox' name='vybrat[1][Hmozdenky]' value='1'> Hmozdenka mala , Zvolte pocet kusu<input type='text' name='kusy[]' value='' size='3'> Cena 2,- ks.
<input type=hidden name='sklad[2]' value=Hmozdenky> <input type='checkbox' name='vybrat[2][Hmozdenky]' value='1'>Hmozdenkadlouhe , Zvolte pocet kusu<input type='text' name='kusy[]' value='' size='3'> Cena 3,- ks.
<input type=hidden name='sklad[3]' value=Hmozdenky> <input type='checkbox' name='vybrat[3][Hmozdenky]' value='1'> Hmozdenka kotva , Zvolte pocet kusu<input type='text' name='kusy[]' value='' size='3'> Cena 4,- ks.

<input type=submit value=Vytvor nabidku>
</form>

A tady je soubor , kde se to zpracuje:
uloz.php
<?
foreach($_POST['vybrat'] as $id => $vybrat)
  { 
  foreach($vybrat as $p => $pp)
    { 
        foreach($_POST ['kusy'] as $mj => $mjj){
        
             if(empty($mjj)) {
 
                       }else{
 
                  $sql = MySQL_Query("SELECT * FROM $p WHERE $p.id='$id'"); //vyber skladu z mysql pomoci $p druhe pole v $_POST[vybrat]
 
                    $zaznam = MySQL_Fetch_Array($sql);
 
                  $soubor = fopen("../klienti/$slozka/$slozka.txt", "a+"); /// otevre a zapise zbozi
 
                  fwrite($soubor, $p."|".$zaznam ['popis']."|".$mjj."|"); /// melo by zapsat jen vyplneni input pro kusy
 
                  fwrite($soubor, $zaznam ['cena_bez']."|\n");  // cena a enter
 
                  fclose($soubor);
 
                 }
              }          
            }
            ?>
              


Ale stejně mi to nejde uloží to tam vícekrát. Nebo třeba nato jdu úplně špatně a je jiný způsob jak toho docílit.

Děkuji za pomoc
Taps
Profil
Sabracon:
ten nepořádek bude asi dělat ten dvojitý foreach.
Sabracon
Profil
Mě to do souboru ukládá duplicitně. Čili když zaškrtnu dvě políčka u šroubů po 5 a 10 ks, tak do souboru zapíše:

srouby 15cm dlouhe 5 ks
srouby 15cm dlouhe 10 ks
srouby 20cm dlouhe 5 ks
srouby 20cm dlouhe 10ks

a správně by to mělo být:

srouby 15cm dlouhe 5 ks
srouby 20cm dlouhe 10ks

čím více položek zaškrtnu tím více se to násobí.
Sabracon
Profil
Upravil jsem ještě kód pro výpis a dostal jsem se k tomu, že mi již neduplicituje položky, ale "už" jen napiše k položce cele pole s kusy.

Takže kód pro odeslání vypadá takto:
Pro jednoho výrobce a odmazal jsem promeny a nahradil čísly a jmény pro přehlednost
   <input type=hidden name='sklad[Eden]' value=Eden>

   <input type='checkbox' name='vybrat[1][Eden]' value='1'>

   <input type='text' name='kusy[]' value='' size='3'>
              


A zde je kod pro uložení a procházení pole, kde mam chybu a nevím jak to správně poskládat :(

<?
foreach($_POST['vybrat'] as $id => $vybrat)
   {
                     
    foreach($vybrat as $p => $pp)
    
  {
                  foreach($_POST ['kusy'] as $mj)
     
     {             
           
           if(isset($mj)){
                   
                     print $mj; // výpis počet kusu u položky , které jsou zadány
                 
                    }
                      }   

             $sql = MySQL_Query("SELECT * FROM $p WHERE $p.id='$id'");
               
                     $zaznam = MySQL_Fetch_Array($sql);     
               print $p." ".$zaznam ['popis']." ".$zaznam ['cena_bez']." ".$ks;   // výpis řádky položky
               print "<br />";
              
         }   
      
         } 
           ?>


A výstup tohoto kódu je :

65 Eden Název1 cena1
65 Eden Název2 cena2


kde 65, je u jedné položky jsem zadal do inputu 6 ks a u druhe 5 ks, Vím, že je problém v procházení pole s kusy, ale nedokážu ho přesvědčit aby procházel pole postupně a ne hned celé najednou a vypsal počet kusu správně ke každé položce.

Díky
Tori
Profil
Sabracon:
Poznámka k [#1]: include 'db.php' a nastavení znakové sady pro DB dejte ještě před začátek cyklu for, je zbytečné xkrát navazovat už existující spojení a měnit správné nastavení.

Lepší návrh DB by obsahoval tabulku výrobců, tabulku zboží (kde by každé mělo svoje jedinečné ID a ID výrobce), a tabulku parametrů zboží (tou by se vyřešilo, že u šroubů ukládáte jiné údaje než u vodovodních baterií, což asi teď řešíte těmi různými tabulkami podle výrobců). Při ukládání byste pak název výrobce zjistil z DB podle ID zboží.
Když to máte řešené takto, že zboží od různých výrobců může mít stejné ID, můžete využít pole výrobců a jeho klíče používat jako ID výrobce. Takže byste si generoval formulář např.:
while ($zaznam = MySQL_Fetch_Array($sql)) {
    // proměnná $p je klíč z pole výrobců, tedy ID výrobce
    $id=$zaznam['id'];
    print "<tr><td><input type='checkbox' name='zbozi[".$p."][".$zaznam['id']."][objednat]' value='1'></td><td>".$zaznam['popis']."</td>
        <td><input type='text' name='zbozi[".$p."][".$zaznam['id']."][kusu]' value='".$zaznam['mj']."' size='3'></td>
        <td>".$zaznam['car_kod']."</td>
        <td>".$zaznam['cena_bez']."</td>
        <td>".$zaznam['id_kat']."</td></tr>";
}
Tím dostanete každé objednané zboží + počet kusů na jedno místo:
foreach ($_POST['zbozi'] as $id_vyrobce => $pole) {
    foreach ($pole as $id_zbozi => $zbozi) {
        if ($zbozi['objednat']) {
            $pocet_kusu = $zbozi['kusu'];
            $nazev_vyrobce = isset($sklady[$id_vyrobce]) ? $sklady[$id_vyrobce] : 'Neznámý (špatné ID)';
            // tady máte k dispozici všechny potřebné údaje k jedné položce objednávky a můžete ji uložit.

        } elseif (!empty($zbozi['kusu'])) {
            // tady je vyplněný počet kusů, ale není zaškrtnuté zboží
        }
    }
}

Nepoužívala bych: <input type='text' name='kusy[]' value='' size='3'>, jak jste to upravil v [#7]. Když vám vyplním objednávku takhle:
[X] Šroub M6x30  Kusů: [____]
[X] Šroub M8x30  Kusů: [___5]
tak se vám uloží, že chci 5 kusů těch M6x30 a bude vám chybět počet kusů k M8x30, tedy přesně opačně, než jak jsem udělala chybu.
Sabracon
Profil
Děkuji mnohokrát již to funguje, tak jak jsem si představoval. Klaním se :)

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: