Diskuze: Výpis proměnných obsahující hodnotu 1 a následný zápis těchto hodnot do DB
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Snad jsem to pochopil správně
Jinak, nevím sice co tvoříš, nicméně už podle názvu by mělo být
jasné, co proměnná obsahuje Z názvu $qA01_1 bych moc moudrý nebyl
$vars = get_defined_vars();
foreach ($vars as $varName => $varValue) {
if (strpos($varName, 'qA') !== false && $varValue === 1) {
mysqli_query($connect, "INSERT INTO `neco` (`nazev_promenne`, `hodnota promenne`) VALUES ('" .$varName. "', '" .$varValue. "')");
}
}
Zdenek:6.3.2017 22:08
Ahoj,
děkuji za odpověď. Jelikož jsem začátečník, není mi ve tvém kodu jasno
pár věcí a rád bych se chtěl s dovolením zeptat.
1. Umí
$vars = get_defined_vars();
získávat hodnoty i z
<?php session_start();
$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'];
// až do $qA30_5
?>
2. Co přesně dělá "strpos" a zda je 'qA' správně/ dostatečně nadefinovaná, když mám pole proměnných od qA01_1 až qA30_5 v tomto řádku
if (strpos($varName, 'qA') !== false && $varValue === 1) {
3. Dá se zde "$connect" nahradit přímo zápisem `include "mysql_connect.php"; ` ?
4. Předpokládám správně, že nazev_promenne
bude odpovídat
qA01_1, qA01_2, až do qA30_5
. Co pak bude místo
hodnota promenne
? Budou to
$qA01_1, $qA01_2, až do $qA30_5
?
mysqli_query($connect, "INSERT INTO `neco` (`nazev_promenne`, `hodnota promenne`) VALUES ('" .$varName. "', '" .$varValue. "')");
ConflictBoy:13.3.2017 10:49
- ano, umí
- funkce strpos slouží pro hledání textu v nějakém řetězci. Konkrétně v proměnné $varname, kde je název proměnné, třeb qA01_5, hledám řetězec 'qA'. Funkce vrací false v případě, že řetězec nebyl nalezen, proto máme podmínku obrácenou a mysqli_query provádíme jen v případě, že byl řetězec nalezen.
- nedá, nicméně můžeš použít mysql_connect, která první parametr nevyžaduje. Nicméně, mysql_connect byla ve verzi 7 vyhozena
- ano, nazev_promenne bude odpovídat qA01_1, atd., hodnota_promenne by mela obsahovat hodnoty těch proměnných.
Např.
$qA01_1 =10;
$vars = get_defined_vars();
foreach ($vars as $varName => $varValue) {
if (strpos($varName, 'qA') !== false && $varValue === 1) {
mysqli_query($connect, "INSERT INTO `neco` (`nazev_promenne`, `hodnota promenne`) VALUES ('" .$varName. "', '" .$varValue. "')"); //vrací INSERT INTO `neco` (`nazev_promenne`, `hodnota promenne`) VALUES ('qA01_1', '10')
}
}
Zdenek:14.3.2017 20:09
Děkuji za vysvětlení. Trošku jsem hledat a našel jsem mmj. toto, což mi dobře funguje. Zápis do DB dělá, to co potřebuji. Jenže mi blbne "SELECT", nevím zda to souvisí s tím jak píšeš, že ve v.7 bylo msql_connect vyhozeno.
$values = [];
$fields = [];
for($i=1;$i<=30;$i++)
{
foreach([1,2,3,4,5] as $index)
{
if(${'qA'.str_pad($i, 2, "0", STR_PAD_LEFT).'_'.$index} == 1)
{
$values[] = ${'qA'.str_pad($i, 2, "0", STR_PAD_LEFT).'_'.$index};
$fields[] = 'qA'.str_pad($i, 2, "0", STR_PAD_LEFT).'_'.$index;
}
}
}
$query1 = "INSERT INTO table1(".implode(',',$fields).") VALUES (". implode(',',$values).")"; //zápis do DB
if( ! mysqli_query($connect, $query1))
{
echo "Error query: ".mysqli_error($connect);
}
Jenže mi blbne "SELECT", nevím zda to souvisí s tím jak píšeš, že ve v.7 bylo msql_connect vyhozeno.
$sum1 = mysqli_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 table1
WHERE id = (SELECT MAX(id) FROM table1)");
echo "<br/>Soucet:" . " " . round($sum1[0], 0);
SELECT mi pak háže chybovou hlášku, nic nespočitá a nevím co s tím.
Warning: mysqli_query() expects at least 2 parameters, 1 given in C:\xampp\htdocs\app_form\input_form32_process.php on line 303
Soucet: 0
Neaktivní uživatel:14.3.2017 20:33
Píše ti to, že ta funkce očekává dva parametry, ale tys dal jen jeden. Zapomněl jsi na $connect
$sum1 = mysqli_query ($connect, "SELECT
Michal Štěpánek:15.3.2017 8:04
Zkus si ten select trošku zjednodušit, třeba na výběr jen jednoho sloupce, co to udělá...
K tahání dat z databáze budeš ještě potřebovat mysqli_fetch_assoc()
nebo něco podobného
Zkus něco takového:
$result = mysqli_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 table1
WHERE id = (SELECT MAX(id) FROM table1)");
$sum1 = mysqli_fetch_assoc($result);
echo "<br/>Soucet:" . " " . round($sum1[0], 0);
Zdenek:15.3.2017 16:49
Paráda, zkusil jsem tohle a funguje. Díky za tip.
$result = mysqli_query ($connect, "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 table1
WHERE id = (SELECT MAX(id) FROM table1)");
$sum1 = mysqli_fetch_array($result);
echo "<br/>Soucet:" . " " . round($sum1[0], 0);
Ještě zvažuji co bude lepší při výpočtu, jestli hodnoty rovnou sečítat v rámci PHP session nebo pracovat až s hodnotami vySELECTovanými z databáze ?
+5 Zkušeností
ConflictBoy:15.3.2017 17:10
No pořád nějak nevím co tvoříš, tak se na toto těžko odpovídá Nicméně bych to asi řešil v PHP session. Těch sloupců je moc na nějaké pravidelné počítání
Michal Štěpánek:16.3.2017 8:04
Tuším, že v nějakém jiném vlákně psal, že by to mělo být něco testy (otázky a odpovědi) a už tam mu bylo řečeno od několika lidí, že si myslíme, že je ta DB špatně navržená. Podle mě je tabulka, která má 150 sloupců nesmyslná, nepřehledná a špatně spravovatelná...
Michal Štěpánek:16.3.2017 8:18
Měl bys popřemýšlet nad překopáním tabulek, protože u tohoto návrhu
(v takovém množství sloupců) se při každé potřebě změny (přidat,
změnit či odebrat otázku nebo odpověď) opupínkuješ... Mě by naskakovaly
pupínky už jen při pomyšlení, že ta potřeba někdy nastane...
Udělal bych si:
- tabulku otázek
- tabulku odpovědí
- vazební tabulku (přiřazení odpovědí k otázkám a třeba určení
správné odpovědi)
Každá tabulka bude mít jen několik sloupců a následně každá změna může probíhat pohodlně "s prstem v nose"...
Zdenek:16.3.2017 22:20
Jak píše Michal Š. je to pro testy (otázky a odpovědi). Mám to uděláno následovně:
- co otázka to jeden PHP file. Celkem mám 30 sad, každá má 5 variant a náhodným výběrem vyberu pro každou ze sad jednu otázku. Takže testová otázka se skládá z 30 otázek.
- tabulky mám celkem tři. První správné odpovědi, druhou špatné odpovědi, třetí userinfo.
- vazební tabulka (nevím jestli by to šlo udělat, mám tam i obrázky atp.)
Jinak v budoucnu nepředpokládám, že bych přidával otázky, maximálně počítám s editací otázek v php files.
A propó, lze tento kod, který zapisuje do DB, nějakou jednoduchou úpravou upravit tak, aby mi sečetl všechny 1 z pole bez zápisu do DB ?
// Vložení "správných" odpovědí do DB tabulky "table1"
$values = [];
$fields = [];
for($i=1;$i<=30;$i++)
{
foreach([1,2,3,4,5] as $index)
{
if(${'qA'.str_pad($i, 2, "0", STR_PAD_LEFT).'_'.$index} == 1)
{
$values[] = ${'qA'.str_pad($i, 2, "0", STR_PAD_LEFT).'_'.$index};
$fields[] = 'qA'.str_pad($i, 2, "0", STR_PAD_LEFT).'_'.$index;
}
}
}
$query1 = "INSERT INTO table1(".implode(',',$fields).") VALUES (". implode(',',$values).")"; //zápis do DB
if( ! mysqli_query($connect, $query1))
{
echo "Error query: ".mysqli_error($connect);
}
ConflictBoy:17.3.2017 0:23
No rozhodně bych to opravdu trochu upravil, aneb jak píše Michal - nikdy
nevíš, kdy se rozhodneš kód upravovat a každá změna by měla mít
ideálně co nejmenší zásah do již hotového kódu. Michal ti dal dobrý
návrh na tabulky Víkend bych
tomu věnoval.
Co se týče kódu, je to docela divočina. Kdybys měl po nějaké době kód
revidovat, asi bys to trochu luštil Osobně bych si odpovědi házel do Session, třeba do pole "answers"
a na vyhodnocení bych použil třeba něco takového:
<?php
$_SESSION['answers']['qA01_1'] = 0;
$_SESSION['answers']['qA01_2'] = 1;
$_SESSION['answers']['qA01_3'] = 1;
$_SESSION['answers']['qA01_4'] = 0;
$_SESSION['answers']['qA01_5'] = 1;
$values = array();
$fields = array();
foreach ($_SESSION['answers'] as $answerName => $answerValue) {
if ($answerValue === 1) {
$values[] = $answerValue;
$fields[] = $answerName;
$result[$answerName] = $answerValue; // toto by asi bylo jeddnodušší než $values/fields, až to budeš implodovat, stačí pro sloupce použít funkci array_keys($result)
}
}
$query1 = "INSERT INTO table1(".implode(',',$fields).") VALUES (". implode(',',$values).")"; //zápis do DB
Jestli hodíš celý kód, asi to bude srozumitelnější
Zobrazeno 15 zpráv z 15.