Diskuze: Machr na PHP - Připomínač narozenin
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Vlastník

Zobrazeno 50 zpráv z 55.
//= 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.
no počkat? To jsou teďkom soutěže 3?
Je tu někde nějaký článek jak s databazemi pracovat přes PHP?
http://www.itnetwork.cz/…ogramy-v-php Ano a hned několik
Devbook je vlastně rozdělen do 3 částí: aplikace, weby a hry. Každá část bude mít svoji soutěž. O databázích v PHP toho spoustu napsal Kit - http://www.itnetwork.cz/…sql-databazi
Co všechno to má tedy poskytovat ? Bude se řešit i design ? Nebo stačí
nějaký pěkný kód, který prostě vypíše kdo má nejblíže narozeniny ?
Dělám teď ještě závěrečku do školy z programování (ano ten engine).
Takže uvidím jak to stihnu, ale rád bych tohle zkusil
Je to o práci s databází a datem, UI se neřeší
Nevidím nikde zmínku o výstupu v HTML, takže se zřejmě má jednat o
aplikaci CLI na 3 řádky
Ok Takže pouze vypíše
nejbližší narozeniny a za jak dlouho... fajn pokusím se něco vytvořit
.Zítra mám dvě hodiny webů, možná budu dělat ten engine, možná udělám
tohle .. uvidím , mám je od 7:00 tka záleží jak se bude chtít
Taky zkusím něco vymyslet
Jiný ovladač DB než PDO by se už neměl používat. Ostatní jsou zastaralé.
MySQLi je jen mezičlánek mezi ovladačem MySQL a PDO. Můžeš ho přeskočit.
Tak tady to je: http://bit.ly/11yzMls
Být tebou tak sem ty zdrojáky radši nedávám... Spíš to pošli sdracovi do PM
PHP od něj rozhodně nezkopíruji. Maximálně tabulku, pokud by se mi nechtělo ji vymýšlet.
Chceš to i s generováním výstupu v HTML? Samotné PHP má v mém případě jen asi 5 řádek.
5 řádek? tak to bude užitečný a do budoucna určitě použitelný ^^
Vešlo by se, ale rozepsal jsem parametry konstruktoru, aby to bylo
názornější. Také SQL dotaz jsem raději rozepsal na 6 řádek. Ošetřil
jsem i výjimky, takže to nějakých 15 řádek jistí
to já jsem se trošku rozkódil jednoduše se mi to dělat nechtělo
jen ať to je pěkně použitelné
na příště
//chrchly chrchly výmluvy chrchly chrchly, už je ten kašel dobrý
co je na tom za výmluvy? 90% toho co draco chce jde přes SQL dotaz
Je fakt, že jsem to nejprve kompletně napsal v SQL a teprve pak to zabalil do PHP.
už se těším až uvidíš mojí práci docela se mi to líbí
require 'birthday/loader.php';
$users = new User();
foreach($users->getLast() AS $value)
echo 'brzo bude mit narozky uzivatel ' . $value->name;
EDIT : použil jsem tam magic method takže to jde krasně
už mě to nebaví tak to když tak můžete někdo použít a celý to dodělat šel by z toho
udělat super "manager" pár úprav a je to
mě už to omrzelo
// Connection.php
<?php
class Connection{
private $database = NULL;
private $config = Array(
"user" => "root",
"pass" => "",
"db" => "birthday",
"con" => "127.0.0.1;",
);
protected function connect(){
$this->database = new PDO(
'mysql:host='.$this->config["con"].'dbname='.$this->config["db"],
$this->config["user"],
$this->config["pass"],
array( PDO::ATTR_PERSISTENT => false)
);
}
public function sendData($query){
if($this->database != NULL)
$this->database->query($query);
}
public function getData($query){
if($this->database != NULL)
return $this->database->query($query);
}
public function disconnect(){
// Just die bitch...
die(); // okay :(
}
}
// Action.php by se jestě mohl dodělat nejspíš bude potřeba require User a connection nwm jestli je dobře to mít v jednom souboru nebo rozdělit do samostatnejch tříd.. nwm php neumím
<?php
if(isset($_POST["name"]) && isset($_GET["method"]))
new Add($_POST, $_GET["method"]);
class Add{
private $user = null;
function __construct($post, $method){
$this->user = new User();
switch($method){
case "add" : $this->addBirthday($post);
break;
case "edit": $this->editBirthday($post);
break;
case "delete": $this->deleteBirthday($post["id"]);
break;
}
}
private function addBirthday($post){
$this->user->newModel($post["name"], $post["year"]."-".$post["month"]."-".$post["day"]);
$this->user->add();
}
private function editBirthday($post){
$this->user->newModel($post["name"], $post["year"]."-".$post["month"]."-".$post["day"], $post["id"]);
$this->user->edit();
}
private function deleteBirthday($id){
$this->user->id = $id;
$this->user->delete();
}
}
// a user.php
<?php
class User extends Connection{
private $cArray = array();
function __construct(){
$this->connect();
}
public function newModel($name, $date, $id = NULL){
$dat = explode("-",$date);
$this->cArray["id"] = ($id == NULL ? NULL : $id);
$this->cArray["name"] = $name;
$this->cArray["year"] = $dat[0];
$this->cArray["month"] = $dat[1];
$this->cArray["day"] = $dat[2];
$this->getDate();
}
public function __get($index){
return $this->cArray[$index];
}
public function __set($index, $value){
$this->cArray[$index] = $value;
}
public function add(){
$this->sendData(
'INSERT INTO birthday (name,year,month,day)
VALUES("'.$this->cArray["name"].'","'.$this->cArray["year"]
.'","'.$this->cArray["month"].'","'.$this->cArray["day"].'");'
);
}
public function edit(){
$this->sendData(
'UPDATE birthday SET
name="'.$this->cArray["name"].'",
year="'.$this->cArray["year"].'",
month="'.$this->cArray["month"].'",
day="'.$this->cArray["day"].'"
WHERE id="'.$this->cArray["id"].'";'
);
}
public function delete(){
$this->sendData(
'DELETE FROM birthday WHERE id="'.$this->cArray["id"].'";'
);
}
public function getLast(){
return $this->get(
'SELECT * FROM birthday WHERE month >='.date("m")." AND day >=".date("d").";"
);
}
public function getAll(){
return $this->get('SELECT * FROM birthday;');
}
private function get($query){
$i = 0; $array = array();
$item = $this->getData($query);
while($it = $item->fetch(PDO::FETCH_ASSOC)){
$array[$i] = new User();
$array[$i]->newModel($it["name"], $it["year"] . "-". $it["month"] ."-".$it["day"], $it["id"]);
$i++;
}
return $array;
}
private function getDate(){
$this->cArray["countM"] = ($this->cArray["month"] - date("m"));
$this->cArray["countD"] = ($this->cArray["day"] - date("d"));
$this->cArray["countY"] = date("Y") - $this->cArray["year"];
}
function __destruct(){
$this->disconnect();
}
}
Chtěl jsem mít unixovej čas na narozeniny a pak mi kámoš připoměl, že je to od roku 1970 takže to nestačí tak jsem se s*al s date typem a na to asi nemam dostatečný znalosti SQL abych to porovnával podobným stylem jako to mám teď takže v DB nic moc ale myslím že KIT by vypeklil takovej SELECT že bych mohl vypustit pár řádků na explode atd.
// no a teď nějaký example ale to je snad jasný podle kódu
getLast()// vratí pole nejbližších narozenin kdyby náhodou mělo víc lidi ve stejný den
getAll() // vrací všechny narozeniny
add() // přidá narozeniny do db
edit() // editace
delete() // smazání narozenin
//getovat si různý blbosti jde jednoduše např
$user = new User();
foreach($user->getLast() AS $value)
echo $value->name; // vypíš jméno
// pak je tam samozřejmě
countM,countD // kolik mesicu a dnu zbejva do narozenin
countY // kolik mu je let
name // jméno člověka
year,month,day // kdy se narodil
EDIT : jo a sql
create table birthday(
id INT UNSIGNED NOT NULL PRIMARY KEY UNIQUE AUTO_INCREMENT,
name VARCHAR(255),
year SMALLINT,
month SMALLINT,
day SMALLINT);
měl jsem tam date type pak jsem měl ale problém tahat z DB přesně to co chci pomocí SQL. Musel bych to řešit až uvnitř.
SELECT * FROM birthday WHERE month >='.date("m")." AND day >=".date("d").";"
Tím si pěkně vytáhnu posledního a je to s DATE jsem měl problém
neznám všechny vychytávky a
funkce v SQL abych si to mohl tahat tak jako tu mi to vždy vracelo prvního
narozenýho což mi bylo k ničemu
Tak hotovo zítra to sem dám
My máme narozeniny uloženy jako timestamp a problém s tím není. Před rokem 1970 je hodnota prostě záporná.
Ahoj,
i já zde přidávám výtvor, stihl jsem to tak tak. http://uloz.to/…az-final-zip
návod na zprovoznění
na localhostu si v phpmyadmin vytvořte databázi narozeniny. V databázi
narozeniny vytvořte tabulku machr24. Pak si zkopírujte soubory ze zipu. Pro
naplnění tabulky ukázkovými daty spusttě soubor sample.php. Pak už
jednoduše index.html.
No protože na localhostu je pořád leden roku 70, tak do url k indexu ještě přidejte
?year=2013&month=05
kde hodnota year udává rok, který chte použít a month udává měsíc.
Kdybych náhodou vyhrál, tak už teda nevím co za placku si vzít
(nicméně mi můžete poradit, už mám c#, php a algoritmy).
Poslal jsem svůj výtvor David Hartingervi tak doufám že na mě nezapomene
Trochu jsem na těch zdrojákách vytuhl, než jsem se tím prokousal. Došel jsem k následujícímu pořadí:
1. Kit (100 bodů) - Všechnu logiku schoval do krátkého SQL
dotazu, aplikace je minimalistická a velmi přehledná. Napiš prosím
x, kterou placku chceš.
2. FilipPyrek (90 bodů) - Nějak podobně bych to asi dělal
já.
3. fuulll (80 bodů) - Tvůj kód mi dal opravdu zabrat, v
nějakých ohledech je docela zajímavý, v jiných ale zbytečně komplikovaný
(např. vlastní selection sort, když lze použít třídící funkce, co
nabízí PHP).
4. Misaz (60 bodů) - Stáří počítáš jen jako rozdíl
roků, v kódu máš SQL injekce, měl bys používat prepared statements, vzi
třeba tady (ty otazníky v SQL dotazu) - http://www.itnetwork.cz/php/mvc-modely.
Jako vždy děkuji za účast a budu se těšit příště
Super, díky za skvělé slovní hodnocení. Škoda jen, že není placka
"Machr na SQL", ta by se mi líbila
Nikde tu nevidím link na Kitův výtvor...
Myslím, že se nebude zlobit, když ho sem pošlu:
http://www.itnetwork.cz/dev-lighter/114
http://www.itnetwork.cz/dev-lighter/115
Snažil jsem se to napsat co nejnázorněji. Ve view jsem řešil projekci tak, aby se to dalo použít na více způsobů. V selectu jsem pak udělal jen sort a limit. Místo seznamu sloupců se sice dá napsat "*", ale moc rád to nemám.
To jsem tam přidával až dodatečně, aby u něj byla 0. Proto mám v pohledu posunutí o 1 den.
Zobrazeno 50 zpráv z 55.