Zdravím, mám tabulku:
id(int) | datum(date) | castka(int)
Jak z mysql vytáhnu celkem sumy(součty všech řádků v jednom měsíci) jednotlivých měsíců, přičemž chci dostat max 12 měsíců zpětně?
Neni to tajný, ruian poskytuje tyto záznamy v csv veřejně a pomocí scriptu je importuju do DB:
function loadFile($fileName, $_db) {
$folder = "csv";
$file = "$folder/$fileName";
$handle = fopen($file, "r");
try {
$query_ip = $_db->prepare('
INSERT INTO adresni_mista (kod_adm,kod_obce,nazev_obce,c,nazev_momc,b,nazev_mop,kod_casti_obce,nazev_casti_obce,kod_ulice, nazev_ulice,typ_so,cislo_domovni,cislo_orientacni, znak_cisla_orientacniho, psc,souradnice_y,souradnice_x,plati_od) VALUES (
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
)
');
// unset the first line like this
fgets($handle);
// created loop here
while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
$query_ip->execute($data);
}
fclose($handle);
} catch(PDOException $e) {
die($e);
}
}
//nejdriv promazem db
$prep = $_db->prepare("TRUNCATE `ruian`.`adresni_mista`");
$prep->execute();
$files = scandir("csv");
foreach ($files as $file) {
$pripona= substr($file, -4);
if($pripona == ".csv") {
loadFile($file, $_db);
}
}
tabulka:
CREATE TABLE IF NOT EXISTS `adresni_mista` (
`id` int(11) NOT NULL,
`kod_adm` int(11) NOT NULL,
`kod_obce` int(11) NOT NULL,
`nazev_obce` char(70) COLLATE utf8_czech_ci NOT NULL,
`nazev_momc` text COLLATE utf8_czech_ci NOT NULL,
`nazev_mop` text COLLATE utf8_czech_ci NOT NULL,
`kod_casti_obce` int(11) NOT NULL,
`nazev_casti_obce` text COLLATE utf8_czech_ci NOT NULL,
`nazev_ulice` char(80) COLLATE utf8_czech_ci NOT NULL,
`typ_so` text COLLATE utf8_czech_ci NOT NULL,
`cislo_domovni` text COLLATE utf8_czech_ci NOT NULL,
`cislo_orientacni` int(11) NOT NULL,
`znak_cisla_orientacniho` text COLLATE utf8_czech_ci NOT NULL,
`psc` int(11) NOT NULL,
`souradnice_y` text COLLATE utf8_czech_ci NOT NULL,
`souradnice_x` int(11) NOT NULL,
`plati_od` datetime NOT NULL,
`a` varchar(100) COLLATE utf8_czech_ci NOT NULL,
`b` varchar(100) COLLATE utf8_czech_ci NOT NULL,
`c` varchar(100) COLLATE utf8_czech_ci NOT NULL,
`d` varchar(100) COLLATE utf8_czech_ci NOT NULL,
`kod_ulice` int(11) NOT NULL
)
A vlastně momentálně co reálná adresa, to řádek.
Uvažuju nad rozdělením:
Tabulka Města ID(int), nazev(char 50). psc(int 5)
Tabulka adresy: ID(int), mesto(int), ulice (char 70), čp (int), čo(int), x(int),y(int)
A nejdřív bych podle naštěpávače chtěl po uživateli zadat město, těch by už němělo být 3mil, a v druhém formuláři bych teprve hledal adresy podle toho města... Jen ještě nevím podle jaké topologie v naštěpávači vyhledávat ulici, čp/čo zároveň....
V principu chci docílit toho, aby uživatel co nejjednodušeji vyplnil svojí adresu (jen existující podle ruianu)...
Samozřejmě bych ho mohl donutit napsat celou adresu a pak mu dát na výběr 5 nejlepšíc shod, ale to je pro uživatele dost nekomfortní
#40 Kit
Díky,takže IF{} else{} za
if($user) $where = "WHERE `user` = $user" : $where = null;
Podívej se prosím ještě na metody add a edit, jsou tam odlišné zápisy předávání proměnných a psal jsem:
Ten zápis metody add a edit je naschvál - zajímá mě, jestli je mezi tim v praxi rozdíl? Příjde mi totiž přehlednější to mít rovnou v deklaraci proměnných než to posílat jako pole (netbeans mi ukaze, jaky jsou dulezity parametry u metody, kdyz predavam pole, tak ne)
#27 Kit
Dobře to s id dává smysl, chtěl jsem jen docílit toho, že se mi automaticky načtou data při volání třídy, když vím, že chci číst data podle id....
Takže rozumím li tomu správně, nemám si vytvářet proměnné jednotlivých dat uvnitř třídy ale přistupovat napřímo pokud chci vkládat volat rovnou funkci na insert, pokud chci číst, čtu danné id... Mě se v tomhle ztrácí logika, na tohle přece nepotřebuju třídy a stačej mi obyčejné statické funkce?
#18 Kit
Takže principielně:
function login($user, $pass) {
$dotaz = $this->_db->prepare("SELECT id FROM users WHERE username = ? AND password = ?");
$dotaz->execute(array($user, $this->hashPwd($pass)));
if($dotaz->rowCount() > 0) { //Vyfusnem min. 1 řádek, takze zadal login v poradku
$data = $dotaz->fetch();
$this->setId($data["id"]);
} else {
//$this->writeError("Chybně zadané údaje!");
throw new Exception("Chybne udaje!");
}
}
if(isset($_POST["user"])) {
$f_user = $_POST["user"];
$f_pass = $_POST["pass"];
try {
$user->login($f_user, $f_pass);
} catch (Exception $e){
echo $e->getMessage();
}
}
je to v pořádku?
Funguje to, spíš mě zajímá, jestli se to takhle dělá i v praxi...
Mno trošku bojuju....
index:
<?php
ini_set("display_errors", 1);
session_start();
define('SQL_HOST', 'localhost');
define('SQL_DBNAME', 'oop');
define('SQL_USERNAME', 'root');
define('SQL_PASSWORD', '');
$dsn = 'mysql:dbname=' . SQL_DBNAME . ';host=' . SQL_HOST . '';
try {
$_db = new PDO($dsn, SQL_USERNAME, SQL_PASSWORD);
$_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die('Connection failed: ' . $e->getMessage());
}
include "class/login.php";
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<?php
$user = new User($_db);
if(isset($_POST["user"])) {
$user = $_POST["user"];
$pass = $_POST["pass"];
$user->login($user, $pass);
}
//$user->login("jakub", "petr");
//$user->logout();
if($user->isLogged()) {
echo "Test OK!";
} else {
echo "<form method=\"post\" action=\"\" > ";
echo "Jmeno: <input type=\"text\" name=\"user\" ><br>";
echo "Heslo: <input type=\"text\" name=\"pass\" ><br>";
echo "<input type=\"submit\" name=\"btn\" ><br>";
echo "</form>";
}
echo "<br>";
?>
</body>
</html>
login.php (přejmenuju na users.php)
<?php
include "messages.php";
class User extends Messages {
private $id;
private $_db;
function __construct(PDO $db) {
if(isset($_SESSION["loginId"])) $this->id = $_SESSION["loginId"]; //pokud sme jiz prihlaseni, tak to rovnou ulozime
$this->_db = $db;
}
function isRegister() {
$sql = 'SELECT username FROM users LIMIT 1';
if($this->_db->query($sql)->rowCount() > 0) return true;
return false;
}
function isLogged() {
return isset($_SESSION["loginId"]);
}
function setId(int $id) {
$this->id = $id;
$_SESSION["loginId"] = 100;
}
function login($user, $pass) {
$pass = MD5($pass);
$dotaz = $this->_db->prepare("SELECT id FROM user WHERE username = ?, password = ?");
$dotaz->execute(array($user,$pass));
if($dotaz->rowCount() > 0) { //Vyfusnem min. 1 řádek, takze zadal login v poradku
$data = $dotaz->fetch();
$this->setId($data["id"]);
$this->writeSucces("Přihlášeno!");
} else {
$this->writeError("Chybně zadané údaje!");
}
}
function logout() {
unset($_SESSION["loginId"]);
unset($this->id);
}
}
Stránka vrací:
Fatal error: Uncaught Error: Call to a member function login() on string in C:\xampp\htdocs\ooplogin\index.php:32 Stack trace: #0 {main} thrown in C:\xampp\htdocs\ooplogin\index.php on line 32
Co mu vadí? K db připojený jsem...
Teď si tu tak trošku píšu sám, omlouvám se :D
napaldo mě tohle řešení, kdy tu instanci předám pomocí konstruktoru do třídy...
private $id;
private $_db;
function __construct(PDO $db) {
if(isset($_SESSION["loginId"])) $this->id = $_SESSION["loginId"]; //pokud sme jiz prihlaseni, tak to rovnou ulozime
$this->$_db = $db;
}
function isRegister() {
$sql = 'SELECT username FROM users LIMIT 1';
if($this->_db->query($sql)->rowCount() > 0) return true;
return false;
}
function isLogged() {
return isset($_SESSION["loginId"]);
}
Co myslíte?
Další otázka... Pokud správně chápu, třída by měla být nezávislá jiným třídám, jak řešit tahání z DB, když chci používat pdo?
Můžete mi tu prosím udělat příklad jak pomocí PDO udělám funkci na vytáhnutí username z mysql když znám id?
function getUsername($id) {
}
Jde mi o to, jestli každé volání funkce vytvářet novou instanci s pdo, nebo v hlavičce webu v indexu vytvořit
$db = new pdo(user, pass, db....);
A pak celý projekt používat ve všech třídách pomocí globals $db? přijde mi to jako prasárna...
Případně vytvořit jednu solo třídu, která bude obsluhovat DB? vkládat/tahat data z db? Já vím že tímhle se už dost provokuje MVC, ale potřebuju nejdřív pochopit základy a standarty OOP
Je tam čistě PHP, které vrací vždy číslo... Je možné, že tam je smetí, jak ho odfiltrovat?
Zdravím,
tahám pomocí file_get_contents 3 čísla (opravdu to sou jen čísla)
$a = file_get_contents("a.php");
$b = file_get_contents("b.php");
echo $a; //vrátí 10
echo $b; //vrátí 2
echo ($a / $b); //vrátí chybu Warning: Division by zero in ........
Nevíte proč? Díky