[ Príspevkov: 12 ] 
AutorSpráva
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 30.09.07
Prihlásený: 30.11.11
Príspevky: 143
Témy: 37 | 37
NapísalOffline : 14.02.2011 10:37 | Multivstup

Nazdar programatori.

Snazim sa vyriesit problem multi vstupu.
Chcem aby, mi vytvorilo spravnu query, podla toho, kolko viacnasobnych vstupov(polí) obsahuje POST.
Na to vsak musim vytvorit spravny while, ktory sa sklada z listeningu vsetkych viacnasobnych vstupov, ktore POSTUJEM.

Tu je aktualny tvar funkcie:
Kód:
function multiSave($tabulka)
    {

        array_shift  ($_POST); //Odoberiem prvy nezelany prvok(meno konkretneho formulara )

foreach($_POST as $key => $value) { //Prechadzam postnute data
if (is_array($value))
$multiStlpce[] = $key;
else
if($key != "akcia") //Okrem tych, ktore nepotrebujem
{

 $nazvy[] = $key;
 $hodnoty[] = "'".$value."'";
 
}


 
$retazecNazvov = implode(",", $nazvy);
$retazecHodnot = implode(",", $hodnoty);


foreach($multiStlpce as $key => $value) {

$naListing[]  = 'list($key,$'.$value.')=each($_POST["'.$value.'"])';
}


$while = implode(" AND ", $naListing);
echo $while."<br /><br />";

      while($while)
    {
     Tu vyskladam spravny insert
     
    }


    }   


Skusal som to aj $while cez eval, ale dostavam tento eroro:
Kód:
Parse error: syntax error, unexpected $end in /var/www/rollyweb/praca.rollyweb.sk/framework/prihlaseny.php(482) : eval()'d code on line 1


A celkovo sa je vraj dobre evalu vyhnut. Ale tek zatial ma lepsie vseobecne riesenie, ktore mi vezme vsetky multivstupy a prisposobi listening nenapadlo.

Ak vas ano, sem s napadmi. :)

Prajem pekny den kazdemu.


Offline

Správca fóra
Správca fóra
Multivstup

Registrovaný: 27.07.07
Príspevky: 3971
Témy: 51 | 51
Bydlisko: Bratislava
Vek: 32
NapísalOffline : 14.02.2011 19:30 | Multivstup

velmi som nepochopil. co vlastne potrebujes vyriesit, nazornejsie by asi bolo, keby si uviedol nejaky konkretny priklad - obsah POSTu a co ma byt vysledok jeho spracovania


_________________
Desktop: CPU: AMD Athlon64 3000+ | MB: Biostar K8T890-A9 | VGA: NVIDIA GeForce 6200 LE 256MB | RAM: 2x 1GB A-DATA DDR 400 MHz Dual Kit | HDD: WD Caviar Blue 320GB | DVD: LG GSA-H10N | Keyboard: Chicony KU-0420 Silver/Black | Mouse: Logitech RX1000 | Zdroj: Corsair CX400 400W | CASE: DELUX DLC-MD370 Black | LCD: 20" Samsung 206BW | Repro: Teac XL-20
Notebook: ACER Aspire 4820TG 14" | CPU: Intel Core i5 2,53 GHz | VGA: ATI Mobility Radeon HD5650 1GB / Intel HD Graphics | RAM: 4GB DDR3 1066 MHz | HDD: 640GB
Offline

Skúsený užívateľ
Skúsený užívateľ
Multivstup

Registrovaný: 24.01.08
Prihlásený: 13.09.17
Príspevky: 14691
Témy: 66 | 66
Bydlisko: Žilina
Vek: 30
NapísalOffline : 14.02.2011 20:27 | Multivstup

nj, tomuto sa hovorí zle napísaný kód...okrem toho že tam máš podľa všetkého chybu (inak by ti error nehádzal), tak to máš zle naformátované (ok, možno chyba fóra a nie teba, ale...) a hlavne, kód by mal hovoriť sám za seba.. pokiaľ aj stenley nechápe čo vlastne chceš, je to už problém :P

btw, ten error čo ti hádže býva väčšinou v prípade, kedy máš syntaktickú chybu (povedzme chýba niekde bodkočiarka, zle uzatvorené zátvorky a pod.)


_________________
C#, PHP, ...
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 30.09.07
Prihlásený: 30.11.11
Príspevky: 143
Témy: 37 | 37
Napísal autor témyOffline : 15.02.2011 1:31 | Multivstup

Ok, tak dovetok pre objasnenie.

Chcel som to univerzalne- ak pridavas z hocijakeho formulara ktory ma hocikolko viacnasobnych postov, aby to vsetko vzalo a vytvorilo pouzitelny INSERT.
Ako fakt to je prekombinovano asik, ale po 2 dnoch co som sa s tym dzubkal jedine funkcne riesenie. :)

Momentalne mam v hlave Hirosimu z toho, ale pokomentoval som, co to islo. Nic jednoduchsie a strucnejsie mi neprislo na um. Za kazde zjednodusenie budem vdacny, aj za slova kritiky, ktorych tu padne istotne dost. :)
Kód:
<?php
 function multiSave($tabulka)
    {
   
  foreach ($_POST as $key=>$tempone) {//Vezmem vsetky postovane hodnoty
  $poleStlpcov[] = $key; //Zacnem tvorit pole stlpcov do insertu
 
   if (is_array($tempone)){ //Ak je hodnota niektoreho z postov pole
   $nazvyPoliMultipola[]= $key; //Zacnem tvorit pomocne pole s nazvami tychto poli
    foreach ($tempone as $key2=>$temptwo) { //Polia vypiseme
   
    if ($temptwo!="" AND $temptwo!="Click to Select Date..."){//Vynimky, pri ktorych sa vstup neberie v uvahu(ak je prazdny, alebo implicitny)
   
    $multiPole[$key][$key2] = $temptwo;//Vytvorim multipole s rovnakymi indexami
    }
    }
    } else $poleHodnot[] = $tempone; //Ak nie je hodnota konretneho postu pole, priradim do pola hodnot do insertu
 
 
  }
 
$retazecStlpcov = implode(", ", $poleStlpcov); //Vytvorim z poli retazce
$retazecHodnot = implode("', '", $poleHodnot);
$pocetPoli = count($nazvyPoliMultipola); //Urcim pocet ciklov, podla poctu POSTOV s poliami
$pocetPrvkovPola = count($multiPole[$nazvyPoliMultipola[0]]);//Urcim pocet prvkov pola, podla prveho POST pola(vsetky maju rovnaky pocet prvkov)
  for ($i=0; $i<$pocetPrvkovPola; $i++) {//For pre zmenu indexu prvku pola v poradi
 
  for ($i1=0; $i1<$pocetPoli; $i1++) {//For pre zmenu POST pola v poradi
$hodnotyRoznychPoliPoPoradi = $multiPole[$nazvyPoliMultipola[$i1]];//Mena pola v poradi.(Nasledujuci POST)
$poleZvysnychHodnot[] = $hodnotyRoznychPoliPoPoradi[$i]; //Priradim do zberne zvysnych hodnot pre insert
}
$poleFinal[] = implode("' , '", $poleZvysnychHodnot); //A urobim z nich retazec. Ten pridam do koncoveho pola
$poleZvysnychHodnot = array();//Vyprazdnim pole zvysnych hodnot pre dalsi ciklus
}
foreach ( $poleFinal as $value) { //Koncove pole necham vypisat aj s insertmi v spravnom tvare
$vysledneHodnoty = $retazecHodnot."' , '".$value; //Zretazim vsetky hodnoty dokopy.
 //Ukladam data uzivatela       
        $sql = "INSERT $tabulka ($retazecStlpcov) VALUES ('$vysledneHodnoty');";
        if( !MySQL_Query($sql)){
        echo "Zlyhalo vkladanie údajov. Skontrolujte hodnoty.";
        exit;
        }
}
    }           
 
?>


Offline

Správca fóra
Správca fóra
Multivstup

Registrovaný: 27.07.07
Príspevky: 3971
Témy: 51 | 51
Bydlisko: Bratislava
Vek: 32
NapísalOffline : 15.02.2011 8:49 | Multivstup

necitas pozorne... chcel som od teba, aby si na priklade ukazal, ako chces udaje ziskane z formulara spracovat. Dajme tomu, ze $_POST obsahuje nasledujuce udaje:
Kód:
Array
(
    [key1] => Array
        (
            [key1_1] => Array
                (
                    [key1_1_1] => value1
                )

        )

    [key2] => Array
        (
            [0] => value2_1
            [1] => value2_2
        )
       
    [key3] => value3
)

co ma byt vystupom tvojej funkcie, ked spracuje takuto strukturu vstupu?

mimochodom, ta tvoja 2-dnova praca nie je ani zdaleka univerzalna ;) nechapem, ako ti to moze fungovat, ked to nevie bez chyb spracovat ani jednoduchy vstup, nie to este viacrozmerne polia


_________________
Desktop: CPU: AMD Athlon64 3000+ | MB: Biostar K8T890-A9 | VGA: NVIDIA GeForce 6200 LE 256MB | RAM: 2x 1GB A-DATA DDR 400 MHz Dual Kit | HDD: WD Caviar Blue 320GB | DVD: LG GSA-H10N | Keyboard: Chicony KU-0420 Silver/Black | Mouse: Logitech RX1000 | Zdroj: Corsair CX400 400W | CASE: DELUX DLC-MD370 Black | LCD: 20" Samsung 206BW | Repro: Teac XL-20
Notebook: ACER Aspire 4820TG 14" | CPU: Intel Core i5 2,53 GHz | VGA: ATI Mobility Radeon HD5650 1GB / Intel HD Graphics | RAM: 4GB DDR3 1066 MHz | HDD: 640GB
Offline

Užívateľ
Užívateľ
Multivstup

Registrovaný: 16.05.07
Prihlásený: 01.08.17
Príspevky: 837
Témy: 6 | 6
NapísalOffline : 15.02.2011 9:07 | Multivstup

urcite nie ved mu tam do niektorych vypise Array az to je pole[][] alebo mu to spravi dost rovnakych riadkov v pripade poli.
okrem toho ked chces multiple insert tak sa to da robit aj cez jedno slovo
Kód:
INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 30.09.07
Prihlásený: 30.11.11
Príspevky: 143
Témy: 37 | 37
Napísal autor témyOffline : 15.02.2011 11:53 | Multivstup

Kód:
Array
(
    [nazovPostu1] => hodnotaPostu1
     
    [nazovPostu2] => hodnotaPostu2

    [nazovPostu3] => Array
        (
            [0] => hodnotaPostu3a
            [1] => hodnotaPostu3b

        )

    [nazovPostu4] => Array
        (
            [0] => hodnotaPostu4a
            [1] => hodnotaPostu4b

        )

   
)


Tak, z mojho velmi jednoducheho pohladu- pre situaciu formulara, ktory vyplna viac vstupov pre viac zaznamov na jednej stranke naraz sa mi to zda ako univerzal. Dalej tie polia neplnim uz inymi poliami ani nic podobne.

A funguje to all right. :)

Aj cez jedno slovo by som na vytvorenie toho retazca musel podstupit tu istu peripetiu. Len na zaver by nebol foreach.

Dik za diskusiu, cenim si ju. :)


Offline

Správca fóra
Správca fóra
Multivstup

Registrovaný: 27.07.07
Príspevky: 3971
Témy: 51 | 51
Bydlisko: Bratislava
Vek: 32
NapísalOffline : 15.02.2011 12:35 | Multivstup

diskusia by mohla byt, keby clovek vedel, na co to chces pouzit... zatial v tom vsak zmysel nevidim - vkladat tolko riadkov do tabulky, kolko je hodnot napr. v poli nazovPostu3... ak nazovPostu4 obsahuje viacero hodnot ako nazovPostu3, tak tie sa ignoruju - na co to je dobre? ked budes pouzivat napr. 5 checkboxov a zaskrtnute budu vsetky, budes vkladat 5 novych riadkov?

//Ked mierne upravim hodnoty v $_POST na:
Kód:
Array
(
    [nazovPostu1] => hodnotaPostu1
    [nazovPostu2] => hodnotaPostu2
    [nazovPostu3] => Array
        (
            [0] => hodnotaPostu3a
            [1] => hodnotaPostu3b
        )

    [nazovPostu4] => Array
        (
            [0] => hodnotaPostu4a
            [1] => hodnotaPostu4b
        )

    [nazovPostu5] => hodnotaPostu5
)

tak tvoja funkcia vypluje nieco taketo:
Kód:
INSERT test (nazovPostu1, nazovPostu2, nazovPostu3, nazovPostu4, nazovPostu5) VALUES ('hodnotaPostu1', 'hodnotaPostu2', 'hodnotaPostu5' , 'hodnotaPostu3a' , 'hodnotaPostu4a');
INSERT test (nazovPostu1, nazovPostu2, nazovPostu3, nazovPostu4, nazovPostu5) VALUES ('hodnotaPostu1', 'hodnotaPostu2', 'hodnotaPostu5' , 'hodnotaPostu3b' , 'hodnotaPostu4b');

co je evidentne zle, nakolko sa napr. do stlpca nazovPostu3 vlozi hodnota hodnotaPostu5 a pod


_________________
Desktop: CPU: AMD Athlon64 3000+ | MB: Biostar K8T890-A9 | VGA: NVIDIA GeForce 6200 LE 256MB | RAM: 2x 1GB A-DATA DDR 400 MHz Dual Kit | HDD: WD Caviar Blue 320GB | DVD: LG GSA-H10N | Keyboard: Chicony KU-0420 Silver/Black | Mouse: Logitech RX1000 | Zdroj: Corsair CX400 400W | CASE: DELUX DLC-MD370 Black | LCD: 20" Samsung 206BW | Repro: Teac XL-20
Notebook: ACER Aspire 4820TG 14" | CPU: Intel Core i5 2,53 GHz | VGA: ATI Mobility Radeon HD5650 1GB / Intel HD Graphics | RAM: 4GB DDR3 1066 MHz | HDD: 640GB
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 30.09.07
Prihlásený: 30.11.11
Príspevky: 143
Témy: 37 | 37
Napísal autor témyOffline : 15.02.2011 13:57 | Multivstup

Pravda.

Zmenil som zaciatok funkcie:
Kód:
  foreach ($_POST as $key=>$tempone) {//Vezmem vsetky postovane hodnoty

 
 
   if (is_array($tempone)){ //Ak je hodnota niektoreho z postov pole
   $poleMultiStlpcov[] = $key; //Zacnem tvorit pole stlpcov do insertu
   $nazvyPoliMultipola[]= $key; //Zacnem tvorit pomocne pole s nazvami tychto poli
    foreach ($tempone as $key2=>$temptwo) { //Polia vypiseme
   
    if ($temptwo!="" AND $temptwo!="Click to Select Date..."){//Vinimky, pri ktorych sa vstup neberie v uvahu(ak je prazdny, alebo implicitny)
   
    $multiPole[$key][$key2] = $temptwo;//Vytvorim multipole s rovnakymi indexami


    }
    }
    } else
    {
    $poleStlpcov[] = $key; //Zacnem tvorit pole stlpcov do insertu
    $poleHodnot[] = $tempone; //Ak nie je hodnota konretneho postu pole, priradim do pola hodnot do insertu
 
    }
   
 
  }
$poleVsetkychStlpcov = array_merge($poleStlpcov,$poleMultiStlpcov);
$retazecStlpcov = implode(", ", $poleVsetkychStlpcov); //Vytvorim z poli retazce
$retazecHodnot = implode("', '", $poleHodnot);


Uz to dava v spravnom poradi.

A 5 novych riadkov budem vkladat, len ak tie checky budu pole. Tym padom budu urcovat nejaku hodnotu 5 novych zaznamov tabulky. Napriklad piatich vegetarianov dajme tomu.

Prosto tu dam jednoduchy priklad takeho formu, nech sa chapeme:
Multivstup


Offline

Správca fóra
Správca fóra
Multivstup

Registrovaný: 27.07.07
Príspevky: 3971
Témy: 51 | 51
Bydlisko: Bratislava
Vek: 32
NapísalOffline : 15.02.2011 14:39 | Multivstup

ten obrazok si sem mohol dat uz hned na zaciatku :) ok, tak teraz, ked je uz jasnejsie, co ma kod zhruba robit, radil by som ti tvoj skript uplne prerobit, aby si sa v nom nasledujuci den aspon trochu vyznal...

da sa to spravit ovela jednoduchsie, pre tvoje potreby staci pouzit maximalne 2 cykly, cim sa cely kod znacne zjednodusi a sprehladni... porozmyslaj a zacni tvorit ;)


_________________
Desktop: CPU: AMD Athlon64 3000+ | MB: Biostar K8T890-A9 | VGA: NVIDIA GeForce 6200 LE 256MB | RAM: 2x 1GB A-DATA DDR 400 MHz Dual Kit | HDD: WD Caviar Blue 320GB | DVD: LG GSA-H10N | Keyboard: Chicony KU-0420 Silver/Black | Mouse: Logitech RX1000 | Zdroj: Corsair CX400 400W | CASE: DELUX DLC-MD370 Black | LCD: 20" Samsung 206BW | Repro: Teac XL-20
Notebook: ACER Aspire 4820TG 14" | CPU: Intel Core i5 2,53 GHz | VGA: ATI Mobility Radeon HD5650 1GB / Intel HD Graphics | RAM: 4GB DDR3 1066 MHz | HDD: 640GB
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 30.09.07
Prihlásený: 30.11.11
Príspevky: 143
Témy: 37 | 37
Napísal autor témyOffline : 26.03.2011 0:16 | Multivstup

Tak som sa k mojej funkcii zazracnici po case vratil a dal ju na tie 2 cykly. :)

Ona vyzera robustnejsie lebo v nej riesim nejake vynimky a myslim (dufam) na vsetky mozne situacie.
Ale v podstate si hned v prvom cykle naplnim polia navzajom si prisluchajucimi stlpcami a hodnotami, neskor ich uz len spravne pospajam pri vypise tohto pola v inserte.

Dufam, ze uz konecne zacinam uvazovat jednoduchsie, ak so mnou niekto nesuhlasi, dajte mi vediet. :)

Pekny den vsetkym.

Kód:
<?php
 function multiSave($tabulka)
    {
    $poleStlpcov = array(); //Inicializujem hodnoty pre polia pre pripad, ze budu len mnohonasobne vstupy
    $poleHodnot = array(); 
    $poleMultiHodnot = array();
       
  foreach ($_POST as $key=>$tempone) {//Vezmem vsetky postovane hodnoty
   
   if (is_array($tempone)){ //Ak je hodnota niektoreho z postov pole
   $poleMultiStlpcov[] = $key; //Zacnem tvorit pole stlpcov do insertu
   foreach ($tempone as $key2=>$temptwo) {
   
    if ($temptwo!="" AND $temptwo!="Click to Select Date..."){//Vinimky, pri ktorych sa vstup neberie v uvahu(ak je prazdny, alebo implicitny)
//Spojim zaznami hodnot buduceho insertu podla indexu
$poleMultiHodnot[$key2] .= ", '".$temptwo."' ";
    }
    }
    } else
    {
    $poleStlpcov[] = $key; //Zacnem tvorit pole stlpcov do insertu
    $poleHodnot[] = $tempone; //Ak nie je hodnota konretneho postu pole, priradim do pola hodnot do insertu
 
    }
   
 
  }
$poleVsetkychStlpcov = array_merge($poleStlpcov,$poleMultiStlpcov);//Spojim nazvy vsetkych vkladanych stlpcov
$retazecStlpcov = implode(", ", $poleVsetkychStlpcov); //Vytvorim z poli retazce
$retazecHodnot = implode("', '", $poleHodnot);
foreach ( $poleMultiHodnot as $value) { //Koncove pole necham vypisat aj s insertmi v spravnom tvare
if($retazecHodnot)// Ak je nastavena tato premenna, znamena to ze boli pouzite aj jednoduche vstupy a hodnoty treba spojit
$vysledneHodnoty = "'".$retazecHodnot."' ".$value; //Zretazim vsetky hodnoty dokopy.
else
$vysledneHodnoty = substr($value, 1); //Odstranim len uvodnu ciarku z retazca aktualnych hodnot
 //Ukladam data       
        $sql = "INSERT $tabulka ($retazecStlpcov) VALUES ($vysledneHodnoty);";
        if( !MySQL_Query($sql)){
        echo "Zlyhalo vkladanie údajov. Skontrolujte hodnoty.";
        exit;
       }
}
    }
?>


Offline

Správca fóra
Správca fóra
Multivstup

Registrovaný: 27.07.07
Príspevky: 3971
Témy: 51 | 51
Bydlisko: Bratislava
Vek: 32
NapísalOffline : 26.03.2011 15:44 | Multivstup

vela zmien si tam teda nespravil :) uplne jednoduchy zaklad by mohol vypadat nasledovne:
Kód:
$POST = $_POST;
$keys = array_keys($POST);
$rows = array();

do
{
    $values = array();
   
    foreach($keys as $key)
    {
        $value = $POST[$key];
   
        if(is_array($value))
        {
            $value = array_shift($POST[$key]);
            $tmp = (!isset($tmp)) ? $key : $tmp;
        }
   
        $values[] = "'".$value."'";
    }
   
    $rows[] = '('.implode(',', $values).')';
}
while(isset($tmp) && !empty($POST[$tmp]));

echo "INSERT INTO tblname (".implode(',', $keys).") VALUES ".implode(',', $rows);


_________________
Desktop: CPU: AMD Athlon64 3000+ | MB: Biostar K8T890-A9 | VGA: NVIDIA GeForce 6200 LE 256MB | RAM: 2x 1GB A-DATA DDR 400 MHz Dual Kit | HDD: WD Caviar Blue 320GB | DVD: LG GSA-H10N | Keyboard: Chicony KU-0420 Silver/Black | Mouse: Logitech RX1000 | Zdroj: Corsair CX400 400W | CASE: DELUX DLC-MD370 Black | LCD: 20" Samsung 206BW | Repro: Teac XL-20
Notebook: ACER Aspire 4820TG 14" | CPU: Intel Core i5 2,53 GHz | VGA: ATI Mobility Radeon HD5650 1GB / Intel HD Graphics | RAM: 4GB DDR3 1066 MHz | HDD: 640GB
 [ Príspevkov: 12 ] 


Multivstup




© 2005 - 2017 PCforum, edited by JanoF