Ahojte,
Ďakujem Vám za reakcie.
Dostal som sa k tomu až teraz a už nerozumiem ani tomu svojmu kódu :D
Pozriem sa na Vaše rady a aplikujem ich.
#16 peter
Ahoj Peter
Nemal som problém s rozoznaním stringu od konštanty.
Mal som problém, že som nevedel uložiť konštantu do premennej.
Skrátka mi ju vôbec nebralo, pritom pri INSERT na inej stránke mi to fungovalo.
Napokon sa to vyriešilo UPDATOM cez PDO.
PDO bolo koniec koncov použité aj pri INSERTE na inej stránke.
Neviem síce prečo to PDO vyriešilo, ale funguje to.
Ak by si vedel, prečo to v PDO ten NULL do premennej berie a klasické vloženie do db cez query nie, tak to by bolo zaujímavé vedieť. Pretože vloženie hodnôt mi fungovalo aj cez query, klasické vkladanie do db. No konštantu NULL to už nebralo, to až spôsob zápisu do db cez PDO.
#11 Kit
Ďakujem za obsiahlejšiu odpoveď Kit!
Nepomohlo mi to síce v tejto formulácii, ale ma to nasmerovalo.
Fungovalo mi až toto:
$db = DB();
$data = $db->prepare("
UPDATE vstupnakontrola
SET nadoba = ?,
odroda = ?,
faza = ?,
sovolne = ?
WHERE id_vstupnakontrola = ? ");
$vysledok = $data->execute(array(
$nadoba,
$odroda,
$faza,
$sovolne,
$id
));
Čerpal som z: https://jecas.cz/pdo
#7 Kit
Veď nie je v apostrofoch.
No a dole v tom UPDATE ich nemôžem odstrániť okolo premennej, potom by to nefungovalo.
Keby tam vložím NULL na priamo, bez apostrofov, tak áno, potom by to fungovalo, lenže to neplní účel.
Ja potrebujem aby sa tam doplnilo NULL len vtedy keď sa odošle v updatovacom formulári prázdna hodnota.
No a to mi jednoducho nechce vziať do premennej, keď to pozerám cez print_r(), tak mi nič nevypíše.
Ahojte
Prosím Vás, začal som mať tento problém pri UPDATE.
Pri INSERT mi to funguje tak ako som uviedol vyššie, inak ďakujem za rady.
Ale pri UPDATE mi to nechce fungovať ani za svet.
Tu je kód:
<?php require_once "../_inc/config.php" ?>
<?php
$id = trim($_POST['id']);
$nadoba = trim($_POST['nadoba']);
$odroda = trim($_POST['odroda']);
$faza = trim($_POST['faza']);
$sovolne = trim($_POST['sovolne']);
if (empty($sovolne)) { $sovolne = NULL; }
$db = DB();
$edit_item = $db->query("
UPDATE vstupnakontrola
SET nadoba = '$nadoba',
odroda = '$odroda',
faza = '$faza',
sovolne = '$sovolne'
WHERE id_vstupnakontrola = '$id'
");
if ($edit_item ) {
die(header("Location: ../pages/zaznam.php"));
} else {
echo 'Nastala chyba, skúste to prosím neskôr';
echo '<a class="menu_button" href=" <?php echo BASE_URL; ?>../pages/profile.php ">Domov</a>';
}
?>
Ak dám do formuálru hodnotu, tak to funguje, tiež ak pridám miesto: '$sovolne' NULL tak to ide.
Nefunguje mi to však tak, že sa snažím vložiť do premennej NULL a neviem prečo.
Už som skúšal všetko možné, tiež som hľadal na fórach, avšak v podstate tam písali len o tom čo som už skúsil. Prečo nemôže zobrať ten databázový UPDATE hodnotu NULL z tej premennej?
Skúšal som to aj cez pole, ale bez úspechu...
#2 MilanL
Ahoj Milan, ďakujem za odpoveď. Napokon som to vyriešil takto:
<?php include '../_inc/config.php' ?>
<?php
/*príjem hodnôt z formulára*/
$nadoba = htmlspecialchars($_POST['nadoba']);
$odroda = htmlspecialchars($_POST['odroda']);
$faza = htmlspecialchars($_POST['faza']);
$sovolne = htmlspecialchars($_POST['sovolne']);
if (empty($sovolne)) {
$sovolne = NULL;
}
$db = DB();
$data = $db->prepare("
INSERT INTO vstupnakontrola
(nadoba, odroda, faza, sovolne)
VALUES
(:nadoba,:odroda,:faza,:sovolne)
");
$data->execute(array(
":nadoba" => $nadoba,
":odroda" => $odroda,
":faza" => $faza,
":sovolne" => $sovolne
));
?>
Aj tak mi príde divné, že musím takto ošetriť prázdne hodnoty.
Ide o to, že sa nemusia vyplniť všetky hodnoty vo formulári a budú sa môcť pridať, upraviť neskôr daným užívateľom. Doteraz som robil len formuláre, kde sa musia vyplniť všetky hodnoty, poprípade to neboli prázdne intiger hodnoty. Dúfal som v nejaké elegantnejšie riešenie, ako toto, čo som pridal ja.
Ahojte
Určite máte túto banalitu už dávno vyriešenú, no ja sa nemôžem dopátrať nikde odpovede.
Ako prosím riešite ak máte formulár s prázdnou hodnotou, kde môže byť len číslo.
Z tohto formulára chcete zapísať hodnoty do databázy, ale niektoré polia sú prázdne.
Pri char to nie je problém, skrátka zostane v databáze prázdne políčko ale pri int to problém je, nakoľko sa z formulára posiela prázdna hodnota, ktorá je braná ako string. Ja by som potreboval, aby to tam dávalo NULL, no a nulové hodnoty mám povolené, ale skrátka, pretože to nie je int, tak sa zápis vôbec nestane.
Ahojte
Chcel by som Váš požiadať o názor na tento kód.
Vytvoril som stránku, kde sa bodujú výrobky... na stránke, kde sa zobrazujú štatistické hodnoty je tabuľka, kde je zobrazená aktivita hodnotiteľov za posledných 12 mesiacov. Teda koľkokrát hodnotili za daný mesiac. Funguje to, ale ten kód sa mi nezdá byť ani trochu dobrý. Príde mi veľmi dlhý a neohrabaný. Vedeli by ste mi povedať, naviesť ma, ako ho zmenšiť? Poprípade zacykliť?
Výsledok vyzerá takto:
No a toto je ten kód:
<!--
----------------------------------------------------------------------------
Aktivita hodnotiteľov za posledných 12 mesiacov
----------------------------------------------------------------------------
-->
<h2 class="popis_tabuliek">Aktivita enológov (počet bodovaní) za posledných 12 mesiacov</h2>
<table class="statistika_aktivita">
<?php
function mesiac($datum) {
if ($datum == '01') {echo 'jan';}
elseif ($datum == '02') {echo 'feb';}
elseif ($datum == '03') {echo 'mar';}
elseif ($datum == '04') {echo 'apr';}
elseif ($datum == '05') {echo 'máj';}
elseif ($datum == '06') {echo 'jún';}
elseif ($datum == '07') {echo 'júl';}
elseif ($datum == '08') {echo 'aug';}
elseif ($datum == '09') {echo 'sep';}
elseif ($datum == '10') {echo 'okt';}
elseif ($datum == '11') {echo 'nov';}
elseif ($datum == '12') {echo 'dec';}
elseif ($datum == '0') {echo 'dec';}
elseif ($datum == '-1') {echo 'jan';}
elseif ($datum == '-2') {echo 'feb';}
elseif ($datum == '-3') {echo 'mar';}
elseif ($datum == '-4') {echo 'apr';}
elseif ($datum == '-5') {echo 'máj';}
elseif ($datum == '-6') {echo 'jún';}
elseif ($datum == '-7') {echo 'júl';}
elseif ($datum == '-8') {echo 'aug';}
elseif ($datum == '-9') {echo 'sep';}
elseif ($datum == '-10') {echo 'okt';}
elseif ($datum == '-11') {echo 'nov';}
}
?>
<tr>
<th>Meno</th>
<th><?php mesiac(date("m")); ?></th>
<th><?php mesiac(date("m")-1); ?></th>
<th><?php mesiac(date("m")-2); ?></th>
<th><?php mesiac(date("m")-3); ?></th>
<th><?php mesiac(date("m")-4); ?></th>
<th><?php mesiac(date("m")-5); ?></th>
<th><?php mesiac(date("m")-6); ?></th>
<th><?php mesiac(date("m")-7); ?></th>
<th><?php mesiac(date("m")-8); ?></th>
<th><?php mesiac(date("m")-9); ?></th>
<th><?php mesiac(date("m")-10); ?></th>
<th><?php mesiac(date("m")-11); ?></th>
<th>Priemer</th>
</tr>
<?php
$db = DB();
$dvanastmesiace = $db->query("
SELECT user_id, name,
IFNULL(tento.pocet,0) as tento,
IFNULL(minusjeden.pocet,0) as minusjeden,
IFNULL(minusdva.pocet,0) as minusdva,
IFNULL(minustri.pocet,0) as minustri,
IFNULL(minusstyri.pocet,0) as minusstyri,
IFNULL(minuspat.pocet,0) as minuspat,
IFNULL(minussest.pocet,0) as minussest,
IFNULL(minussedem.pocet,0) as minussedem,
IFNULL(minusosem.pocet,0) as minusosem,
IFNULL(minusdevat.pocet,0) as minusdevat,
IFNULL(minusdesat.pocet,0) as minusdesat,
IFNULL(minusjedenast.pocet,0) as minusjedenast,
IFNULL(minusdvanast.pocet,0) as minusdvanast,
(
IFNULL(tento.pocet,0) +
IFNULL(minusjeden.pocet,0) +
IFNULL(minusdva.pocet,0) +
IFNULL(minustri.pocet,0) +
IFNULL(minusstyri.pocet,0) +
IFNULL(minuspat.pocet,0) +
IFNULL(minussest.pocet,0) +
IFNULL(minussedem.pocet,0) +
IFNULL(minusosem.pocet,0) +
IFNULL(minusdevat.pocet,0) +
IFNULL(minusdesat.pocet,0) +
IFNULL(minusjedenast.pocet,0) +
IFNULL(minusdvanast.pocet,0)/13
) as priemer
FROM users
LEFT JOIN (
SELECT id_uzivatela, COUNT(body) as pocet
FROM bodovanie
JOIN vina ON id_vino = id_vino_b
WHERE MONTH(date) = MONTH(CURRENT_DATE())
GROUP BY id_uzivatela ) tento on tento.id_uzivatela = user_id
LEFT JOIN (
SELECT id_uzivatela, COUNT(body) as pocet
FROM bodovanie
JOIN vina ON id_vino = id_vino_b
WHERE MONTH(date) = MONTH(CURRENT_DATE())-1
GROUP BY id_uzivatela ) minusjeden on minusjeden.id_uzivatela = user_id
LEFT JOIN (
SELECT id_uzivatela, COUNT(body) as pocet
FROM bodovanie
JOIN vina ON id_vino = id_vino_b
WHERE MONTH(date) = MONTH(CURRENT_DATE())-2
GROUP BY id_uzivatela ) minusdva on minusdva.id_uzivatela = user_id
LEFT JOIN (
SELECT id_uzivatela, COUNT(body) as pocet
FROM bodovanie
JOIN vina ON id_vino = id_vino_b
WHERE MONTH(date) = MONTH(CURRENT_DATE())-3
GROUP BY id_uzivatela ) minustri on minustri.id_uzivatela = user_id
LEFT JOIN (
SELECT id_uzivatela, COUNT(body) as pocet
FROM bodovanie
JOIN vina ON id_vino = id_vino_b
WHERE MONTH(date) = MONTH(CURRENT_DATE())-4
GROUP BY id_uzivatela ) minusstyri on minusstyri.id_uzivatela = user_id
LEFT JOIN (
SELECT id_uzivatela, COUNT(body) as pocet
FROM bodovanie
JOIN vina ON id_vino = id_vino_b
WHERE MONTH(date) = MONTH(CURRENT_DATE())-5
GROUP BY id_uzivatela ) minuspat on minuspat.id_uzivatela = user_id
LEFT JOIN (
SELECT id_uzivatela, COUNT(body) as pocet
FROM bodovanie
JOIN vina ON id_vino = id_vino_b
WHERE MONTH(date) = MONTH(CURRENT_DATE())-6
GROUP BY id_uzivatela ) minussest on minussest.id_uzivatela = user_id
LEFT JOIN (
SELECT id_uzivatela, COUNT(body) as pocet
FROM bodovanie
JOIN vina ON id_vino = id_vino_b
WHERE MONTH(date) = MONTH(CURRENT_DATE())-7
GROUP BY id_uzivatela ) minussedem on minussedem.id_uzivatela = user_id
LEFT JOIN (
SELECT id_uzivatela, COUNT(body) as pocet
FROM bodovanie
JOIN vina ON id_vino = id_vino_b
WHERE MONTH(date) = MONTH(CURRENT_DATE())-8
GROUP BY id_uzivatela ) minusosem on minusosem.id_uzivatela = user_id
LEFT JOIN (
SELECT id_uzivatela, COUNT(body) as pocet
FROM bodovanie
JOIN vina ON id_vino = id_vino_b
WHERE MONTH(date) = MONTH(CURRENT_DATE())-9
GROUP BY id_uzivatela ) minusdevat on minusdevat.id_uzivatela = user_id
LEFT JOIN (
SELECT id_uzivatela, COUNT(body) as pocet
FROM bodovanie
JOIN vina ON id_vino = id_vino_b
WHERE MONTH(date) = MONTH(CURRENT_DATE())-10
GROUP BY id_uzivatela ) minusdesat on minusdesat.id_uzivatela = user_id
LEFT JOIN (
SELECT id_uzivatela, COUNT(body) as pocet
FROM bodovanie
JOIN vina ON id_vino = id_vino_b
WHERE MONTH(date) = MONTH(CURRENT_DATE())-11
GROUP BY id_uzivatela ) minusjedenast on minusjedenast.id_uzivatela = user_id
LEFT JOIN (
SELECT id_uzivatela, COUNT(body) as pocet
FROM bodovanie
JOIN vina ON id_vino = id_vino_b
WHERE MONTH(date) = MONTH(CURRENT_DATE())-12
GROUP BY id_uzivatela ) minusdvanast on minusdvanast.id_uzivatela = user_id
WHERE
(
IFNULL(tento.pocet,0) +
IFNULL(minusjeden.pocet,0) +
IFNULL(minusdva.pocet,0) +
IFNULL(minustri.pocet,0) +
IFNULL(minusstyri.pocet,0) +
IFNULL(minuspat.pocet,0) +
IFNULL(minussest.pocet,0) +
IFNULL(minussedem.pocet,0) +
IFNULL(minusosem.pocet,0) +
IFNULL(minusdevat.pocet,0) +
IFNULL(minusdesat.pocet,0) +
IFNULL(minusjedenast.pocet,0) +
IFNULL(minusdvanast.pocet,0)
) != 0
");
foreach ($dvanastmesiace as $mesiace) {
echo '<tr>
<td>'.$mesiace[1].'</td>'.
'<td>'.$mesiace[2].'</td>'.
'<td>'.$mesiace[3].'</td>'.
'<td>'.$mesiace[4].'</td>'.
'<td>'.$mesiace[5].'</td>'.
'<td>'.$mesiace[6].'</td>'.
'<td>'.$mesiace[7].'</td>'.
'<td>'.$mesiace[8].'</td>'.
'<td>'.$mesiace[9].'</td>'.
'<td>'.$mesiace[10].'</td>'.
'<td>'.$mesiace[11].'</td>'.
'<td>'.$mesiace[12].'</td>'.
'<td>'.$mesiace[13].'</td>'.
'<td>'.$mesiace[13].'</td>
</tr>';
}
?>
</table>
#9 MilanL
Takto mi to funguje:
SELECT user_id, name, st.priemer as stolove, ak.priemer as akostne, cl.priemer as celkovy
FROM users
LEFT JOIN (
SELECT id_uzivatela, AVG(body) as priemer
FROM bodovanie
JOIN vina ON id_vino = id_vino_b
WHERE rada = 'Stolové'
GROUP BY id_uzivatela) st on st.id_uzivatela = user_id
LEFT JOIN (
SELECT id_uzivatela, AVG(body) as priemer
FROM bodovanie
JOIN vina ON id_vino = id_vino_b
WHERE rada = 'Akostné'
GROUP BY id_uzivatela) ak on ak.id_uzivatela = user_id
LEFT JOIN (
SELECT id_uzivatela, AVG(body) as priemer
FROM bodovanie
JOIN vina ON id_vino = id_vino_b
GROUP BY id_uzivatela) cl on cl.id_uzivatela = user_id
WHERE cl.Priemer IS NOT NULL
ORDER BY celkovy
Tu podmienku WHERE som dával pred ORDER, ale ja som to nedal ako cl.Priemer, ale ako celkovy, súdiac, že hore som to tak uložil. No a selektujem to podľa cl.Priemer, nie St.Priemer, pretože mi nevadí ak je kolónka st.priemer prázdna a iné sú plné, len ten celkový priemer ak je prázdny, nemá zmysel ukazovať užívateľa.
Tak ďakujem upravil som to teda takto.
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.
Ďakujem, ale to je v db pod označením name, meno a priezvisko spolu.
Celý web slúži pre interné použitie firmy, kde sa hodnotia vína a z toho vychádzajú štatistické údaje.
Určite súhlasím, že by bolo lepšie evidovať meno a priezvisko zvlášť.
Možno to neskôr zmením... zatiaľ to nehrá nejakú veľkú rolu.
Užívateľov radím v tomto danom prípade podla celkového priemerného hodnotenia.
Podľa možností sa snažím vytvoriť medzi nimi akýsi druh súťaživosti, kde sa monitoruje aj ich aktivita, aby ich to viac bavilo.
Hmm a čo sa týka toho RIGHT JOIN, tak asi by to mohlo robiť problémy.
Zmenil som teda prvé dva na LEFT a posledné celkové na RIGHT, tým pádom by sa nemali zobrazovať nulové hodnoty užívateľov, ktorí vôbec nič nehodnotili, ale môžu sa zobrazovať hodnoty užívateľov, ktorí už začali hodnotiť, no nemajú ohodnotené ešte všetky rady... Aby to dávalo rovnaký počet riadkov. Ďakujem za pripomienku Milan.
Prosím ťa, poradil by si mi ešte ako zakázať zobrazovanie hodnotiteľov, ktorí nič nehodnotili?
Chcel som dať podmienku IS NOT NULL k celkovému priemeru, ale neberie mi to...
SELECT user_id, name, st.priemer as stolove, ak.priemer as akostne, cl.priemer as celkovy
FROM users
LEFT JOIN (
SELECT id_uzivatela, AVG(body) as priemer
FROM bodovanie
JOIN vina ON id_vino = id_vino_b
WHERE rada = 'Stolové'
GROUP BY id_uzivatela) st on st.id_uzivatela = user_id
LEFT JOIN (
SELECT id_uzivatela, AVG(body) as priemer
FROM bodovanie
JOIN vina ON id_vino = id_vino_b
WHERE rada = 'Akostné'
GROUP BY id_uzivatela) ak on ak.id_uzivatela = user_id
LEFT JOIN (
SELECT id_uzivatela, AVG(body) as priemer
FROM bodovanie
JOIN vina ON id_vino = id_vino_b
GROUP BY id_uzivatela) cl on cl.id_uzivatela = user_id
ORDER BY celkovy
Ďakujem ti za usmernenie.
Najprv mi to nefungovalo a nerozumel som niektorým veciam, ale som si to pozrel a už mi to ide.
Super, zase viem niečo nové :-)
Takto mi to ide:
SELECT user_id, name, st.priemer as stolove, ak.priemer as akostne
FROM users
LEFT JOIN (
SELECT id_uzivatela, AVG(body) as priemer
FROM bodovanie
JOIN vina ON id_vino = id_vino_b
WHERE rada = 'Stolové'
GROUP BY id_uzivatela) st on st.id_uzivatela = user_id
LEFT JOIN (
SELECT id_uzivatela, AVG(body) as priemer
FROM bodovanie
JOIN vina ON id_vino = id_vino_b
WHERE rada = 'Akostné'
GROUP BY id_uzivatela) ak on ak.id_uzivatela = user_id
ORDER BY user_id
Ahojte
Prosím Vás, vedeli by ste mi poradiť s týmto spojením stĺpcov?
Mám tieto dva príkazy:
Prvý príkaz:
SELECT name, AVG(body)
FROM users
JOIN bodovanie ON user_id = id_uzivatela
JOIN vina ON id_vino = id_vino_b
WHERE rada = 'Stolové'
GROUP BY id_uzivatela ORDER BY AVG(body)
Druhý príkaz:
SELECT AVG(body)
FROM users
JOIN bodovanie ON user_id = id_uzivatela
JOIN vina ON id_vino = id_vino_b
WHERE rada = 'Akostné'
GROUP BY id_uzivatela ORDER BY AVG(body)
Výsledok z prvého príkazu vyzerá takto:
Chcel by som vedieť ako spojiť tieto dve tabuľky, že hneď vedľa by bol stĺpec z toho druhého príkazu.
Počet riadkov je tam rovnaký.
Neviem tie dve tabuľky spojiť.
#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++;
}
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.
#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á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.
#10 peter
Prikladám obrázok pre predstavu ako to vyzerá.
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.
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"));
}
?>
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.