Diskuze: Celková suma
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 42 zpráv z 42.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Count ti vrátí počet řádků. Příkaz se SUM vypadá v pořádku. Není problém v tom, že ho pouštíš na produkty a ne na objednané produkty?
Pokud chceš v tomhle pomoct, dej sem alespoň nástřel struktury databáze.
Mozna by pomohlo GROUP BY a definovat propojeni radku.
Taky si myslím, že je v pořádku. DB u produktu vypadá následovně
datum
datum_a_cas
id_objednavky
nazev_objednavky
fakturacni_adresa
dorucovaci_adresa
cena
status
Tohle je vše co u objednávky mám.
Tak nevím jestli jsem to nezadal špatně ale nefunguje
Db::query('SELECT SUM(cena) FROM objednavka WHERE datum=? GROUP BY cena', date("Y-m-d"))
Samozřejmě zadal. Klauzule GROUP BY a výčet atributů patří až za podmínku.
Nejsem si jistý, že jsem tě pochopil správně. Pravdou je, že s SQL se stále učím ale i takový zápis nefunguje
Db::query('SELECT cena, SUM(cena) FROM objednavka WHERE datum=? GROUP BY ?', date("Y-m-d"), 'cena')
Ahoj a není tam spíše problém s datovým typem? Můžeš poslat alespoň strukturu tabulky, jak píše Neaktivní uživatel? Tj. něco v duchu
CREATE TABLE `dev` (
`devID` SMALLINT(5) UNSIGNED NOT NULL AUTO_INCREMENT,
`key` VARCHAR(70) AS (concat(`nm`,'|',`sn`)) VIRTUAL,
`descr` TINYTEXT NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci',
`nm` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci',
`sn` VARCHAR(19) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci',
PRIMARY KEY (`devID`),
INDEX `devID_key_nm_sn` (`devID`, `key`, `nm`, `sn`)
)
COLLATE='utf8mb4_unicode_ci'
ENGINE=InnoDB;
Aha. Tak to se omlouvám.
Tady to je
CREATE TABLE IF NOT EXISTS `objednavka` (
`id` int(11) NOT NULL,
`datum` date NOT NULL,
`datum_a_cas` datetime NOT NULL,
`id_objednavky` int(11) NOT NULL,
`nazev` varchar(255) NOT NULL,
`zakaznik` varchar(255) NOT NULL,
`adresa_doruceni` text NOT NULL,
`fakturacni_adresa` text NOT NULL,
`cena` int(11) NOT NULL,
`status` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;
Ač by tvá tabulka chtěla některé úpravy, i v tomto stavu by SUMa měla fungovat. A zeptám se teď hloupě, jiné dotazy ti fungují? Mířím tím k tomu, zda ti funguje ten DB wrapper, který používáš. Je správně nastaven případně generuje validní DB dotazy?
SELECT SUM(cena)
FROM objednavka
WHERE datum = date("Y-m-d")
GROUP BY id
Tohle nefunguje?
Zobrazování funguje. Vše funguje. Nad výpočtem jsou nové produkty a
kolik jich je. To se zobrazuje.
Jen pro informaci. Jaké úpravy prosím myslíš? Rád se poučím.
Děkuji
Bohužel ne
Takhle je to zapsané a nejde to. Upravil jsem jen podmínku pro datum
Db::query('SELECT SUM(cena)
FROM objednavka
WHERE datum = ?
GROUP BY id', date("Y-m-d"));
Zkusil bych otestovat místo date("Y-m-d") tam dát přímo datum "2019-05-10"... nebo nějaký, který máš v DB
Ahoj, používám následující script. Pro úplnost přikládám i třídu
s připojením.
sum.php
<?php
include_once('connection.php');
$database = new Connection();
$db = $database->open();
try {
$sql = "SELECT sum(fin_castka) as total FROM finance";
$query = $db->query($sql);
$row = $query->fetch(PDO::FETCH_ASSOC);
if ($row) {
$sum = $row['total'];
}
} catch (PDOException $e) {
echo "Oooops! Našel se problém s připojením k databázi: " . $e->getMessage();
}
$database->close();
connection.php
<?php
Class Connection {
private $server = "mysql:host=localhost;dbname=is";
private $username = "root";
private $password = "";
private $options = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,);
protected $conn;
public function open() {
try {
$this->conn = new PDO($this->server, $this->username, $this->password, $this->options);
return $this->conn;
} catch (PDOException $e) {
echo "Ooops... Spojení nelze navázat: " . $e->getMessage();
}
}
public function close() {
$this->conn = null;
}
}
Tak jsem si to teď vyzkoušel a s GROUP BY mi to taky nefunguje, což mi přijde divné. Bez něj to funguje.
Stačí v sum.php změnit $sql, v connection.php zas přístupy, doplnit WHERE a mělo by ti vše fungovat. Pokud budeš mít otázky ke kódu, tak rád vysvětlím, ale myslím, že by mělo být vše jasné.
(priklad, se sum a group)
google = mysql group by
https://dev.mysql.com/…difiers.html
SELECT year, country, product, SUM(profit) AS profit
FROM sales
GROUP BY year, country, product WITH ROLLUP
https://www.tutorialspoint.com/…y-clause.htm
(se ti pokouseli rici ostatni, ze se where pise az za group)
google = mysql group by where
https://stackoverflow.com/…up-by-clause
SELECT Service_ID, Service_Type, SUM(consumer_feedback)
FROM consumer9
GROUP BY Service_ID
WHERE Service_Type=Printer;
Mno, a tez se te ptaji, zda ti to spravne preklada dotazy z te otaznikove formy na sql dotaz. Pripadne si dej vypsat sql errory. Nejspis mas globalne potlacene chybove hlasky nebo tam nemas prikaz, aby zobrazil sql error. Takhle to vypada, ze se spatne posklada sql prikaz. Pripadne by sis mohl vypsat poskladany sql dotaz na obrazovku, jestli to ten program umoznuje a zkopirovat jej do phpmyadmina, jestli funguje nebo jaky error phpmyadmin vypise.
Ok, tak je potřeba se podívat spíše na třídu Db.php... patrně se to zapisuje jinak. Zkus přiložit spíše jako soubor.
Jo, a tez pro GROUP plati, ze bys ten samy sloupec mel mit v SELECT, tusim. Nebo mozna v nejake exoticke db jako oracle ci mssql je to nutne, nevim.
no však sem plácni ten
Db.php... v něm bude vidět jak se to má zapsat, aby ti to vyrobilo validní
SQL dotaz...
Vsichni ti porad rikame, ze nevidime do tve knihovny na db, viz Tomas, musel bys dat jeji kod. Nebo si k ni najdi manual, tam bude jiste par prikladu, jak se to spravne zapisuje, abys spustil sql dotaz s otazniky a normalni.
A priklad od Jaroslav Smrž ti nefunguje? Nebo jej neumis upravit pro tve sql pripojeni? Jestli by nebylo jednodussi pouzivat jeho kod nez tridu, ve ktere se nevyznas.
Pro jistotu dodám, že si musíš soubor sum.php requirovat v šabloně a total vypíšeš pomocí
<?php echo $sum; ?>
Děkuji. Jde mi to vypsat. Nicméně mi bych potřeboval aby tam byly data
jen za dnešní den.
Zkusil jsem provést úpravu
$query = $db->query('SELECT SUM(cena) AS total FROM objednavka WHERE datum=?',date("Y-m-d");
a chyba.
Jinak příkaz date("Y-m-d") mi funguje normálně. Pár řádku zpět mám napsané Počet objednávek a to jede.
Tak to je jasné, že to takhle nepůjde. Máš úplně špatně závorky a uvozovky...
Máš recht. Díky za opravu. Nicméně i tak nic.
$query = $db->query("SELECT SUM(cena) AS total FROM objednavka WHERE datum=?", date("Y-m-d"));
Počkej, kam to píšeš vůbec? SQL dotaz musíš zapsat do proměnné $sql např.
$sql = "SELECT sum(fin_castka) as totalprijem FROM finance WHERE fin_typ='PŘÍJEM'";
pak až následuje
$query = $db->query($sql);
No takhle jsem to zrovna zapisovat nechtěl ale funguje to. Myslím, že
není ani dobré to takhle zapisovat. Podle toho co jsem četl atd.
Nicméně to funguje. Děkuji
Jak není dobré takhle zapisovat??? To fakt nechápu. Do proměnné $sql uložíš dotaz, a ten pak zpracuješ pomocí instance v Connection.php. Víš vůbec jak funguje PDO a objekty? No nic, jestli ti to funguje, tak OK, ale měl bys trochu nastudovat základy OOP.
V pohodě. Nechtěl jsem se tě nějak dotknout. Faktem je, že OOP jsem si
moc neprostudoval. Nějakou dobu se k tomu už chystám.
Každopádně děkuji za řešení.
Pokud informace mas k clanku a nepridas odkaz, tak sorac. Ja zadny clanek
tady necetl, takze stale nevim, jak vypada class pro db
Ono se to treba nepises s carkou, jak to mas, ale parametry se davaji treba zvlast prikazem.
$query = $db->query("SELECT SUM(cena) AS total FROM objednavka WHERE datum=?");
$query->addParam(date("Y-m-d"))
Takže pokud používáš místní db wrapper nad pdo tak by se dala použít třeba tato statická metoda:
$db = Db::queryOne('SELECT SUM(cena) AS total FROM objednavka WHERE datum=?', date("Y-m-d"));
echo $db['total'];
V pohodě, není za co. Já jen že PDO ovladač je o dost dál než bylo třeba Mysqlli. Asi si nejspíš myslel vkládání proměnných do dotazu, to je ale něco trochu jiného než vložení dotazu do proměnné. Zkus na PDO kouknout třeba na www.php.net
Péééécka. Toto jsem hledal. Takže jsem měl jen chybný zápis. Zkoušel jsem i
Db::queryOne(.....)
ale zobrazoval jsem si vždycky
echo ($promena['cena']);
Jo to jsem měl namysli. No budu se muset na OOP podívat. Každopádně díky.
Jaký je prosím rozdíl mezi:
$sql = "SELECT sum(fin_castka) as totalprijem FROM finance WHERE fin_typ='PŘÍJEM'";
$query = $db->query($sql);
a
$query = $db->query("SELECT sum(fin_castka) as totalprijem FROM finance WHERE fin_typ='PŘÍJEM'");
V tom případě nechápu tvůj komentář na který odpovídám
Zobrazeno 42 zpráv z 42.