Viacnásobné vloženie hodnôt do db z poľa s podmienkou if – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Viacnásobné vloženie hodnôt do db z poľa s podmienkou if – PHP – Fórum – Programujte.comViacnásobné vloženie hodnôt do db z poľa s podmienkou if – PHP – Fórum – Programujte.com

 

Peter
~ Anonymní uživatel
4016 příspěvků
7. 3. 2019   #1
-
0
-

Ahojte 

Chcel by som Vás poprosiť o radu, nakoľko som hľadal všade možne, ale nenašiel som riešenie.

Urobil som web, kde sa hodnotia výrobky... Ak niekto ide hodnotiť výrobky ako prvý, tak musí pracne nahodiť všetky údaje výrobku. Druhý užívateľ toto už nemusí robiť, klikne si na stránku posledné a iba zadá body posledným 10 výrobkom, ktoré sa mu zobrazia. Samozrejme musí byť prihlásený.

Urobil som to tak, že do formulára, do inputov som si natiahol posledných 10 hodnôt z db.

Dané inputy majú name ako pole. 


<!-- Výpis hodnôt z db pre posledných 10 výrobkov -->
<?php  
$db = DB();
        $data = $db->query("
                    SELECT * FROM hodnotenie GROUP BY davka, plnenie_den, plnenie_mesiac, plnenie_rok ORDER BY id DESC LIMIT 10; 
                    ");
?>


 <form class="posledne" action="../partials/zapis_posledne.php" method="GET">
<table class="posledne_tabulka">
<!-- Popis stĺpcov formulára, v ktorom je vypísaných posledných 10 hodnôť s možnosťou vloženia do jedného imputu - body -->
  <?php  
          echo '<thead>
                    <tr>                    
                    <th class="radabunka posledne_rada">Rada</th>
                    <th class="odrodabunka">Odroda</th>                    
                    <th class="rocnik">Ročník</th>
                    <th class="datumplneniabunka">Dátum plnenia</th>
                    <th class="davkabunka">Dávka</th>
                    <th class="bodybunka">Body</th>
                   </tr>
                 </thead>';
    ?>
<?php foreach ($data as $item) : ?> 
  <tr>
          <td class="posledne_rada">
            <label>
              <?php echo $item['rada'] ?>
              <input  type="hidden" name="rada[]" value="<?php echo $item['rada'] ?>" >         
            </label>
          </td>
          <td>
            <label>
              <?php echo $item['odroda'] ?>
            <input type="hidden" name="odroda[]" value="<?php echo $item['odroda'] ?>" >
            </label>
        </td>
        <td>
          <label>
            <?php echo $item['rocnik'] ?>
          <input  type="hidden" name="rocnik[]" value="<?php echo $item['rocnik'] ?>" >   
          </label>
        </td>
        <td>
          <label>   
            <?php echo $item['plnenie_den'].".".$item['plnenie_mesiac'].". ".$item['plnenie_rok']?>
            <input  type="hidden" name="plnenie_den[]" value="<?php echo $item['plnenie_den']?>" >
          <input  type="hidden" name="plnenie_mesiac[]" value="<?php echo $item['plnenie_mesiac']?>" > 
            <input  type="hidden" name="plnenie_rok[]" value="<?php echo $item['plnenie_rok']?>" > 
          </label> 
        </td>
        <td>
          <label>  
            <?php echo $item['davka'] ?>
          <input  type="hidden" name="davka[]" value="<?php echo $item['davka'] ?>" >   
          </label>  
        </td> 
        <td>
          <label>
          <input class="posledne_input_body" type="number" name="body[]" value="" >
          </label>
        </td>
    </tr>
<?php endforeach; ?>
<table>
<input type="hidden" name="hodnotitel" value="<?php echo $hodnotitel ?>">
<div class="button_ram">
  <input class="login_button" type="submit" value="Poslať">
</div>
</form>

Tento formulár sa odošle na ďalšiu stránku pre spracovanie, kde odchytávam jednotlivé polia.


$rada  = $_GET['rada'];
$odroda  = $_GET['odroda'];
$rocnik  = $_GET['rocnik'];
$plnenie_den  = $_GET['plnenie_den'];
$plnenie_mesiac  = $_GET['plnenie_mesiac'];
$plnenie_rok  = $_GET['plnenie_rok'];
$davka  = $_GET['davka'];
$body  = $_GET['body'];
$id_uzivatela = $_GET['hodnotitel'];

/*V prom kroku sa v db dohľadá hodnota s danými podmienkami, ak sa nájde do premennej sa uloží hodnota 1 ak nie tak 0*/
/*Pokiaľ je výpis hodnoty z db 0 vykoná sa zápis do db pre daný výrobk, ak je hodnota 1 a viac, vypíše sa výstraha, že daný výrobk bol hodnotený*/
/*Následne sa vykoná zápis do db pre daný výrobok*/
/*Užívateľ môže hodnotiť všetkých posledných 10 výrobkov, alebo len ktoré chce, ostatné hodnoty môžu byť prázdne*/
/*Ak užívateľ už výrobok hodnotil, do db sa zapíšu hodnoty len výrobkov ktoré nehodnotil a pre tie ktoré hodnotil sa zobrazí oznámenie*/
/*
-------------------------------------
Rýchlo hodnotenie pre hodnotu 0
------------------------------------
*/
if (!empty($body[0]) && $body[0]<100) 
{
$db = DB();
$hodnotil_uz = $db->query("
SELECT COUNT(id_uzivatela) FROM hodnotenie 
WHERE rada = '$rada[0]' AND odroda = '$odroda[0]' AND rocnik = '$rocnik[0]' AND id_uzivatela = '$id_uzivatela' AND plnenie_rok = '$plnenie_rok[0]' AND plnenie_mesiac = '$plnenie_mesiac[0]' AND plnenie_den = '$plnenie_den[0]' AND davka = '$davka[0]';
");

foreach ($hodnotil_uz as $hodnotil) { $toto0 = $hodnotil[0]; }
if ($toto0 == 0) 
{
$db = DB();
$data = $db->query("
INSERT INTO hodnotenie 
(rada, odroda, rocnik, body, id_uzivatela, plnenie_rok, plnenie_mesiac, plnenie_den, davka, date)
VALUES 
('$rada[0]', '$odroda[0]', '$rocnik[0]','$body[0]', '$id_uzivatela','$plnenie_rok[0]', '$plnenie_mesiac[0]', '$plnenie_den[0]', '$davka[0]', CURRENT_TIMESTAMP); ");
}else 
{
  $vystraha0 = 'Víno '.$odroda[0].' ste už raz hodnotili.';
}
}
/*
-------------------------------------
Rýchlo hodnotenie pre hodnotu 1
------------------------------------
*/
if (!empty($body[1]) && $body[1]<100) 
{
$db = DB();
$hodnotil_uz = $db->query("
SELECT COUNT(id_uzivatela) FROM hodnotenie 
WHERE rada = '$rada[1]' AND odroda = '$odroda[1]' AND rocnik = '$rocnik[1]' AND id_uzivatela = '$id_uzivatela' AND plnenie_rok = '$plnenie_rok[1]' AND plnenie_mesiac = '$plnenie_mesiac[1]' AND plnenie_den = '$plnenie_den[1]' AND davka = '$davka[1]';
");

foreach ($hodnotil_uz as $hodnotil) { $toto1 = $hodnotil[0]; }
if ($toto1 == 0) 
{
$db = DB();
$data = $db->query("
INSERT INTO hodnotenie 
(rada, odroda, rocnik, body, id_uzivatela, plnenie_rok, plnenie_mesiac, plnenie_den, davka, date)
VALUES 
('$rada[1]', '$odroda[1]', '$rocnik[1]','$body[1]', '$id_uzivatela','$plnenie_rok[1]', '$plnenie_mesiac[1]', '$plnenie_den[1]', '$davka[1]', CURRENT_TIMESTAMP); ");
}else 
{
  $vystraha1 = 'Víno '.$odroda[1].' ste už raz hodnotili.';
}
}
/*
-------------------------------------
Rýchlo hodnotenie pre hodnotu 2
------------------------------------
*/
if (!empty($body[2]) && $body[2]<100) 
{
$db = DB();
$hodnotil_uz = $db->query("
SELECT COUNT(id_uzivatela) FROM hodnotenie 
WHERE rada = '$rada[2]' AND odroda = '$odroda[2]' AND rocnik = '$rocnik[2]' AND id_uzivatela = '$id_uzivatela' AND plnenie_rok = '$plnenie_rok[2]' AND plnenie_mesiac = '$plnenie_mesiac[2]' AND plnenie_den = '$plnenie_den[2]' AND davka = '$davka[2]';
");

foreach ($hodnotil_uz as $hodnotil) { $toto2 = $hodnotil[0]; }
if ($toto2 == 0) 
{
$db = DB();
$data = $db->query("
INSERT INTO hodnotenie 
(rada, odroda, rocnik, body, id_uzivatela, plnenie_rok, plnenie_mesiac, plnenie_den, davka, date)
VALUES 
('$rada[2]', '$odroda[2]', '$rocnik[2]','$body[2]', '$id_uzivatela','$plnenie_rok[2]', '$plnenie_mesiac[2]', '$plnenie_den[2]', '$davka[2]', CURRENT_TIMESTAMP); ");
}else 
{
  $vystraha2 = 'Víno '.$odroda[2].' ste už raz hodnotili.';
}
}
/*

-------------------------------------
Rýchlo hodnotenie pre hodnotu 9
------------------------------------
*/
if (!empty($body[9]) && $body[9]<100) 
{
    $db = DB();
    $hodnotil_uz = $db->query("
    SELECT COUNT(id_uzivatela) FROM hodnotenie 
    WHERE rada = '$rada[9]' AND odroda = '$odroda[9]' AND rocnik = '$rocnik[9]' AND id_uzivatela = '$id_uzivatela' AND plnenie_rok = '$plnenie_rok[9]' AND plnenie_mesiac = '$plnenie_mesiac[9]' AND plnenie_den = '$plnenie_den[9]' AND davka = '$davka[9]';
                ");

    foreach ($hodnotil_uz as $hodnotil) {   $toto9 = $hodnotil[0];  }
    if ($toto9 == 0) 
                    {   
                
                        $db = DB();
                        $data = $db->query("
                        INSERT INTO hodnotenie 
                        (rada, odroda, rocnik, body, id_uzivatela, plnenie_rok, plnenie_mesiac, plnenie_den, davka, date)
                        VALUES 
                        ('$rada[9]', '$odroda[9]', '$rocnik[9]','$body[9]', '$id_uzivatela','$plnenie_rok[9]', '$plnenie_mesiac[9]', '$plnenie_den[9]', '$davka[9]', CURRENT_TIMESTAMP);  ");
                    }else 
                        {
                          $vystraha9 = 'Víno '.$odroda[9].' ste už raz hodnotili.';
                        }
}
if(!empty($vystraha0) or !empty($vystraha1) or !empty($vystraha2) or !empty($vystraha3) or !empty($vystraha4) or !empty($vystraha5) or !empty($vystraha6) or !empty($vystraha7) or !empty($vystraha8) or !empty($vystraha9))
{
$_SESSION['posledne_vystraha'] = 
'
<tr><td>'.$vystraha0.'</td></tr>
<tr><td>'.$vystraha1.'</td></tr>
<tr><td>'.$vystraha2.'</td></tr>
<tr><td>'.$vystraha3.'</td></tr>
<tr><td>'.$vystraha4.'</td></tr>
<tr><td>'.$vystraha5.'</td></tr>
<tr><td>'.$vystraha6.'</td></tr>
<tr><td>'.$vystraha7.'</td></tr>
<tr><td>'.$vystraha8.'</td></tr>
<tr><td>'.$vystraha9.'</td></tr>
';
die(header("Location: ../pages/posledne.php"));
}else {
$_SESSION['posledne_vystraha'] = '<p class="posledne_session">Vaše hodnotenie bolo odoslané.</p>';
die(header("Location: ../pages/posledne.php"));
}

?>


Problém je, že ten zápis do databázy robím takto ťažkopádne, kde vkladám každý riadok poľa osobitne.
Pri každom riadku musím zadať číslo hodnoty v poli až po 10.

Určite sa to dá cez nejaký cyklus.

Ak má z Vás niekto čas, vedeli by ste ma aspoň naviesť prosím?

Stránka funguje, ale ideálne by bolo, keby si niekde hore v stránke môžu užívatelia nastavovať počet zobrazenia posledných produktov. Toto však môžem dosiahnuť len tak, že to vkladanie do db bude cez nejaký cyklus... to je jedno, hlavne potrebujem vedieť ako vložiť do db viacnasobné vloženie cez nejaký cyklus, bez toho aby som tam tie riadky ručne vypísal...

Čiže, čo by bol ideálny stav?
Pri zobrazení stránky posledné, by si užívateľ mohol nastaviť koľko posledných výrobkov sa mu má zobraziť vo formulári. To by šlo ľahko, len by som dal do premennej možnosť nastaviť čísla a podľa toho by sa upravoval limit zobrazenia z db.... asi tak nejako. Ale potom na stránke kde sa prijímajú dáta sa vykonáva kontrola v db, či už daný výrobok hodnotil, ak nie, tak sa vykoná zápis. Ako toto ošetriť cyklom a nevypisovať to takto osobitne neviem.

V zdrojovom kóde vyššie som uviedol len 3 hodnoty zápisu do db.

Nahlásit jako SPAM
IP: 213.151.235.–
pepko1430
Newbie
21. 4. 2019   #2
-
0
-

Ahojte, tak som na to nakoniec prišiel sám. Chápem, že mi tu nikto neodpovedal vzhľadom na komplexnosť problému... Vyriešil som to takto:

<?php require_once "../_inc/config.php" ?>

<?php


$rada  = $_GET['rada'];
$odroda  = $_GET['odroda'];
$rocnik  = $_GET['rocnik'];
$plnenie_den  = $_GET['plnenie_den'];
$plnenie_mesiac  = $_GET['plnenie_mesiac'];
$plnenie_rok  = $_GET['plnenie_rok'];
$davka  = $_GET['davka'];
$body  = $_GET['body'];
$id_uzivatela = $_GET['hodnotitel'];


$x = 0;
while ( $x<= 9) 
{
   

    if (!empty($body[$x]) && $body[$x]<100) 

        {

            $db = DB();
            $hodnotil_uz = $db->query("
            SELECT COUNT(id_uzivatela) FROM hodnotenie 
            WHERE rada = '$rada[$x]' AND odroda = '$odroda[$x]' AND rocnik = '$rocnik[$x]' AND id_uzivatela = '$id_uzivatela' AND plnenie_rok = '$plnenie_rok[$x]' AND plnenie_mesiac = '$plnenie_mesiac[$x]' AND plnenie_den = '$plnenie_den[$x]' AND davka = '$davka[$x]';
                ");


            foreach ($hodnotil_uz as $hodnotil) {   $toto = $hodnotil[0];  }

            if ($toto == 0) 

                    {   

         
               $db = DB();
               $data = $db->query("
               INSERT INTO hodnotenie 
               (rada, odroda, rocnik, body, id_uzivatela, plnenie_rok, plnenie_mesiac, plnenie_den, davka, date)
                VALUES 
               ('$rada[$x]', '$odroda[$x]', '$rocnik[$x]','$body[$x]', '$id_uzivatela','$plnenie_rok[$x]', '$plnenie_mesiac[$x]', '$plnenie_den[$x]', '$davka[$x]', CURRENT_TIMESTAMP);    ");
                $x++;     
                } else {
                    $vystraha = 'Víno '.$odroda[$x].' ste už raz hodnotili.';
                    $x++;
                }        				
                						
        } else {$x++;}
        					

        

}


if(!empty($vystraha))

{

				$_SESSION['posledne_vystraha'] = 

			'
			<tr><td>'.$vystraha.'</td></tr>	
			';

			die(header("Location: ../pages/posledne.php"));
	
}else {

		$_SESSION['posledne_vystraha'] = '<p class="posledne_session">Vaše hodnotenie bolo odoslané.</p>';

		die(header("Location: ../pages/posledne.php"));

	}			


?>

Ešte by som Vás chcel poprosiť o jednu vec.

Ak niekto chce pridať body produktu, ktorý už hodnotil, vyskočí mu výstraha.

Výstraha funguje tak, že sa údaje o danom produkte uložia do premennej $vystraha a cez session sa odošlú do inej stránky... Problém je, že keď prechádzam cyklom tak sa mi logicky dokáže vypísať len posledná hodnota. Teda keď osoba boduje 10 výrobkov a z toho už 2 hodnotil pred tým, výstraha sa vypíše len pre ten posledný produkt.

Ako uložiť hodnoty z cyklu, napríklad do poľa, tak aby som ich následne mohol všetky vziať do premennej a vypísať v session?

Nahlásit jako SPAM
IP: 62.197.243.–
pepko1430
Newbie
21. 4. 2019   #3
-
0
-

Tak už som prišiel aj na to. I keď ten výpis do session by som tiež najradšej riešil cez cyklus... snáď na to prídem...


<?php require_once "../_inc/config.php" ?>

<?php


$rada  = $_GET['rada'];
$odroda  = $_GET['odroda'];
$rocnik  = $_GET['rocnik'];
$plnenie_den  = $_GET['plnenie_den'];
$plnenie_mesiac  = $_GET['plnenie_mesiac'];
$plnenie_rok  = $_GET['plnenie_rok'];
$davka  = $_GET['davka'];
$body  = $_GET['body'];
$id_uzivatela = $_GET['hodnotitel'];




/*
-------------------------------------
Rýchlo hodnotenie pre hodnotu 2
------------------------------------
*/

$x = 0;
while ( $x<= 9) 
{
   

    if (!empty($body[$x]) && $body[$x]<100) 

        {

            $db = DB();
            $hodnotil_uz = $db->query("
            SELECT COUNT(id_uzivatela) FROM hodnotenie 
            WHERE rada = '$rada[$x]' AND odroda = '$odroda[$x]' AND rocnik = '$rocnik[$x]' AND id_uzivatela = '$id_uzivatela' AND plnenie_rok = '$plnenie_rok[$x]' AND plnenie_mesiac = '$plnenie_mesiac[$x]' AND plnenie_den = '$plnenie_den[$x]' AND davka = '$davka[$x]';
                ");


            foreach ($hodnotil_uz as $hodnotil) {   $toto = $hodnotil[0];  }

            if ($toto == 0) 

                    {   

         
               $db = DB();
               $data = $db->query("
               INSERT INTO hodnotenie 
               (rada, odroda, rocnik, body, id_uzivatela, plnenie_rok, plnenie_mesiac, plnenie_den, davka, date)
                VALUES 
               ('$rada[$x]', '$odroda[$x]', '$rocnik[$x]','$body[$x]', '$id_uzivatela','$plnenie_rok[$x]', '$plnenie_mesiac[$x]', '$plnenie_den[$x]', '$davka[$x]', CURRENT_TIMESTAMP);    ");
                $x++;     
                } else {
                    $vystraha[] = 'Víno '.$odroda[$x].' ste už raz hodnotili.';
                    $x++;
                }        				
                						
        } else {$x++;}
        					

        

}



if(!empty($vystraha))

{

				$_SESSION['posledne_vystraha'] = 


			'
			<tr><td>'.$vystraha[0].'</td></tr>
            <tr><td>'.$vystraha[1].'</td></tr>
            <tr><td>'.$vystraha[2].'</td></tr>
            <tr><td>'.$vystraha[3].'</td></tr>
            <tr><td>'.$vystraha[4].'</td></tr>
            <tr><td>'.$vystraha[5].'</td></tr>
            <tr><td>'.$vystraha[6].'</td></tr>
            <tr><td>'.$vystraha[7].'</td></tr>
            <tr><td>'.$vystraha[8].'</td></tr>
            <tr><td>'.$vystraha[9].'</td></tr>
	
			';

			die(header("Location: ../pages/posledne.php"));
	
}else {

		$_SESSION['posledne_vystraha'] = '<p class="posledne_session">Vaše hodnotenie bolo odoslané.</p>';

		die(header("Location: ../pages/posledne.php"));

	}			


?>
Nahlásit jako SPAM
IP: 62.197.243.–
Kit+15
Guru
21. 4. 2019   #4
-
+1
-
Zajímavé

#3 pepko143
Problém to není zrovna komplexní, jen se ten tvůj zdroják tak blbě čte, že to mnoho lidí odradilo. Musel jsem si ho celý přeformátovat ve svém editoru, abych ho mohl pochopit.

Ten výpis seznamu výstrah můžeš udělat třeba takhle: 

$mkLine = function($text) {
    return "<tr><td>$text</td></tr>";
};
$lines = array_map($mkLine, $vystraha);$_SESSION['posledne_vystraha'] = implode("\n", $lines);
header("Location: ../pages/posledne.php");
exit();

Hodnocení z formuláře neposílej metodou GET, ale POST - jinak se budeš divit, čeho je například Chrome schopný.

Také je dobré data ošetřit proti SQL injection. Jeden blbý apostrof ve formuláři ti rozhodí skript. Záškodník ti může snadno tu databázi zlikvidovat.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
pepko1430
Newbie
21. 4. 2019   #5
-
0
-

Ooo funguje to :-)

Hej hej, presne tak som to myslel, že nikomu sa to nechce čítať nakoľko to chvíľu trvá kým si to niekto prečíta...

Ďakujem za tvoj čas a tiež dodatočné rady!, budem postupovať ďalej podla nich.

Nahlásit jako SPAM
IP: 78.99.19.–
pepko1430
Newbie
29. 4. 2019   #6
-
0
-

Tak som urobil ešte dodatočné úpravy na základe tvojho doporučenia.
Prikladám sem ten zdroják. Snáď je to už teraz ošetretné proti SQL injection.


<?php require_once "../_inc/config.php" ?>

<?php

$rada  = $_POST['rada'];
$odroda  = $_POST['odroda'];
$rocnik  = $_POST['rocnik'];
$plnenie_den  = $_POST['plnenie_den'];
$plnenie_mesiac  = $_POST['plnenie_mesiac'];
$plnenie_rok  = $_POST['plnenie_rok'];
$davka  = $_POST['davka'];
$body  = $_POST['body'];
$id_uzivatela = $_POST['hodnotitel'];

/*
-------------------------------------
Rýchlohodnotenie 
------------------------------------
*/

/*Cyklus sa vykoná po 10 hodnotení*/
$x = 0;
while ( $x<= 9) 
    {
       /*Ak užívateľ zadal body a zároveň dal hodnotu menšiu ako 100 tak sa vykonajú nasledovné akcie*/
        if (!empty($body[$x]) && $body[$x]<100) 

                {
                    /*Preverenie v db či užívateľ už daný produkt hodnotil*/
                    $db = DB();
                    $hodnotil_uz = $db->prepare("
                    SELECT COUNT(id_uzivatela) FROM hodnotenie 
                    WHERE rada     = :rada           AND 
                    odroda         = :odroda         AND 
                    rocnik         = :rocnik         AND 
                    id_uzivatela   = :id_uzivatela   AND 
                    plnenie_rok    = :plnenie_rok    AND 
                    plnenie_mesiac = :plnenie_mesiac AND 
                    plnenie_den    = :plnenie_den    AND 
                    davka          = :davka;
                                                ");

                    $hodnotil_uz->execute(array(
                    ":rada" => $rada[$x],
                    ":odroda" => $odroda[$x],
                    ":rocnik" => $rocnik[$x],                       
                    ":id_uzivatela" => $id_uzivatela,
                    ":plnenie_rok" => $plnenie_rok[$x],
                    ":plnenie_mesiac" => $plnenie_mesiac[$x],
                    ":plnenie_den" => $plnenie_den[$x],
                    ":davka" => $davka[$x]
                                                ));


                    foreach ($hodnotil_uz as $hodnotil) { 
                                                          $toto = $hodnotil[0]; 
                                                        }


                    /*Ak užívateľ daný produkt nehodnotil, vykoná sa zápis do db inak sa vyhodí výstraha*/
                    if ($toto == 0) 
                                {                    
                                   $db = DB();
                                   $data = $db->prepare("
                                   INSERT INTO hodnotenie 
                                   (rada, odroda, rocnik, body, id_uzivatela, plnenie_rok, plnenie_mesiac, plnenie_den, davka, date)
                                   VALUES 
                                   (:rada,:odroda,:rocnik,:body,:id_uzivatela,:plnenie_rok,:plnenie_mesiac,:plnenie_den,:davka, CURRENT_TIMESTAMP)");

                                    $data->execute(array(
                                    ":rada" => $rada[$x],
                                    ":odroda" => $odroda[$x],
                                    ":rocnik" => $rocnik[$x],
                                    ":body" => $body[$x],
                                    ":id_uzivatela" => $id_uzivatela,
                                    ":plnenie_rok" => $plnenie_rok[$x],
                                    ":plnenie_mesiac" => $plnenie_mesiac[$x],
                                    ":plnenie_den" => $plnenie_den[$x],
                                    ":davka" => $davka[$x]
                                                         ));

                                    $x++;     
                                } else  {
                                            $vystraha[] = 'Víno '.$odroda[$x].' ste už raz hodnotili.';
                                            $x++;
                                        }        				
                        						
                } 

                else {
                      $x++;
                     }    			
     
    }

/*Ak užívateľ daný produkt hodnotil, vyhodí sa výstráha cez session*/
if(!empty($vystraha))

                    {

                        $mkLine = function($text) 
                                  {
                                     return "<tr><td>$text</td></tr>";
                                  };

                        $lines = array_map($mkLine, $vystraha);      


                        $_SESSION['posledne_vystraha'] = implode("\n", $lines);
                        header("Location: ../pages/posledne.php");
                        exit();		
                    	
                    } else {

                    		$_SESSION['posledne_vystraha'] = '<p class="posledne_session">Vaše hodnotenie bolo odoslané.</p>';
                    		die(header("Location: ../pages/posledne.php"));

                    	   }		

?>
Nahlásit jako SPAM
IP: 213.151.235.–
Kit+15
Guru
29. 4. 2019   #7
-
0
-

#6 pepko143
Mám z toho takový divný pocit, že bereš práci databázi a ji tím zbytečně zatěžuješ. Přitom stačí z aplikace poslat jen jeden INSERT. Úloha na 10 řádek.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
pepko1430
Newbie
29. 4. 2019   #8
-
0
-

#7 Kit
Nerozumiem ti celkom. Beriem prácu databáze a tým ju zaťažujem?

Nevadí, nebudem ťa už viacej týmto zdržovať.
Ďakujem ti za pomoc. Ostatné doštudujem a časom ten kód zmenším. Zatiaľ sú moje dovednosti takéto :)

Nahlásit jako SPAM
IP: 78.99.19.–
MilanL+1
Grafoman
30. 4. 2019   #9
-
+1
-
Zajímavé
Kit +

#8 pepko143
no ještě bych se zamyslel nad tou DB a tabulkou, když dáš produktu ID nemusíš řešit ten balast informací okolo, navíc vína už v nějaké tabulce snad máš, v hodnocení ti stačí ID_Vina, ID_uzivatele a body případně datum hodnocení. a když si z těch ID vytvoříš klíč nemusíš tolik řešit to duplicitní hodnocení.

Z tabulky vína extrahovat řady a odrůdy zvlášť (opakují se) a provázat přes id, plnění dát jako Date, případně přidat Šarži. A to opakované hodnocení bych řešil rovnou u zobrazení, odpadne ti většina kontrol zůstala by jen ta na body a bude ti stačit jednoduchý insert.

Nahlásit jako SPAM
IP: 91.139.9.–
peter
~ Anonymní uživatel
4016 příspěvků
2. 5. 2019   #10
-
0
-

Kit to nejspis myslel tak, ze zbytecne posilas 10x insert, kdyz staci jednou.
 

INSERT INTO sales.promotions (
    promotion_name,
    discount,
    start_date,
    expired_date
)
VALUES
    (
        '2019 Summer Promotion',
        0.15,
        '20190601',
        '20190901'
    ),
    (
        '2019 Fall Promotion',
        0.20,
        '20191001',
        '20191101'
    ),
    (
        '2019 Winter Promotion',
        0.25,
        '20191201',
        '20200101'
    );
Nahlásit jako SPAM
IP: 2001:718:2601:258:4dbc:3838:5a25:f2e0...–
pepko1430
Newbie
2. 5. 2019   #11
-
0
-

#10 peter

Prikladám obrázok pre predstavu ako to vyzerá.

Připojen obrázek.

Funguje to tak, že na tejto stránke sa zobrazí posledných 10 vín, ktoré sa už hodnotili.
To prvé hodnotenie je také pracné, kde si musíte vyklikať všetky hodnoty.
Aby sa veci urýchlili, vytvoril som rýchly formulár, ktorý načíta dáta z už vložených hodnôt. Teda posledných 10 vín, ktoré sa hodnotili. Ostatní si už len potom nahádžu body.

A prečo dávam insert 10x?

No preto, že zakaždým potrebujem overiť či dali body do prázdnych koloniek, pretože nikto nehodnotí všetkých posledných 10 vín, ale len povedzme 3, alebo posledné a 3tie od konca... 

Potrebujem skrátka vykonať kontrolu prázdnych a vyplnených hodnôt a pridajú sa len tie, ktoré sú vyplnené. Taktiež si musím overiť či už náhodou dané víno už nehodnotili.

Ja neviem ako dať príkaz do databázy aby sa toto urobilo. Viem to len cez php.

Samozrejme, ak by museli vyplniť všetkých 10 hodnôt, tak by som dal jednorazový insert pre všetky hodnoty naraz.

Nahlásit jako SPAM
IP: 213.151.235.–
Kit+15
Guru
2. 5. 2019   #12
-
0
-

#10 peter
Hlavně je tam zbytečný ten SELECT.

Nahlásit jako SPAM
IP: 81.19.3.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Kit+15
Guru
2. 5. 2019   #13
-
0
-

#11 pepko143
V tom formuláři máš jednu zásadní chybu: Organizuješ data po sloupcích místo po řádcích. Navíc zcela zbytečně posíláš z formuláře všechny parametry vín, i když stačí jen číslo dávky a hodnocení, tedy seznam dvojic klíč->hodnota, které projdeš jedním foreach, ve kterém uděláš jen INSERT do databáze.

Pokud chceš, dá se to shrnout do jediného SQL dotazu, ale není to nutné. Spíš před cyklem udělat jeden prepare(), do kterého pak v cyklu posíláš execute().

Nahlásit jako SPAM
IP: 81.19.3.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
pepko1430
Newbie
2. 5. 2019   #14
-
0
-

#13 Kit
Nestačí len číslo dávky. Sú vína, kde je rovnaké číslo dávky, ale iný dátum plnenia. Tiež musím prihliadať na to, ktorý užívateľ to hodnotil, pretože tie vína ktoré už niekto hodnotil, majú všetko rovnaké, len iného hodnotiteľa. Takže musím overovať dávku, dátum aj hodnotiteľa. Možno by som nemusel odrodu a radu, ale pre istotu som to tam dal. Pre predstavu prikladám screeshot databázy, kde si môžete všimnúť rovnaké hodnoty pri rovnakej dávke, jediné čo je iné, je hodnotitel.

Připojen obrázek.

Páni, ale cením si každú Vašu radu a že ste si našli čas. Aspoň som, vďaka Vám, o niečo zvýšil bezpečnosť stránky a začal používať PDO.

Nahlásit jako SPAM
IP: 213.151.235.–
MilanL+1
Grafoman
2. 5. 2019   #15
-
0
-

#14 pepko143
ta tabulka jak to máš je blbost, u každého hodnocení různých uživatelů budeš mít zbytečně duplicitně všechny ty údaje o víně, jak jsem psal dříve #9 zamysli se nad strukturou DB. 

Tabulka 1 "VINA"

ID, Rada, Odroda, Rocnik, Davka, Plneni (jako date, je zbytečné aby to bylo rozkouskované)

*Pokud se odrůdy moc neopakují v různých řadách šlo by sloučit.

Každé víno řada+odrůda+ročník+dávka+ datum plnění bude jen v jedné řádce a bude mít své ID

Tabulka 2 "Hodnocení"

ID, ID_Vina, ID_uzivatele, Datum, Body

lze vytvořit klíč ID_Vina+ID_Uzivatele a zabránit duplicitě a myslím, že lze nastavit i u bodů že nesmí být Null a být v rozsahu 0-100

Nahlásit jako SPAM
IP: 91.139.9.–
MilanL+1
Grafoman
2. 5. 2019   #16
-
0
-

*Pokud se odrůdy moc neopakují v různých řadách šlo by sloučit.

Vypadlo mi tam, že na řady a odrůdy by měly být zvláštní tabulky/tabulka v případě sloučení - lze pak použít na jednoduché filtry.

Ještě je jedna možnost řešení kontroly na ty duplicity a body, udělat to jako proceduru v DB.

A nevím co brání tomu, aby se již hodnocená vína uživateli nezobrazovala nebo zobrazovala včetně toho hodnocení.

Nahlásit jako SPAM
IP: 91.139.9.–
Kit+15
Guru
2. 5. 2019   #17
-
0
-

#14 pepko143
Aha, myslel jsem si, že `davka == id`. No tak z formuláře posílej pouze ID a hodnocení. Nic jiného není třeba a ani to není žádoucí - ostatní údaje už máš v databázi.

O potlačení duplicit se postará sama databáze, to se v aplikaci neřeší.

Nahlásit jako SPAM
IP: 81.19.3.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Kit+15
Guru
2. 5. 2019   #18
-
0
-

#14 pepko143
Proč máš zvlášť 3 sloupce plnění den, měsíc a rok, když můžeš použít typ DATE?

Také odrůdy by měly být v samostatném číselníku: ID, rada, odruda

Tabulka `Dávka` by měla obsahovat sloupce: ID, odruda_id, rocnik, plneni_date

Tabulka `Hodnocení` pak bude mít jen: ID, davka_id, hodnotitel_id, datum, body

Nad tabulkou Hodnocení uděláš unique nad dvojicí sloupců (davka_id, hodnotitel_id). To ti zajistí, že hodnotitel nezapíše duplicitní hodnocení.

Nahlásit jako SPAM
IP: 81.19.3.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
MilanL+1
Grafoman
3. 5. 2019   #19
-
0
-

#18 Kit
tu dávku musí mít zvlášť, psal 

Nestačí len číslo dávky. Sú vína, kde je rovnaké číslo dávky, ale iný dátum plnenia.

takže ID, Davka, Odruda_ID, Rocnik, Plneni [, Hodnotit]

pokud se dávka neopakuje mezi odrůdami, byla by ještě varianta s Plněním zvlášť

[ID,] Davka, Odruda_ID, Rocnik

Davka_ID, Plneni [, Hodnotit]

Hodnotit by byl datum od kdy se má zařazovat do hodnocení, případně by to mohlo být jen označení pro podmínku v seznamu k hodnocení.

Nahlásit jako SPAM
IP: 91.139.9.–
pepko1430
Newbie
3. 5. 2019   #20
-
0
-

Ahojte

Zasypali ste ma informáciami :-). 

Máte pravdu, mal som to dať do viacej tabuliek. Avšak vtedy som vedel len, že také existuje, ešte som s tým nepracoval. Pred tým sa mi písali aj mená do tejto tabuľky, neskôr som im dal idčka.

Isto to chcem implementovať, len teraz tuho rozmýšlam ako premigrujem tie dáta (užívatelia s hodnotením).

A prečo mám date rozkúskovaný? Prišlo mi to ako dobrý nápad ukladať si dni, mesiace a roky zvlášť pre lepšiu filtráciu :-). Ano ano, ja viem, že vy by ste to robili cez date... ok, zmením aj to. 

Si teraz pripadám ako žiak v triede :D. Ale dobre dobre, aspoň ma to posunie vpred.

Nahlásit jako SPAM
IP: 213.151.235.–
pepko1430
Newbie
3. 5. 2019   #21
-
0
-

#20 pepko143
id_vina som si priradil:

	$xy = 1;
	$db = DB();
	$vypis = $db->query("SELECT * FROM hodnotenie GROUP BY plnenie_den, plnenie_mesiac, davka ");

	foreach ($vypis as $spolu) 
	{ 
	$db = DB();
	$vypis = $db->query("
UPDATE hodnotenie SET id_vina = '$xy' WHERE davka = '$spolu[11]' AND plnenie_den = '$spolu[8]' AND plnenie_mesiac = '$spolu[9]' AND plnenie_rok = '$spolu[10]'
		                   			 ");
		$xy++;
	}
Nahlásit jako SPAM
IP: 213.151.235.–
pepko1430
Newbie
13. 6. 2019   #22
-
0
-

Aby som túto tému ešte uzavrel. 
Tak, riadil som sa Vašimi radami a všetko som to pomenil, tak ako ste hovorili.
Momentálne mám v db 3 tabuľky:

users - databáza užívateľov
vina - databáza vín, ktoré sa bodovali, pritom tam nie sú duplicity
bodovanie - databáza bodovania daných vín jednotlivými užívateľmi

Je to samozrejme lepšie.

Prikladám screenshot štruktúr databáz.

Připojen obrázek.

Nahlásit jako SPAM
IP: 213.151.235.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 14 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý