NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

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.

Aktivity
Avatar
Zdenek
Člen
Avatar
Zdenek:5.3.2017 18:46

Ahojte,
na doporučení lidí zde z ITnetwork předělávám kod. Potřeboval bych radu jak vybrat z proměnných $qA01_1 až $qA30_5 ty proměnné, které obsahují hodnotu 1 a následně jak je zapsat do DB ? Děkuji předem za pomoc

 
Odpovědět
5.3.2017 18:46
Avatar
ConflictBoy
Člen
Avatar
ConflictBoy:5.3.2017 23:17

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 :-D

$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. "')");
        }
}
Nahoru Odpovědět
5.3.2017 23:17
I'm programmer, I have no life :)
Avatar
Zdenek
Člen
Avatar
Odpovídá na ConflictBoy
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_connec­t.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. "')");
Editováno 6.3.2017 22:10
 
Nahoru Odpovědět
6.3.2017 22:08
Avatar
ConflictBoy
Člen
Avatar
Odpovídá na Zdenek
ConflictBoy:13.3.2017 10:49
  1. ano, umí :)
  2. 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.
  3. nedá, nicméně můžeš použít mysql_connect, která první parametr nevyžaduje. Nicméně, mysql_connect byla ve verzi 7 vyhozena
  4. 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')
        }
}
Nahoru Odpovědět
13.3.2017 10:49
I'm programmer, I have no life :)
Avatar
Zdenek
Člen
Avatar
Odpovídá na Zdenek
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\htdoc­s\app_form\in­put_form32_pro­cess.php on line 303

Soucet: 0

 
Nahoru Odpovědět
14.3.2017 20:09
Avatar
Odpovídá na Zdenek
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
Nahoru Odpovědět
14.3.2017 20:33
Neaktivní uživatelský účet
Avatar
Zdenek
Člen
Avatar
Zdenek:14.3.2017 22:08

Tak jsem přidal $connect , hláška zmizla, ale výsledek SELECTu mi ukazuje 0, což je hloupost. Takže je otázka, zda mi ještě něco nechybí u $connect ?

$connect = mysqli_connect('localhost', 'root', 'pass', 'db');

V databázi jsou hodnoty ok:

 
Nahoru Odpovědět
14.3.2017 22:08
Avatar
Odpovídá na Zdenek
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á...

Nahoru Odpovědět
15.3.2017 8:04
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
ConflictBoy
Člen
Avatar
ConflictBoy:15.3.2017 10:34

K tahání dat z databáze budeš ještě potřebovat mysqli_fetch_as­soc() 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);
Nahoru Odpovědět
15.3.2017 10:34
I'm programmer, I have no life :)
Avatar
Zdenek
Člen
Avatar
Odpovídá na ConflictBoy
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 ?

Akceptované řešení
+5 Zkušeností
Řešení problému
 
Nahoru Odpovědět
15.3.2017 16:49
Avatar
ConflictBoy
Člen
Avatar
Odpovídá na Zdenek
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í :-)

Nahoru Odpovědět
15.3.2017 17:10
I'm programmer, I have no life :)
Avatar
Odpovídá na ConflictBoy
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á...

Nahoru Odpovědět
16.3.2017 8:04
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na Zdenek
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"...

Nahoru Odpovědět
16.3.2017 8:18
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Zdenek
Člen
Avatar
Odpovídá na ConflictBoy
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);
                }
Editováno 16.3.2017 22:22
 
Nahoru Odpovědět
16.3.2017 22:20
Avatar
ConflictBoy
Člen
Avatar
Odpovídá na Zdenek
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ší :)

Nahoru Odpovědět
17.3.2017 0:23
I'm programmer, I have no life :)
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 15 zpráv z 15.