Diskuze: SELECT pro poslední řádek s filtrem ?
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.


Michal Štěpánek:14.2.2017 12:07
Ano, záleží na tom, podle čeho určuješ, že je ten záznam/řádek poslední...
SELECT MAX(id), jmeno, pohlavi... FROM tabulka WHERE podmínky
Michal Štěpánek:15.2.2017 7:17
To jsem asi nepochopil... Co to je "něco jako pole"? SELECT ti vytáhne
přesně to, co mu přikážeš (pokud to samozřejmě v té DB je). S
výsledkem si můžeš naložit dle libosti => nechat vypsat do listu,
uložit do DataTable, apod...
P.S. Používej tlačítko odpovědět, jinak mi nepřijde notifikace do mailu a
pak o tvé reakci nevím...
Taky úplně nerozumím tomu, co potřebuješ.
Souhlasím s Michalem, že poslední řádek můžeš vybrat pomocí funkce
MAX(ID). (Za předpokladu, že sloupec je typu Identity s automatickým
inkrementem)
Jestli to dobře chápu, tak se pokoušíš Selectu říct, že má zobrazit
slouped qA01_1 pokud má hodnotu 1 nebo 0.
Něco jako:
SELECT jmeno, (Pokud sloupec qA01_1 = 1, tak qA01_1, jinak sloupec nevybírej),
FROM....
Tak tohle NEJDE.
Můžeš ale udělat toho:
SELECT sloupec1, sloupec2, (ISNULL(sloupec1, 0) + (ISNULL(sloupec2, 0) AS soucet
FROM (
SELECT CASE WHEN qA01_1 IN (1,0) THEN qA01_1 ELSE NULL END AS sloupec1,
CASE WHEN qA01_2 IN (1,0) THEN qA01_2 ELSE NULL END AS sloupec2,
and,
FROM Tabulka
WHERE ID = (SELECT MAX(ID) FROM Tabulka)
) X
Zdenek:17.2.2017 22:15
Celkem dobře to chápete. Vždy z posledního záznamu potřebuji zobrazit názvy sloupců, které obsahují buď hodnotu 1 neb 0 a současně bych chtěl udělat součet všech jedniček. Přikládám obrázek.
Michal Štěpánek:19.2.2017 9:22
Součet jedniček čeho? Ve vybraném záznamu? Nebo součet všech jedniček v nějakém sloupci, nebo součet všech jedniček v tabulce?
Michal Štěpánek:19.2.2017 13:37
Jestli jsem to správně pochopil, ty "sčítané" sloupce můžou být jen 1 nebo 0, takže je pohodlně můžeš sečíst všechny, ne?
SELECT (sloupec1 + sloupec1 + sloupec3 +...) FROM Tabulka WHERE podmínky...
Zdenek:20.2.2017 7:34
Ano, chápeš správně .Mám to napsané, ale pořád dokola mi to háže součet 7, což je
nesmysl. Co se týče podmínek, tak ty jsem neaplikoval. Ale dalo by se napsat
nějak zkráceně "sečti hodnoty posledního záznamu, kde jsou hodnoty pouze
1" ?
$qry = mysql_query("SELECT (qA01_1 + qA01_2 + qA01_3 + qA01_4 + qA01_5
+ qA02_1 + qA02_2 + qA02_3 + qA02_4 + qA02_5
+ qA03_1 + qA03_2 + qA03_3 + qA03_4 + qA03_5
+ qA04_1 + qA04_2 + qA04_3 + qA04_4 + qA04_5
+ qA05_1 + qA05_2 + qA05_3 + qA05_4 + qA05_5
+ qA06_1 + qA06_2 + qA06_3 + qA06_4 + qA06_5
+ qA07_1 + qA07_2 + qA07_3 + qA07_4 + qA07_5
+ qA08_1 + qA08_2 + qA08_3 + qA08_4 + qA08_5
+ qA09_1 + qA09_2 + qA09_3 + qA09_4 + qA09_5
+ qA10_1 + qA10_2 + qA10_3 + qA10_4 + qA10_5
+ qA11_1 + qA11_2 + qA11_3 + qA11_4 + qA11_5
+ qA12_1 + qA12_2 + qA12_3 + qA12_4 + qA12_5
+ qA13_1 + qA13_2 + qA13_3 + qA13_4 + qA13_5
+ qA14_1 + qA14_2 + qA14_3 + qA14_4 + qA14_5
+ qA15_1 + qA15_2 + qA15_3 + qA15_4 + qA15_5
+ qA16_1 + qA16_2 + qA16_3 + qA16_4 + qA16_5
+ qA17_1 + qA17_2 + qA17_3 + qA17_4 + qA17_5
+ qA18_1 + qA18_2 + qA18_3 + qA18_4 + qA18_5
+ qA19_1 + qA19_2 + qA19_3 + qA19_4 + qA19_5
+ qA20_1 + qA20_2 + qA20_3 + qA20_4 + qA20_5
+ qA21_1 + qA21_2 + qA21_3 + qA21_4 + qA21_5
+ qA22_1 + qA22_2 + qA22_3 + qA22_4 + qA22_5
+ qA23_1 + qA23_2 + qA23_3 + qA23_4 + qA23_5
+ qA24_1 + qA24_2 + qA24_3 + qA24_4 + qA24_5
+ qA25_1 + qA25_2 + qA25_3 + qA25_4 + qA25_5
+ qA26_1 + qA26_2 + qA26_3 + qA26_4 + qA26_5
+ qA27_1 + qA27_2 + qA27_3 + qA27_4 + qA27_5
+ qA28_1 + qA28_2 + qA28_3 + qA28_4 + qA28_5
+ qA29_1 + qA29_2 + qA29_3 + qA29_4 + qA29_5
+ qA30_1 + qA30_2 + qA30_3 + qA30_4 + qA30_5) FROM tabulka");
$row = mysql_fetch_array($qry);
echo "<br/>Soucet:"." ".round($qry,0);
Michal Štěpánek:20.2.2017 7:55
Pokud hodnota může být jen 0 nebo 1, tak je přeci zbytečné vybírat podmínkou ty "jedničkové", ale omezit podmínku na konkrétní záznam bys měl...
Zdenek:20.2.2017 8:33
Hodnota může být 0 nebo 1 nebo prázdná. A nevím co to udělá, pokud sčítám prázdnou hodnotu. Nevím proč mi to hází pokaždé součet 7, když je třeba součet všech jedniček 9. Ale jak píšeš, může to dělat to, že nemám nadefinovaný poslední záznam. Může to být napsáno takto ?
$qry = mysql_query("SELECT (qA01_1 + qA01_2 + qA01_3 + qA01_4 + qA01_5
+ qA02_1 + qA02_2 + qA02_3 + qA02_4 + qA02_5
+ qA03_1 + qA03_2 + qA03_3 + qA03_4 + qA03_5
+ qA04_1 + qA04_2 + qA04_3 + qA04_4 + qA04_5
+ qA05_1 + qA05_2 + qA05_3 + qA05_4 + qA05_5
+ qA06_1 + qA06_2 + qA06_3 + qA06_4 + qA06_5
+ qA07_1 + qA07_2 + qA07_3 + qA07_4 + qA07_5
+ qA08_1 + qA08_2 + qA08_3 + qA08_4 + qA08_5
+ qA09_1 + qA09_2 + qA09_3 + qA09_4 + qA09_5
+ qA10_1 + qA10_2 + qA10_3 + qA10_4 + qA10_5
+ qA11_1 + qA11_2 + qA11_3 + qA11_4 + qA11_5
+ qA12_1 + qA12_2 + qA12_3 + qA12_4 + qA12_5
+ qA13_1 + qA13_2 + qA13_3 + qA13_4 + qA13_5
+ qA14_1 + qA14_2 + qA14_3 + qA14_4 + qA14_5
+ qA15_1 + qA15_2 + qA15_3 + qA15_4 + qA15_5
+ qA16_1 + qA16_2 + qA16_3 + qA16_4 + qA16_5
+ qA17_1 + qA17_2 + qA17_3 + qA17_4 + qA17_5
+ qA18_1 + qA18_2 + qA18_3 + qA18_4 + qA18_5
+ qA19_1 + qA19_2 + qA19_3 + qA19_4 + qA19_5
+ qA20_1 + qA20_2 + qA20_3 + qA20_4 + qA20_5
+ qA21_1 + qA21_2 + qA21_3 + qA21_4 + qA21_5
+ qA22_1 + qA22_2 + qA22_3 + qA22_4 + qA22_5
+ qA23_1 + qA23_2 + qA23_3 + qA23_4 + qA23_5
+ qA24_1 + qA24_2 + qA24_3 + qA24_4 + qA24_5
+ qA25_1 + qA25_2 + qA25_3 + qA25_4 + qA25_5
+ qA26_1 + qA26_2 + qA26_3 + qA26_4 + qA26_5
+ qA27_1 + qA27_2 + qA27_3 + qA27_4 + qA27_5
+ qA28_1 + qA28_2 + qA28_3 + qA28_4 + qA28_5
+ qA29_1 + qA29_2 + qA29_3 + qA29_4 + qA29_5
+ qA30_1 + qA30_2 + qA30_3 + qA30_4 + qA30_5) FROM tabulka WHERE id = (SELECT MAX(id))");
$row = mysql_fetch_array($qry);
echo "<br/>Soucet:"." ".round($qry,0);
Michal Štěpánek:20.2.2017 8:43
Ten SELECT je tam asi navíc, musel bys upřesnit odkud má selectovat, podle mě by mělo stačit takto (ale nezkoušel jsem to)
...FROM tabulka WHERE id = MAX(id)");
Abych pravdu řekl nevím, jak je to se sčítáním "null" hodnot, ale
myslím, že by je to mělo jednoduše přeskočit...
Pokud by to automaticky nepřeskakovalo null hodnoty, asi bych si udělal
nějakou funkci, kde bych null nahrazoval nulou...
P.S. Nebylo by lepší rovnou nastavit výchozí hodnotu na "0"? K čemu tam
vlastně to null máš?
Zdenek:20.2.2017 13:19
Zkoušel jsem sečíst jen hodnoty obsahující 1 a součet prostě nesčítá. Takže prázdná hodnota asi nato nemá vliv, chová se to stejně. V DB je zdá se vše ok. Takže z mého laického hlediska mám buď špatně "echo" nebo mnou nepostřehnutelná chyba. Ta NULL u mě znamená, že daná otázka nebyla z náhodného výběru pěti otázek vybrána. Hodnota 1 je pak správná odpověď, hodnota 0 je špatná odpověď.
Nebude tu někde zakopaný pes?
$qry = mysql_query("SELECT (qA01_1 + qA01_2 + qA01_3 + qA01_4 + qA01_5
+ qA02_1 + qA02_2 + qA02_3 + qA02_4 + qA02_5
+ qA03_1 + qA03_2 + qA03_3 + qA03_4 + qA03_5
+ qA04_1 + qA04_2 + qA04_3 + qA04_4 + qA04_5
+ qA05_1 + qA05_2 + qA05_3 + qA05_4 + qA05_5
+ qA06_1 + qA06_2 + qA06_3 + qA06_4 + qA06_5
+ qA07_1 + qA07_2 + qA07_3 + qA07_4 + qA07_5
+ qA08_1 + qA08_2 + qA08_3 + qA08_4 + qA08_5
+ qA09_1 + qA09_2 + qA09_3 + qA09_4 + qA09_5
+ qA10_1 + qA10_2 + qA10_3 + qA10_4 + qA10_5
+ qA11_1 + qA11_2 + qA11_3 + qA11_4 + qA11_5
+ qA12_1 + qA12_2 + qA12_3 + qA12_4 + qA12_5
+ qA13_1 + qA13_2 + qA13_3 + qA13_4 + qA13_5
+ qA14_1 + qA14_2 + qA14_3 + qA14_4 + qA14_5
+ qA15_1 + qA15_2 + qA15_3 + qA15_4 + qA15_5
+ qA16_1 + qA16_2 + qA16_3 + qA16_4 + qA16_5
+ qA17_1 + qA17_2 + qA17_3 + qA17_4 + qA17_5
+ qA18_1 + qA18_2 + qA18_3 + qA18_4 + qA18_5
+ qA19_1 + qA19_2 + qA19_3 + qA19_4 + qA19_5
+ qA20_1 + qA20_2 + qA20_3 + qA20_4 + qA20_5
+ qA21_1 + qA21_2 + qA21_3 + qA21_4 + qA21_5
+ qA22_1 + qA22_2 + qA22_3 + qA22_4 + qA22_5
+ qA23_1 + qA23_2 + qA23_3 + qA23_4 + qA23_5
+ qA24_1 + qA24_2 + qA24_3 + qA24_4 + qA24_5
+ qA25_1 + qA25_2 + qA25_3 + qA25_4 + qA25_5
+ qA26_1 + qA26_2 + qA26_3 + qA26_4 + qA26_5
+ qA27_1 + qA27_2 + qA27_3 + qA27_4 + qA27_5
+ qA28_1 + qA28_2 + qA28_3 + qA28_4 + qA28_5
+ qA29_1 + qA29_2 + qA29_3 + qA29_4 + qA29_5
+ qA30_1 + qA30_2 + qA30_3 + qA30_4 + qA30_5) FROM dospeli WHERE id = MAX(id)");
echo "<br/>Soucet:"." ".$qry;
Michal Štěpánek:20.2.2017 13:22
Nesčítá, nebo jen "špatně sčítá", nebo nevyleze žádné číslo?
$qry je result (nebo NULL) a ne cislo, stejne jako pouziti
$row = mysql_fetch_array($qry);
echo "<br/>Soucet:"." ".round($qry,0);
nedava smysl, melo by to byt
$row = mysql_fetch_array($qry);
echo "<br/>Soucet:"." ".round($row[0],0);
Michal Štěpánek:20.2.2017 13:42
zkusil jsi ten příkaz spustit přímo nad databází bez PHP?
Zdenek:20.2.2017 13:42
@ Jiří
- teď mi to háže tuhle chybu:
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\app_form\input_form32_process.php on line 383
Soucet: 0
Nemůže to být tím, že mám záznamy typu VARCHAR ?
To vypada na chybu jinde, taky se moc nepares s testovanim vysledku, tak se nediv...
if( !$qry )
echo mysql_error();
else{
$row = mysql_fetch_array($qry);
echo "<br/>Soucet:"." ".round($row[0],0);
}
Nahradil jsem toto
$row = mysql_fetch_array($qry);
echo "<br/>Soucet:"." ".round($row[0],0);
tímto
if( !$qry )
echo mysql_error();
else{
$row = mysql_fetch_array($qry);
echo "<br/>Soucet:"." ".round($row[0],0);
}
a řve to
Invalid use of group function
Michal Štěpánek:20.2.2017 15:03
Nemůže to být tím, že mám záznamy typu VARCHAR ?
Chceš tím snad říct, že ty qA01_1 + qA01_2 + qA01_3... nejsou v DB jako
čísla?
Pak se ale nemůžeš divit, že si to sčítá co chce...
Zkus ten dotaz spustit přímo nad databází, co ti z toho vyleze?
Neaktivní uživatel:20.2.2017 15:06
Nejsem si jist, nemělo by být v SQL dotazu místo WHERE
slovo HAVING?
Jinak dej raději na rady ostatních a předělej to celé. Vážně není
normální mít sloupce s názvy qA14_3 a pak psát ty šílené dotazy, ve
kterých můžeš mít chyby...
Nikola Sterziková (PaNika):20.2.2017 16:48
No,
1. v podmínce WHERE by mělo být:
WHERE ID = (SELECT MAX(ID) FROM Tabulka)
a ne
WHERE ID = (MAX(ID) )
2. Pak souhlasím s Míchalem, že pokud sloupce obsahují číslo mají být
typu číslo, nebo v tvém případě, pokud obsahují boolean, tak typu bit(na
SQL Serveru, nevím zda MySql má sloupec typu bit). Pokud to z nějakého
důvodu nemůžeš předělat na číslo/bit, tak musíš přetypovávat v
dotazu (a zase hrozí, že ve sloupci číslo nebude a celé to spande)
např.:
CAST(slopec as int)
3. Při sčítání se musí vždy ošetřovat NULL hodnoty. 1 + NULL je
totiž NULL. Stejně to platí při skládání stringů. 'text' + NULL = NULL.
(tedy na SQL Serveru, ale odhaduji, že MySql se bude chovat stejně)
Tedy např.:
ISNULL(sloupec,0) + ISNULL(sloupec2, 0)
Podívej se na net jaký má MySql ekvivalent funkce ISNUL.
Zdenek:20.2.2017 16:54
@Michal
Tak jsem to testnul a dovolím si tvrdit, že chyba bude v zápisu MAX(id).
Sloupce jsem změnil na typ INT, akorád mi to ted hází místo prázdných
polí samé 0, což jsem nechtěl.
Pokud místo:
...FROM tabulka WHERE id = MAX(id)");
napíšu např.
...FROM tabulka WHERE id = 2;
tak to funguje jako SQL dotaz. Uvidím co to udělá v php.
Michal Štěpánek:20.2.2017 22:39
Zkus
...Where ID in (select MAX(ID) FROM tabulka)
Ahojte,
děkuji všem za pro mě drahocené rady. Správný zápis pro poslední ID je
jak uvádí Nikola:
$qry = mysql_query("SELECT (qA01_1 + ... qA30_5) FROM tabulka WHERE ID = (SELECT MAX(ID) FROM tabulka)");
Takhle to zatím dobře funguje, dokonce jsem změnil v phpMyadmin sloupce na typ VARCHAR a funguje vše i s prázdnými záznamy.
Teď už se jen zbavit hlášek "Undefined index" tedy otázek, které nebyly vybrány a mají prázdnou hodnotu. Vím, že se to dá vypnout, ale raději bych to ošetřil.
Undefined index oddelas, kdyz pred pouzitim indexu v poli otestujes tento index pres isset
Michal Štěpánek:21.2.2017 10:22
Být tebou, tak ty varchary změním na int a hodnocení pak třeba na 0,1,2
místo NULL,0,1
Ušetříš si tím spooooustu práce s ošetřováním "NULLů"
Zdenek:21.2.2017 10:23
Z níže uvedených 29 sad po 5 otázkách, se vždy z jedné sady vybere jedna a ta nabude hodnoty 1 nebo 0. Ostatní otázky jsou pak prázdné, to jsou ty co mi háží chybu "Undefined index". Takže se snažím nahradit toto:
<?php session_start();
$nick = $_SESSION['nick'];
$emailaddress = $_SESSION['emailaddress'];
$age = $_SESSION['age'];
$sex = $_SESSION['sex'] ;
// odtud dolů nahrazuji
$qA01_1 = $_SESSION['qA01_1'];
$qA01_2 = $_SESSION['qA01_2'];
$qA01_3 = $_SESSION['qA01_3'];
$qA01_4 = $_SESSION['qA01_4'];
$qA01_5 = $_SESSION['qA01_5'];
$qA02_1 = $_SESSION['qA02_1'];
$qA02_2 = $_SESSION['qA02_2'];
$qA02_3 = $_SESSION['qA02_3'];
$qA02_4 = $_SESSION['qA02_4'];
$qA02_5 = $_SESSION['qA02_5'];
$qA03_1 = $_SESSION['qA03_1'];
$qA03_2 = $_SESSION['qA03_2'];
$qA03_3 = $_SESSION['qA03_3'];
$qA03_4 = $_SESSION['qA03_4'];
$qA03_5 = $_SESSION['qA03_5'];
$qA04_1 = $_SESSION['qA04_1'];
$qA04_2 = $_SESSION['qA04_2'];
$qA04_3 = $_SESSION['qA04_3'];
$qA04_4 = $_SESSION['qA04_4'];
$qA04_5 = $_SESSION['qA04_5'];
$qA05_1 = $_SESSION['qA05_1'];
$qA05_2 = $_SESSION['qA05_2'];
$qA05_3 = $_SESSION['qA05_3'];
$qA05_4 = $_SESSION['qA05_4'];
$qA05_5 = $_SESSION['qA05_5'];
$qA06_1 = $_SESSION['qA06_1'];
$qA06_2 = $_SESSION['qA06_2'];
$qA06_3 = $_SESSION['qA06_3'];
$qA06_4 = $_SESSION['qA06_4'];
$qA06_5 = $_SESSION['qA06_5'];
$qA07_1 = $_SESSION['qA07_1'];
$qA07_2 = $_SESSION['qA07_2'];
$qA07_3 = $_SESSION['qA07_3'];
$qA07_4 = $_SESSION['qA07_4'];
$qA07_5 = $_SESSION['qA07_5'];
$qA08_1 = $_SESSION['qA08_1'];
$qA08_2 = $_SESSION['qA08_2'];
$qA08_3 = $_SESSION['qA08_3'];
$qA08_4 = $_SESSION['qA08_4'];
$qA08_5 = $_SESSION['qA08_5'];
$qA09_1 = $_SESSION['qA09_1'];
$qA09_2 = $_SESSION['qA09_2'];
$qA09_3 = $_SESSION['qA09_3'];
$qA09_4 = $_SESSION['qA09_4'];
$qA09_5 = $_SESSION['qA09_5'];
$qA10_1 = $_SESSION['qA10_1'];
$qA10_2 = $_SESSION['qA10_2'];
$qA10_3 = $_SESSION['qA10_3'];
$qA10_4 = $_SESSION['qA10_4'];
$qA10_5 = $_SESSION['qA10_5'];
$qA11_1 = $_SESSION['qA11_1'];
$qA11_2 = $_SESSION['qA11_2'];
$qA11_3 = $_SESSION['qA11_3'];
$qA11_4 = $_SESSION['qA11_4'];
$qA11_5 = $_SESSION['qA11_5'];
$qA12_1 = $_SESSION['qA12_1'];
$qA12_2 = $_SESSION['qA12_2'];
$qA12_3 = $_SESSION['qA12_3'];
$qA12_4 = $_SESSION['qA12_4'];
$qA12_5 = $_SESSION['qA12_5'];
$qA13_1 = $_SESSION['qA13_1'];
$qA13_2 = $_SESSION['qA13_2'];
$qA13_3 = $_SESSION['qA13_3'];
$qA13_4 = $_SESSION['qA13_4'];
$qA13_5 = $_SESSION['qA13_5'];
$qA14_1 = $_SESSION['qA14_1'];
$qA14_2 = $_SESSION['qA14_2'];
$qA14_3 = $_SESSION['qA14_3'];
$qA14_4 = $_SESSION['qA14_4'];
$qA14_5 = $_SESSION['qA14_5'];
$qA15_1 = $_SESSION['qA15_1'];
$qA15_2 = $_SESSION['qA15_2'];
$qA15_3 = $_SESSION['qA15_3'];
$qA15_4 = $_SESSION['qA15_4'];
$qA15_5 = $_SESSION['qA15_5'];
$qA16_1 = $_SESSION['qA16_1'];
$qA16_2 = $_SESSION['qA16_2'];
$qA16_3 = $_SESSION['qA16_3'];
$qA16_4 = $_SESSION['qA16_4'];
$qA16_5 = $_SESSION['qA16_5'];
$qA17_1 = $_SESSION['qA17_1'];
$qA17_2 = $_SESSION['qA17_2'];
$qA17_3 = $_SESSION['qA17_3'];
$qA17_4 = $_SESSION['qA17_4'];
$qA17_5 = $_SESSION['qA17_5'];
$qA18_1 = $_SESSION['qA18_1'];
$qA18_2 = $_SESSION['qA18_2'];
$qA18_3 = $_SESSION['qA18_3'];
$qA18_4 = $_SESSION['qA18_4'];
$qA18_5 = $_SESSION['qA18_5'];
$qA19_1 = $_SESSION['qA19_1'];
$qA19_2 = $_SESSION['qA19_2'];
$qA19_3 = $_SESSION['qA19_3'];
$qA19_4 = $_SESSION['qA19_4'];
$qA19_5 = $_SESSION['qA19_5'];
$qA20_1 = $_SESSION['qA20_1'];
$qA20_2 = $_SESSION['qA20_2'];
$qA20_3 = $_SESSION['qA20_3'];
$qA20_4 = $_SESSION['qA20_4'];
$qA20_5 = $_SESSION['qA20_5'];
$qA21_1 = $_SESSION['qA21_1'];
$qA21_2 = $_SESSION['qA21_2'];
$qA21_3 = $_SESSION['qA21_3'];
$qA21_4 = $_SESSION['qA21_4'];
$qA21_5 = $_SESSION['qA21_5'];
$qA22_1 = $_SESSION['qA22_1'];
$qA22_2 = $_SESSION['qA22_2'];
$qA22_3 = $_SESSION['qA22_3'];
$qA22_4 = $_SESSION['qA22_4'];
$qA22_5 = $_SESSION['qA22_5'];
$qA23_1 = $_SESSION['qA23_1'];
$qA23_2 = $_SESSION['qA23_2'];
$qA23_3 = $_SESSION['qA23_3'];
$qA23_4 = $_SESSION['qA23_4'];
$qA23_5 = $_SESSION['qA23_5'];
$qA24_1 = $_SESSION['qA24_1'];
$qA24_2 = $_SESSION['qA24_2'];
$qA24_3 = $_SESSION['qA24_3'];
$qA24_4 = $_SESSION['qA24_4'];
$qA24_5 = $_SESSION['qA24_5'];
$qA25_1 = $_SESSION['qA25_1'];
$qA25_2 = $_SESSION['qA25_2'];
$qA25_3 = $_SESSION['qA25_3'];
$qA25_4 = $_SESSION['qA25_4'];
$qA25_5 = $_SESSION['qA25_5'];
$qA26_1 = $_SESSION['qA26_1'];
$qA26_2 = $_SESSION['qA26_2'];
$qA26_3 = $_SESSION['qA26_3'];
$qA26_4 = $_SESSION['qA26_4'];
$qA26_5 = $_SESSION['qA26_5'];
$qA27_1 = $_SESSION['qA27_1'];
$qA27_2 = $_SESSION['qA27_2'];
$qA27_3 = $_SESSION['qA27_3'];
$qA27_4 = $_SESSION['qA27_4'];
$qA27_5 = $_SESSION['qA27_5'];
$qA28_1 = $_SESSION['qA28_1'];
$qA28_2 = $_SESSION['qA28_2'];
$qA28_3 = $_SESSION['qA28_3'];
$qA28_4 = $_SESSION['qA28_4'];
$qA28_5 = $_SESSION['qA28_5'];
$qA29_1 = $_SESSION['qA29_1'];
$qA29_2 = $_SESSION['qA29_2'];
$qA29_3 = $_SESSION['qA29_3'];
$qA29_4 = $_SESSION['qA29_4'];
$qA29_5 = $_SESSION['qA29_5'];
?>
Tímto
for($i = 0; $i <= 2; $i++) {
for($j = 0; $j <= 9; $j++) {
for($k = 1; $k <= 5; $k++) {
if (isset($_SESSION['qA_' . $i . $j. '_' . $k])) {
'$qA_' . $i . $j. '_' . $k = $_SESSION['qA_' . $i . $j. '_' . $k];
ale někde mám chybu, jelikož mi to řve už v programu NetBeams. .
Nojo to si musis nejdriv precist, jak se v php delaji promenne nazvy
promennych
toto:
'$qA_' . $i . $j. '_' . $k = $_SESSION['qA_' . $i . $j. '_' . $k];
prirazujes textovymu retezci hodnotu... coz je nesmysl
musis to obalit:
${'qA_' . $i . $j. '_' . $k} = $_SESSION['qA_' . $i . $j. '_' . $k];
Zdenek:21.2.2017 11:44
Hláška "Undefined index" u definice proměnných sice zmizela, ale objevuje se teď u všech VALUES při zápisu do DB. Tím pádem se ani data nezapisují do DB. Takže asi předchozí zápis nebude optimální.
$query = "INSERT INTO tabulka
(datum,time,nick,emailaddress,age,sex,
qA01_1,qA01_2,qA01_3,qA01_4,qA01_5,
qA02_1,qA02_2,qA02_3,qA02_4,qA02_5,
qA03_1,qA03_2,qA03_3,qA03_4,qA03_5,
qA04_1,qA04_2,qA04_3,qA04_4,qA04_5,
qA05_1,qA05_2,qA05_3,qA05_4,qA05_5,
qA06_1,qA06_2,qA06_3,qA06_4,qA06_5,
qA07_1,qA07_2,qA07_3,qA07_4,qA07_5,
qA08_1,qA08_2,qA08_3,qA08_4,qA08_5,
qA09_1,qA09_2,qA09_3,qA09_4,qA09_5,
qA10_1,qA10_2,qA10_3,qA10_4,qA10_5,
qA11_1,qA11_2,qA11_3,qA11_4,qA11_5,
qA12_1,qA12_2,qA12_3,qA12_4,qA12_5,
qA13_1,qA13_2,qA13_3,qA13_4,qA13_5,
qA14_1,qA14_2,qA14_3,qA14_4,qA14_5,
qA15_1,qA15_2,qA15_3,qA15_4,qA15_5,
qA16_1,qA16_2,qA16_3,qA16_4,qA16_5,
qA17_1,qA17_2,qA17_3,qA17_4,qA17_5,
qA18_1,qA18_2,qA18_3,qA18_4,qA18_5,
qA19_1,qA19_2,qA19_3,qA19_4,qA19_5,
qA20_1,qA20_2,qA20_3,qA20_4,qA20_5,
qA21_1,qA21_2,qA21_3,qA21_4,qA21_5,
qA22_1,qA22_2,qA22_3,qA22_4,qA22_5,
qA23_1,qA23_2,qA23_3,qA23_4,qA23_5,
qA24_1,qA24_2,qA24_3,qA24_4,qA24_5,
qA25_1,qA25_2,qA25_3,qA25_4,qA25_5,
qA26_1,qA26_2,qA26_3,qA26_4,qA26_5,
qA27_1,qA27_2,qA27_3,qA27_4,qA27_5,
qA28_1,qA28_2,qA28_3,qA28_4,qA28_5,
qA29_1,qA29_2,qA29_3,qA29_4,qA29_5,
qA30_1,qA30_2,qA30_3,qA30_4,qA30_5) VALUES
('$datum', '$time', '$nick', '$emailaddress', '$age', '$sex',
//odtud až dokonce mi to háže "Undefined variable"
'$qA01_1', '$qA01_2', '$qA01_3', '$qA01_4', '$qA01_5',
'$qA02_1', '$qA02_2', '$qA02_3', '$qA02_4', '$qA02_5',
'$qA03_1', '$qA03_2', '$qA03_3', '$qA03_4', '$qA03_5',
'$qA04_1', '$qA04_2', '$qA04_3', '$qA04_4', '$qA04_5',
'$qA05_1', '$qA05_2', '$qA05_3', '$qA05_4', '$qA05_5',
'$qA06_1', '$qA06_2', '$qA06_3', '$qA06_4', '$qA06_5',
'$qA07_1', '$qA07_2', '$qA07_3', '$qA07_4', '$qA07_5',
'$qA08_1', '$qA08_2', '$qA08_3', '$qA08_4', '$qA08_5',
'$qA09_1', '$qA09_2', '$qA09_3', '$qA09_4', '$qA09_5',
'$qA10_1', '$qA10_2', '$qA10_3', '$qA10_4', '$qA10_5',
'$qA11_1', '$qA11_2', '$qA11_3', '$qA11_4', '$qA11_5',
'$qA12_1', '$qA12_2', '$qA12_3', '$qA12_4', '$qA12_5',
'$qA13_1', '$qA13_2', '$qA13_3', '$qA13_4', '$qA13_5',
'$qA14_1', '$qA14_2', '$qA14_3', '$qA14_4', '$qA14_5',
'$qA15_1', '$qA15_2', '$qA15_3', '$qA15_4', '$qA15_5',
'$qA16_1', '$qA16_2', '$qA16_3', '$qA16_4', '$qA16_5',
'$qA17_1', '$qA17_2', '$qA17_3', '$qA17_4', '$qA17_5',
'$qA18_1', '$qA18_2', '$qA18_3', '$qA18_4', '$qA18_5',
'$qA19_1', '$qA19_2', '$qA19_3', '$qA19_4', '$qA19_5',
'$qA20_1', '$qA20_2', '$qA20_3', '$qA20_4', '$qA20_5',
'$qA21_1', '$qA21_2', '$qA21_3', '$qA21_4', '$qA21_5',
'$qA22_1', '$qA22_2', '$qA22_3', '$qA22_4', '$qA22_5',
'$qA23_1', '$qA23_2', '$qA23_3', '$qA23_4', '$qA23_5',
'$qA24_1', '$qA24_2', '$qA24_3', '$qA24_4', '$qA24_5',
'$qA25_1', '$qA25_2', '$qA25_3', '$qA25_4', '$qA25_5',
'$qA26_1', '$qA26_2', '$qA26_3', '$qA26_4', '$qA26_5',
'$qA27_1', '$qA27_2', '$qA27_3', '$qA27_4', '$qA27_5',
'$qA28_1', '$qA28_2', '$qA28_3', '$qA28_4', '$qA28_5',
'$qA29_1', '$qA29_2', '$qA29_3', '$qA29_4', '$qA29_5',
'$qA30_1', '$qA30_2', '$qA30_3', '$qA30_4', '$qA30_5')";
//if($query){echo 'data has been placed'}
mysql_query($query) or die(mysql_error());
Michal Štěpánek:21.2.2017 13:11
Asi se budu opakovat, ale jak jsem psal výše...
Být tebou, tak ty varchary změním na int a hodnocení pak třeba na 0,1,2 místo NULL,0,1
Ušetříš si tím spooooustu práce s ošetřováním "NULLů"
Zdenek:21.2.2017 13:18
Asi máš pravdu, začínám to pociťovat na každém kroku.
Zdenek:21.2.2017 16:11
Tím pádem se znovu vracím k otázce, jak vyberu poslední záznam, kde potřebuji sečíst všechny hodnoty nabývající 1 ?
Půjde toto nějak jednoduše upravit?
$qry = mysql_query("SELECT (qA01_1 + ... qA30_5) FROM tabulka
WHERE ID = (SELECT MAX(ID) FROM tabulka)");
Dále budu muset ošetřit prázdné proměnné, tedy ty otázky, které
nebudou vybrány nabudou hodnoty 0 .
tzn. z těchto proměnných můžou nabývat hodnot 0 tj. otázka není
vybrána, 1 ot. je vybrána a správně, 5 ot. je vybrána, ale špatně
zodpovězena.
$qA01_1 = $_SESSION['qA01_1'];
$qA01_2 = $_SESSION['qA01_2'];
$qA01_3 = $_SESSION['qA01_3'];
$qA01_4 = $_SESSION['qA01_4'];
$qA01_5 = $_SESSION['qA01_5'];
// otázky qA01_1 až qA29_5
$qA29_1 = $_SESSION['qA29_1'];
$qA29_2 = $_SESSION['qA29_2'];
$qA29_3 = $_SESSION['qA29_3'];
$qA29_4 = $_SESSION['qA29_4'];
$qA29_5 = $_SESSION['qA29_5'];
To jsem malinko mimo. Byl by nápad, prosím?
Michal Štěpánek:22.2.2017 5:22
Nevím, jestli je to nejlepší řešení, ale zkusil bych to nesčítat přímo v tom dotazu, tam bych to jen "vyselectoval". Pak bych ty hodnoty uložil do nějaké kolekce, tu bych pak už v phpčku prošel cyklem a sčítal ty "správné" hodnoty
Zdenek:27.2.2017 21:04
Tak hodny uložené do DB mám nastavené jako INT., nabývají hodnot 0 nebo 1 nebo 5, ale to "vyselectovani" např. posledního ID, kde chci vybrat sloupec obsahující 1 je pro mě nadlický úkol. Věděl by někdo prosím, co s tím ?
Michal Štěpánek:28.2.2017 6:58
Vyber všechny "sloupce" toho posledního záznamu a pak si je cyklem projdi. Vytvoř si nějakou proměnnou "součet" a když při procházení cyklu bude hodnota toho sloupce = 1, tak ji přičteš do té proměnné...
Zdenek:28.2.2017 16:07
Ano, to si už psal, ale nedaří se mi to napsat v SQL dotazu, resp.v PHP. Zkoušel jsem kdo ví co, ale bez mučení se přiznám, že jsem nato krátký. Nevím jak to napsat, aby to dělalo co potřebuji.
Neaktivní uživatel:28.2.2017 18:27
Zkus to takhle
SELECT MAX(id), time, nick, emailaddress, age, sex, ifnull(qA01_1, 0) + ifnull(qA01_2, 0) + ifnull(qA01_3, 0) ... + ifnull(qA30_5) AS VotesSum FROM tabulka;
Zdenek:1.3.2017 21:45
Tohle sice sčítá, ale ne jak bych potřeboval. Potřeboval bych sečíst pouze případy, kdy nabude qA01_1 až qA30_5 hodnotou 1. Může ještě nabývat hodnoty 0 nebo 5, ale ty nepotřebuji sčítat. Děkuji za radu.
Michal Štěpánek:2.3.2017 6:40
Mrkni se <a href="http://www.itnetwork.cz/php/databaze/php-tutorial-databaze-pro-zacatecniky-formular-a-vypis-dat-z-tabulky>SEM</a>, je tam návod jak vypsat data z tabulky. Pomocí "foreach" projdeš výsledek dotazu a pokud bude hodnota sloupce rovna 1 přičteš ji do připravené proměnné...
Zdenek:2.3.2017 7:38
Díky za nasměrování, ale tvůj odkaz mi píše "Stránka, na kterou se
odkazujete, byla pravděpodobně přesunuta.".
Michal Štěpánek:2.3.2017 7:50
http://www.itnetwork.cz/…at-z-tabulky
sekce PHP -> Databáze pro začátečníky -> Formulář a výpis dat z
databáze do tabulky v PHP
Nicméně to v podstatě už máš, jen musíš výsledek projít cyklem a v
něm sčítat potřebné hodnoty...
Zdenek:3.3.2017 13:24
Šlo by nějak takhle ? Akorád nevím jak na zápis toho, kde qA01_1 až qA05_30 obsahuje hodnotu 1.
$qry = mysql_query("SELECT (ifnull(qA01_1, 0) + ifnull(qA01_2, 0) + ifnull(qA01_3, 0) ... + ifnull(qA30_5)) FROM tabulka
WHERE ID = (SELECT MAX(ID) FROM tabulka)");
echo('<h2>Součet všech sloupců mající hodnotu "1" posledniho ID (ostatní sloupce nabývající "0" nebo "5" nesčítat)</h2><table border="1">');
foreach ($qry as $u)
{
echo('</td><td>' . htmlspecialchars(for($i = 0; $i <= 3; $i++) {
for($j = 0; $j <= 9; $j++) {
for($k = 1; $k <= 5; $k++) {
$u['qA_' . $i . $j. '_' . $k]));
echo('</td></tr>');
}
echo('</table>');
Michal Štěpánek:3.3.2017 16:46
teoreticky i jo, ale někde bys měl ještě páchat to sčítání, takže bys měl někde před cyklem definovat proměnnou a do ní v cyklu přičítat, pokud
$u['qA_' . $i . $j. '_' . $k] = 1
Zdenek:4.3.2017 20:55
Tohle jsem vypotil, ale někde musím dělat chybu, nefunguje mi to. Asi ten součet mám špatně napsaný.
$soucet = 0;
for ($i = 0; $i <= 3; $i++) {
for($j = 0; $j <= 9; $j++) {
for($k = 1; $k <= 5; $k++){
$u = 'qA_' . $i . $j. '_' . $k;
$soucet += ($u = 1);
}}}
echo('<h2>Hodnocení</h2><table border="1">');
foreach ($qry as $soucet)
{
echo('</td><td>' . htmlspecialchars($soucet));
echo('</td></tr>');
}
echo('</table>');
Nejsem phpčkář, ale bude to nějak takhle v tom cyklu musíš mít podmínku (nevím, jestli je správně syntaxe)
If($u==1)
{$soucet+=1}
A po skončení cyklu musíš ten $soucet někde zobrazit.
Zdenek:5.3.2017 17:08
To já taky nejsem PHPčkář, jsem jen začátečník. Zkouším to, ale jak píšeš, ta syntaxe bude asi špatně.
$qry1 = mysql_query("SELECT (ifnull(qA01_1, 0) + ifnull(qA01_2, 0) + ifnull(qA01_3, 0) + ifnull(qA01_4, 0) + ifnull(qA01_5, 0) +
ifnull(qA02_1, 0) + ifnull(qA02_2, 0) + ifnull(qA02_3, 0) + ifnull(qA02_4, 0) + ifnull(qA02_5, 0) +
ifnull(qA03_1, 0) + ifnull(qA03_2, 0) + ifnull(qA03_3, 0) + ifnull(qA03_4, 0) + ifnull(qA03_5, 0) +
ifnull(qA04_1, 0) + ifnull(qA04_2, 0) + ifnull(qA04_3, 0) + ifnull(qA04_4, 0) + ifnull(qA04_5, 0) +
ifnull(qA05_1, 0) + ifnull(qA05_2, 0) + ifnull(qA05_3, 0) + ifnull(qA05_4, 0) + ifnull(qA05_5, 0) +
ifnull(qA06_1, 0) + ifnull(qA06_2, 0) + ifnull(qA06_3, 0) + ifnull(qA06_4, 0) + ifnull(qA06_5, 0) +
ifnull(qA07_1, 0) + ifnull(qA07_2, 0) + ifnull(qA07_3, 0) + ifnull(qA07_4, 0) + ifnull(qA07_5, 0) +
ifnull(qA08_1, 0) + ifnull(qA08_2, 0) + ifnull(qA08_3, 0) + ifnull(qA08_4, 0) + ifnull(qA08_5, 0) +
ifnull(qA09_1, 0) + ifnull(qA09_2, 0) + ifnull(qA09_3, 0) + ifnull(qA09_4, 0) + ifnull(qA09_5, 0) +
ifnull(qA10_1, 0) + ifnull(qA10_2, 0) + ifnull(qA10_3, 0) + ifnull(qA10_4, 0) + ifnull(qA10_5, 0) +
ifnull(qA11_1, 0) + ifnull(qA11_2, 0) + ifnull(qA11_3, 0) + ifnull(qA11_4, 0) + ifnull(qA11_5, 0) +
ifnull(qA12_1, 0) + ifnull(qA12_2, 0) + ifnull(qA12_3, 0) + ifnull(qA12_4, 0) + ifnull(qA12_5, 0) +
ifnull(qA13_1, 0) + ifnull(qA13_2, 0) + ifnull(qA13_3, 0) + ifnull(qA13_4, 0) + ifnull(qA13_5, 0) +
ifnull(qA14_1, 0) + ifnull(qA14_2, 0) + ifnull(qA14_3, 0) + ifnull(qA14_4, 0) + ifnull(qA14_5, 0) +
ifnull(qA15_1, 0) + ifnull(qA15_2, 0) + ifnull(qA15_3, 0) + ifnull(qA15_4, 0) + ifnull(qA15_5, 0) +
ifnull(qA16_1, 0) + ifnull(qA16_2, 0) + ifnull(qA16_3, 0) + ifnull(qA16_4, 0) + ifnull(qA16_5, 0) +
ifnull(qA17_1, 0) + ifnull(qA17_2, 0) + ifnull(qA17_3, 0) + ifnull(qA17_4, 0) + ifnull(qA17_5, 0) +
ifnull(qA18_1, 0) + ifnull(qA18_2, 0) + ifnull(qA18_3, 0) + ifnull(qA18_4, 0) + ifnull(qA18_5, 0) +
ifnull(qA19_1, 0) + ifnull(qA19_2, 0) + ifnull(qA19_3, 0) + ifnull(qA19_4, 0) + ifnull(qA19_5, 0) +
ifnull(qA20_1, 0) + ifnull(qA20_2, 0) + ifnull(qA20_3, 0) + ifnull(qA20_4, 0) + ifnull(qA20_5, 0) +
ifnull(qA21_1, 0) + ifnull(qA21_2, 0) + ifnull(qA21_3, 0) + ifnull(qA21_4, 0) + ifnull(qA21_5, 0) +
ifnull(qA22_1, 0) + ifnull(qA22_2, 0) + ifnull(qA22_3, 0) + ifnull(qA22_4, 0) + ifnull(qA22_5, 0) +
ifnull(qA23_1, 0) + ifnull(qA23_2, 0) + ifnull(qA23_3, 0) + ifnull(qA23_4, 0) + ifnull(qA23_5, 0) +
ifnull(qA24_1, 0) + ifnull(qA24_2, 0) + ifnull(qA24_3, 0) + ifnull(qA24_4, 0) + ifnull(qA24_5, 0) +
ifnull(qA25_1, 0) + ifnull(qA25_2, 0) + ifnull(qA25_3, 0) + ifnull(qA25_4, 0) + ifnull(qA25_5, 0) +
ifnull(qA26_1, 0) + ifnull(qA26_2, 0) + ifnull(qA26_3, 0) + ifnull(qA26_4, 0) + ifnull(qA26_5, 0) +
ifnull(qA27_1, 0) + ifnull(qA27_2, 0) + ifnull(qA27_3, 0) + ifnull(qA27_4, 0) + ifnull(qA27_5, 0) +
ifnull(qA28_1, 0) + ifnull(qA28_2, 0) + ifnull(qA28_3, 0) + ifnull(qA28_4, 0) + ifnull(qA28_5, 0) +
ifnull(qA29_1, 0) + ifnull(qA29_2, 0) + ifnull(qA29_3, 0) + ifnull(qA29_4, 0) + ifnull(qA29_5, 0) +
ifnull(qA30_1, 0) + ifnull(qA30_2, 0) + ifnull(qA30_3, 0) + ifnull(qA30_4, 0) + ifnull(qA30_5, 0))
FROM tabulka WHERE ID = (SELECT MAX(ID) FROM tabulka)");
$soucet = 0;
for ($i = 0; $i <= 3; $i++) {
for($j = 0; $j <= 9; $j++) {
for($k = 1; $k <= 5; $k++){
$u = 'qA_' . $i . $j. '_' . $k;
if ($u==1){
$soucet+=1;
}
}}}
echo('<h2>Hodnocení</h2><table border="1">');
foreach ($qry1 as $soucet)
{
echo('</td><td>' . htmlspecialchars($soucet));
echo('</td></tr>');
}
echo('</table>');
Pak mi to vyplivne hlášku :
Warning: Invalid argument supplied for foreach() in C:\xampp\htdocs\app_form\input_form32_process.php on line 361
Zobrazeno 50 zpráv z 57.