Diskuze: Podmínka pro prázdnou proměnnou
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Michal:4.2.2017 8:37
Ahoj, k ověření prázdnosti slouží funkce empty(). Díky podobným indexům v poli POST navíc lze celý příklad vyřešit v cyklu, a tudíž není třeba rozepisovat zvlášť všechny řádky.
for ($i = 1; $i < 6; $i++) {
$index = 'qA01_' . $i; // Index do pole POST bude nabývat hodnot qA01_1 až qA01_5.
if (isset($_POST[$index] && !empty($_POST[$index])) {
$_SESSION[$index] = $_POST[$index]; // Hodnota z POST se vloží do SESSION pouze pokud není prázdná.
}
}
Neaktivní uživatel:4.2.2017 13:01
Ahoj, ono záleží, jak plánuješ ošetřit ty prázdné hodnoty. Obecně se to dělá tak, že ověříš, zda existují, a pokud ne, tak jim přiřadíš nějakou výchozí hodnotu, nebo s nimi vůbec nebudeš počítat. Ve tvém případě bych doporučoval něco na způsob
$_SESSION['qA01_1'] = (isset($_POST['qA01_1'])) ? $_POST['qA01_1'] : 0;
Což je zkrácený zápis pro klasickou if podmínku. V případě, že daná proměnná existuje, vrátí ji, jinak vrátí nulu. Tedy můžeš si být jistý, že vždy bude nadefinována ona proměnná a nebudeš dostávat chyby typu notice.
Jak již psal Michal, můžeš všechny řádky dát do cyklu
for ($i = 1; $i <= 5; $i++) {
$_SESSION['qA01_' . $i] = (isset($_POST['qA01_' . $i])) ? $_POST['qA01_' . $i] : 0;
}
Zdenek:4.2.2017 14:59
Díky, ale raději bych s proměnnými, které jsou prázdné nedělal dále již nic a zároveň se zbavil "chybové hlášky". Stačí pak místo 0 dát empty() ?
for ($i = 1; $i <= 5; $i++) {
$_SESSION['qA01_' . $i] = (isset($_POST['qA01_' . $i])) ? $_POST['qA01_' . $i] : empty();
}
Neaktivní uživatel:4.2.2017 16:31
Ahoj, pak tedy použij klasickou if podmínku, která se spustí pouze pokud bude proměnná definována.
for ($i = 1; $i <= 5; $i++) {
if (isset($_POST['qA01_' . $i])) {
$_SESSION['qA01_' . $i] = $_POST['qA01_' . $i];
}
}
Ale pořád nechápeš, proč se ta notice zobrazuje. Ona ti říká, že se pokoušíš přistupovat k neexistujícímu indexu, takže si teď musíš dát pozor, aby ses nepokoušel získat obsah například $_SESSION['qA01_1'] i když nebude existovat, protože by se ti opět zobrazila. Vyzkoušej, jestli funguje a pokud se ti to stále bude zobrazovat, tak pošli ten kus kódu, kde se vyskytuje chyba. Taky je ještě možné tento typ hlášení vypnout.
+20 Zkušeností
+2,50 Kč
Zdenek:6.2.2017 20:40
Tak to funguje, díky
.
Snažil jsem se něco podobného aplikovat pro nadefinování proměnných, ale
nějak to není ono.
Toto pole se snažím nahradit:
$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'];
Tímto:
for($i = 0; $i <= 3; $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];
}
}
}
}
Je to správně?
Martin Konečný (pavelco1998):7.2.2017 16:11
Zásadně nedoporučuji dělat proměnné proměnné. Na tento účel ti mnohem líp poslouží pole.
$data = array();
// v těch forech pak místo '$qA_' . $i . $j. '_' . $k = $_SESSION['qA_' . $i . $j. '_' . $k]; použiješ
$key = "qA_{$i}{$j}_{$k}";
$data[$key] = $_SESSION[$key];
Zdenek:10.2.2017 20:29
Nějak jsem to zbastlil, ale háže mi to chybu při zápisu do DB. Můžu poprosit o kontrolu?
1. Zda náhrada proměnných za pole je správně zapsaná ? zda to tak
může být ?
2 .a 3. Lze zkrátit zápis sloupců a hodnot do nich vkládaných ?
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<?php session_start();
$nick = $_SESSION['nick'];
$emailaddress = $_SESSION['emailaddress'];
$age = $_SESSION['age'];
$sex = $_SESSION['sex'] ;
// ad.1 pole pro proměnné. Je to takto napsáno správně ?
$data = array();
for($i = 0; $i <= 3; $i++) {
for($j = 0; $j <= 9; $j++) {
for($k = 1; $k <= 5; $k++) {
$key = "qA_{$i}{$j}_{$k}";
$data[$key] = $_SESSION[$key];
}
}
}
//MySQL Database Connect
include "mysql_connect.php";
$datum = date("d. m. Y"); // promena datum
$time = date("G:i"); // promena cas
// ad.2 a 3 - lze nejak zkratit nize uvedene nazvy sloupcu resp. hodnot ?
$query = "INSERT INTO abc1234
(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',
'$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());
?>
</BODY>
</HTML>
Martin Konečný (pavelco1998):10.2.2017 20:32
Toto mi zavání špatným návrhem DB. Na co potřebuješ v tabulce abc1234 ty sloupce qA01_1 atd.?
Zdenek:10.2.2017 21:20
Zápis do DB mi funguje dobře, jen bych ho rád zkrátil. Náhodně vybírám vždy jednu z pěti otázek a ta pak nabude hodnoty 1 nebo 0. Zbývající 4 otázky pak zůstanou prázdné, nic se nezapíše do DB. Jsem spokojený a je to i pro mě v DB přehledné, ale asi hádám, že dle tvojí rekce by to mělo být jinak ?
Martin Konečný (pavelco1998):10.2.2017 22:31
Chápu tedy správně, že qA01_1 až qA01_5 je jedna sada
otázek, z nichž se vybere jedna, která bude mít hodnotu 1 a ostatní hodnotu
0?
V takovém případě by bylo lepší udělat si tabulku s otázkami, jen si
teď nedokážu představit, jak ta aplikace má fungova, a tudíž, jak
správně rozvrhnout strukturu dalších tabulek
Zdenek:11.2.2017 6:47
Skoro to chápeš dobře, jedna sada otázek je jak píšeš qA01_1 až qA01_5, z ní se vybere náhodně jedna otázka např. qA01_3 a ta nabude hodnoty buď 1 nebo 0. Ostatní otázky dané sady jsou pak prázdné. Všechno tohle mi funguje včetně zápisu do DB. Takže na první pohled v DB vidím, jaká otázka byla vylosována a zda nabyla hodnoty 1 nebo 0. Snažím se to ted nejak zkrátit a eliminovat chybové hlášky. Děkuji za pomoc
Martin Konečný (pavelco1998):11.2.2017 12:02
V tom případě by ti mělo stačit si udělat tabulku "otazka", ve které
budeš mít ID, název otázky (hodnota pak qA01_1) a "zvoleno" (hodnota pak 1 /
0 případně NULL, pokud to bude jako prázdné).
No a ty když pak budeš chtít hledat otázky, které nejsou prázdné,
položíš jednoduchý dotaz
SELECT * FROM otazka
WHERE zvoleno IS NOT NULL
Nevím, jaké je konkrétní použití, ale ještě správněji by se to
mělo rozdělit i podle té sady, tzn. tabulka "sada", ve které bude ID,
nějaký název / číslo atp., to bude značit to "01", "02" na začátku.
V tabulce otázka pak bude ID, název/číslo (1,2,3,4,5) a ID sady.
Takže když pak budeš hledat všechny otázky v sadě s čísllem 4, uděláš
dotaz
SELECT * FROM otazka
INNER JOIN sada ON otazka.sada_id = sada.id
WHERE sada.cislo = 4
// případně pokud bys měl ID sady a ne jen její číslo
SELECT * FROM otazka
WHERE sada_id = 5
Neznám ale konkrétní použití těch otázek, takže je třeba můj návrh špatně nebo nevyhovuje tomu, co konkrétně potřebuješ. No a také nevím, jakou znalost SQL máš, jestli pro tebe není JOIN přílišná magie pro začátek
Zdenek:11.2.2017 21:22
Tabulku v phpMyadmin mám vytvořenou tak jak potřebuji, a funguje mi i zápis. Do JOINu pokud to nebude nutné bych se zatím nerad pouštěl, nemám zkušenosti. Chtěl bych pro začátek jen zjednodušit zápis a zbavit se "chybových hlášek" typu Undefined index... Založím nato novou diskuzi, protože co jsem potřeboval v této diskuzi, bylo vyřešeno už výše .
Zobrazeno 16 zpráv z 16.