FAQ |
Kalender |
![]() |
#11 | ||
|
|||
Medlem
|
Om du vill undvika att anropa en connect funktion när db används så kan enkapsulera denna funktionalitet, t.ex i en basklass, och ha en eller flera olika dataklasser
class MyData extends BaseData { public function getSomething($id) { return $this->db->getRow("SELECT * FROM table WHERE id=? LIMIT 1", $id); } } $o = new MyData (); $row = $o->getSomething(); echo $row->column1; |
||
![]() |
![]() |
![]() |
#12 | ||
|
|||
Administratör
|
Citat:
Därmed tycker jag det är svårt att svara på frågan i tråden. Vill man hjälpa till att snygga till en funktionell röra så gott det går (som de flesta), eller vill man hjälpa till att skapa en vettig struktur (som ConnyWesth). Däremot håller jag med dig om PDO, av lite andra anledningar. MySQLi har också prepared statements som är lika säkra. Och att byta databas för ett långlivat projekt är till 99% att skriva om frågor och struktur. Att köra ett par regexp replace över kodbasen gör inte stor skillnad. Däremot har PDO ett par funktioner som mysqli saknar. T ex lite smidigare vid flera parametrar till prepared statements och möjligtheten att direkt mappa mot ett eget objekt (motsvarigheten hos PDO mappar till en stdClass).
__________________
eldefors.com - Personlig (teknik)-blogg |
||
![]() |
![]() |
![]() |
#13 | ||
|
|||
Flitig postare
|
Tack för alla svar! Verkligen intressant att ta del av era tankar.
Jag håller mest på att leka och lära mig med diverse hobbyprojekt, men känns alltid bra att lära sig rätt från början av er som har mer vana. |
||
![]() |
![]() |
![]() |
#14 | ||
|
|||
Nykomling
|
Legendarisk: Fortsätt experimentera och ha kul. När du säger att du vill lära "rätt" från början så har du inte fel i sak men jag tror på mängdträning allra först. Tanka ner färdiga skript, ändra någon klass eller metod och spinn vidare. En sak man lär sig efter ett tag är att det som är rätt idag kan vara helfel imorgon. Som militär ambulansman fick jag lära mig 15-2 metoden vid hjärt-lungräddning och idag är det någon annan kombination som gäller. Spelar roll om personen lever när kvällen är slut eller hur!
Skicka pm så ger jag dig gärna min skype och kan hjälpa mer hands-on om det behövs. Ha en god och behaglig kväll! OT: Angående Clerence kommentar och för din egen del ta gärna del av vad andra tycker om ämnet OOP och mer rakt-på-sak programmering som procedurell programmering kanske kan kallas. Jag tycker Java är vackert språk men jag får mer gjort med Php men har igentligen ingen religös åskådning om ämnet som sådant. Men att säga att man tycker procedurbaserad programmering rockar 2013 betyder att man genast ska brännas på bål anno 1498 i Spanien. För webben är procedurprogrammering mer naturlig tycker jag. Men alla tycker olika såklart. Länk: http://www.rebol.com/cgi-bin/blog.r?view=0425 Senast redigerad av corneliisandberg den 2013-06-14 klockan 21:18 |
||
![]() |
![]() |
![]() |
#15 | ||
|
|||
Klarade millennium-buggen
|
Jag håller med Clarence om att den Objektorienterade paradigmen är den mest logiska att välja om man vill jobba med programmering över huvud taget.
Det gamla sättet att skriva kod "den imperativa" paradigmen är så obsolete den kan bli. Strunta i att gå omvägar via dessa crappiga exempel som beskriver Imperativa lösningar, sök efter de objektorienterade, använd gärna PDO för databasaccess eller andra objektorienterade sätt att skriva kod. |
||
![]() |
![]() |
![]() |
#16 | ||
|
|||
Administratör
|
Citat:
Men för all del, jag har inget emot att man börjar med dålig kod. Huvudsaken är att man börjar, fortsätter och man vill röra sig framåt. Därför jag tycker frågan i tråden är svår. Jag har också skrivit dålig kod, det hör till att man har en personlig utveckling. Själv skriver jag bättre kod för varje år som går trots att jag jobbat mestadels med PHP i över 10 år (med hobbyprojekt och mindre projekt i en mängd andra språk, förvisso). Att du tror att man ska använda Java för att skriva objektorienterad kod tyder på väldigt liten erfarenhet på området. Själv jobbar jag objekt-orienterat med PHP sedan många år, liksom mina kollegor. Inte sagt att det är perfekt kod för att det är objektorienterat, men det ger förutsättningarna att växa till en bra nivå. För 5-10 år sean var PHP communityn förvisso väldigt omogen inom området och man har på något dumt sätt på den profesionella nivån lärt sig själv det som t ex Java-communityn lärde sig fem år tidigare. Men det kanske också handlar om PHPs ursprung.
__________________
eldefors.com - Personlig (teknik)-blogg |
||
![]() |
![]() |
![]() |
#17 | ||
|
|||
Nykomling
|
Kamrater Conny o Clarence!
Er kod är bra och min kod är bra. Denna tråd börjar utveckla sig till en religiös åskådning. Jag menade bara att användaren Legendarisk skulle utforska sina möjligheter och inkludera det sätt han vill för att kunna prata med just sin databas. Du Clarence är "administrator" vilket bör göra att du kan elevera frågan till en högre och mer abstrakt nivå. Jag tycker inte du eller Conny har fel. Men jag tycker Clarence är partisk. Jag har väl aldrig sagt att man ska börja med dålig kod? Procedurbaserad kod är väl det de flesta flygplan, pensionssystem och andra rätt ändamålsenliga system jobbar med? De mest rudimentära systemen bygger på metoder som bevisats hålla under mycket lång tid. Jag håller nog med Carl Sassenrath att de flesta OO projekten har mycket svulstig kod och därmed blir svår att underhålla. De som inte håller med Carl kan ju alltid argumentera på hans blogg! Jag tror Carl har mer erfarenhet än de flesta av oss med tanke på att han utvecklat ett flertal operativsystem och programmeringsspråk. Vad jag menar med att webben i sig är mer procedurell än t.ex. en Windowsprogram är att varje klick som laddar om en sida instansierar sig själv och därmed förlorar du OOP vid varje klick. $newFow = new Form(); förlorar lite av sin charm där tycker jag iaf. Häxprocesser och imperativ förföljelse är inte adekvat här. Användaren 'Legendarisk' vill veta vilket sätt som bäst lämpar sig. Vi har alla tre och fler därtill visat på ett flertal sätt ur flera olika vinklar hur du kan kontakta databasen. Det är väl bra? Nu är detta ett glömt kapitel för mig. Som Clarence och Conny indirekt säger...må bästa program tjäna mest pengar ![]() Hoppas Legendarisk och andra läsare fick hjälp, jag skickar gärna min skype om du behöver hjälp. |
||
![]() |
![]() |
![]() |
#18 | ||
|
|||
Klarade millennium-buggen
|
Här kommer ett exempel på kod för att använda den objectoerienterade paradigmen för PDO och getConnection ()-metoden.
Det här är bara ett enkelt exempel på hur man kan göra. Jag har även lagt in felhantering med 'try {} Catch {}'.... Jag har valt att göra metoden getConnection() static så det inte går att skapa mer än en instans, som i sig görs genom att Connection bevaras i en static deklarerad variabel som jag initierar till null (static $dbconnection = null). I detta fall heter min databas 'Test' därav namnet 'ApplicationDatabaseTest', om jag använder flera databaser i min applikation så kan jag enkelt kopiera denna klass och om jag exempelvis har en annan databas som heter 'Webbshop' så skulle klassen kunna heta 'ApplicationDatabaseWebbshop' . För att hämta Connection så skriver man så här från sina anrop: Kod:
$dbConn = ApplicationDatabaseTest::getConnection(); Kod:
<?php /* ApplicationDatabaseTest.PHP Allows PHP to connect to your database */ class ApplicationDatabaseTest { // Database Variables (edit with your own server information) static $server = 'MyHost'; // exempelvis: 'localhost' static $user = 'MyUserID'; // exempelvis: 'kalle' static $password = 'MyPassword';// exempelvis: 'nYs9kGu4rb' static $database = 'MyDatabase';// exempelvis: 'MySampleDB' // Get Connection to Database static function getConnection() { static $dbconnection = null; try { if (is_null($dbconnection)) { $dbconnection = new PDO('mysql:host=' . self::$server.';dbname=' . self::$database, self::$user, self::$password); } } catch (PDOException $e) { throw new Exception("Error: " . $e->getMessage() . "",0,$e); die(); return null; } catch (Exception $e) { throw new Exception('Error: Can not connect to database.',0,$e); } return $dbconnection; } } ?> Senast redigerad av Conny Westh den 2013-06-15 klockan 13:40 |
||
![]() |
![]() |
![]() |
#19 | ||
|
|||
Klarade millennium-buggen
|
Här kommer mer exempel på hur man kan lägga upp en klass som jobbar mot en specifik tabell.
Just den här tabellen heter Players och har tre kolumner. Först lite DDL-script för databasen. Kod:
delimiter $$ CREATE TABLE `players` ( `id` int(11) NOT NULL AUTO_INCREMENT, `firstname` varchar(32) NOT NULL, `lastname` varchar(32) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1$$ Och så här kan man bygga den tabellspecifika klassen. Jag har bara gjort denna enkel så den returnerar resultatsetet men man kan givetvis plocka ut de intressanta värdena och returnera dem som andra objekt eller datatyper beroende på vad man vill ha och vad som blir enkelt att använda i sin applikation. Det här är bara vad jag slängde ihop i går kväll och lite editeringar nu på förmiddagen, så jag har inte ägnat särskilt mycket tid åt det. Kod:
<?php /* Players.PHP Allows PHP to connect to your database */ class Player { public $id = null; public $firstName = ""; public $lastName = ""; public function __construct() { } public function __toString() { return "(" . $id . ") " . $firstName . " " . $lastName; } static function getPlayerById($id) { try { $sql = "SELECT * FROM players WHERE id = :id ORDER BY firstname,lastname"; $dbConn = ApplicationDatabaseTest::getConnection(); $dbStatement = $dbConn->prepare($sql); $dbStatement->bindParam(':id', $id); $dbStatement->execute(); return $dbStatement->fetchAll(); } catch (PDOException $e) { throw new Exception("Error: " . $e->getMessage() . "",0,$e); die(); return null; } catch (Exception $e) { throw new Exception('Error: Can not connect to database.',0,$e); return null; } } static function insertPlayer($firstName, $lastName) { try { $sql = "INSERT INTO players(firstname,lastname) VALUES(:firstName, :lastName)"; $dbConn = ApplicationDatabaseTest::getConnection(); $dbStatement = $dbConn->prepare($sql); $dbStatement->bindParam(':firstName', $firstName); $dbStatement->bindParam(':lastName', $lastName); $dbStatement->execute(); return null; // $dbStatement->newId; } catch (PDOException $e) { throw new Exception("Error: " . $e->getMessage() . "",0,$e); die(); return null; } catch (Exception $e) { throw new Exception('Error: Can not connect to database.',0,$e); return null; } } static function updatePlayer($id, $firstName, $lastName) { try { $sql = "UPDATE `players` "; $sql = $sql + "SET "; $sql = $sql + "`firstname` = :firstName, "; $sql = $sql + "`lastname` = :lastName "; $sql = $sql + "WHERE id= :id"; $dbConn = ApplicationDatabaseTest::getConnection(); $dbStatement = $dbConn->prepare($sql); $dbStatement->bindParam(':firstName', $firstName); $dbStatement->bindParam(':lastName', $lastName); $dbStatement->execute(); return null; // $dbStatement->newId; } catch (PDOException $e) { throw new Exception("Error: " . $e->getMessage() . "",0,$e); die(); return null; } catch (Exception $e) { throw new Exception('Error: Can not connect to database.',0,$e); return null; } } static function getAllPlayers() { try { $sql = "SELECT * FROM players ORDER BY firstname,lastname"; $dbConn = ApplicationDatabaseTest::getConnection(); $dbStatement = $dbConn->prepare($sql); $dbStatement->execute(); return $dbStatement->fetchAll(); } catch (PDOException $e) { throw new Exception("Error: " . $e->getMessage() . "",0,$e); die(); return null; } catch (Exception $e) { throw new Exception('Error: Can not connect to database.',0,$e); return null; } } static function deletePlayer($id) { try { $sql = "DELETE FROM players WHERE id = :id"; $dbConn = ApplicationDatabaseTest::getConnection(); $dbStatement = $dbConn->prepare($sql); $dbStatement->bindParam(':id', $id); $dbStatement->execute(); return null; // $dbStatement->newId; } catch (PDOException $e) { throw new Exception("Error: " . $e->getMessage() . "",0,$e); die(); return null; } catch (Exception $e) { throw new Exception('Error: Can not connect to database.',0,$e); return null; } } static function deleteAllPlayers() { try { $sql = "DELETE FROM players;"; $dbConn = ApplicationDatabaseTest::getConnection(); $dbStatement = $dbConn->prepare($sql); $dbStatement->execute(); return $dbStatement; } catch (PDOException $e) { throw new Exception("Error: " . $e->getMessage() . "",0,$e); die(); return null; } catch (Exception $e) { throw new Exception('Error: Can not connect to database.',0,$e); return null; } } static function getCountOfAllPlayers() { try { $sql = "SELECT Count(*) AS Antal FROM players"; $dbConn = ApplicationDatabaseTest::getConnection(); $dbStatement = $dbConn->prepare($sql); $dbStatement->execute(); return $dbStatement->fetchAll(); } catch (PDOException $e) { throw new Exception("Error: " . $e->getMessage() . "",0,$e); die(); return null; } catch (Exception $e) { throw new Exception('Error: Can not connect to database.',0,$e); return null; } } static function getAllPlayersWithQuery() { try { $dbConn = ApplicationDatabaseTest::getConnection(); return $dbConn->query('SELECT * from Players ORDER BY firstname,lastname'); } catch (PDOException $e) { throw new Exception("Error: " . $e->getMessage() . "",0,$e); die(); return null; } catch (Exception $e) { throw new Exception('Error: Can not connect to database.',0,$e); return null; } } } ?> |
||
![]() |
![]() |
![]() |
#20 | ||
|
|||
Klarade millennium-buggen
|
Jag använder en autoloader som ligger i underkatalogen 'lib':
Kod:
<?php // File: autoload.php // Modified by Conny Westh 2012-09-13 function __autoload($class_name) { if(file_exists($class_name . '.php')) { require_once($class_name . '.php'); } else { throw new Exception("Kan inte ladda klass: $class_name."); } } ?> Kod:
<?php /* PlayersTest.PHP */ require_once('/lib/autoload.php'); // spl_autoload_extensions(".inc, .php, .lib, .class.php, .lib.php "); // comma-separated list // spl_autoload_register(); class PlayersTest { static function RunTestDeleteAllPlayers() { try { print("--------------------------------------------------------------\n"); print("Begin: DELETE All Players:\n"); Players::deleteAllPlayers(); print("End: DELETE All Players:\n"); print("--------------------------------------------------------------\n"); print("Begin: Fetch Players::getCountOfAllPlayers():\n"); $result1 = Players::getCountOfAllPlayers(); foreach($result1 as $row) { print_r($row); } print("End: Fetch Players::getCountOfAllPlayers():\n"); print("--------------------------------------------------------------\n"); } catch (PDOException $e) { throw new Exception("Error: " . $e->getMessage() . "",0,$e); die(); return null; } catch (Exception $e) { throw new Exception('Error: Can not connect to database.',0,$e); } return null; } static function RunTestInsertAllPlayers() { try { print("--------------------------------------------------------------\n"); print("Begin: INSERT INFO Players:\n"); Players::insertPlayer("Robert","McIntosh"); Players::insertPlayer("Tim","Brody"); Players::insertPlayer("Rebecca","Jefferson"); Players::insertPlayer("Sandy","Jonson"); Players::insertPlayer("John","Archimedes"); Players::insertPlayer("Elisabet","Futterkiste"); Players::insertPlayer("Anna","Oscarson"); Players::insertPlayer("Olivia","Runesson"); print("End: INSERT INFO Players::\n"); } catch (PDOException $e) { throw new Exception("Error: " . $e->getMessage() . "",0,$e); die(); return null; } catch (Exception $e) { throw new Exception('Error: Can not connect to database.',0,$e); } return null; } static function RunTestGetAllPlayersWithQuery() { try { print("--------------------------------------------------------------\n"); print("Begin: Fetch all TestPlayers:\n"); $result0 = Players::getAllPlayersWithQuery(); foreach($result0 as $row) { print_r($row); } print("End: Fetch all TestPlayers:\n"); } catch (PDOException $e) { throw new Exception("Error: " . $e->getMessage() . "",0,$e); die(); return null; } catch (Exception $e) { throw new Exception('Error: Can not connect to database.',0,$e); } return null; } static function RunTestGetAllPlayers() { try { print("--------------------------------------------------------------\n"); /* Fetch all of the remaining rows in the result set */ print("Begin: Fetch Players::getAllPlayers():\n"); $result1 = Players::getAllPlayers(); foreach($result1 as $row) { print_r($row); } print("End: Fetch Players::getAllPlayers():\n"); } catch (PDOException $e) { throw new Exception("Error: " . $e->getMessage() . "",0,$e); die(); return null; } catch (Exception $e) { throw new Exception('Error: Can not connect to database.',0,$e); } return null; } static function RunTestGetPlayerById() { try { print("--------------------------------------------------------------\n"); $id = 1; print("Begin: Fetch Players::getPlayerById($id):\n"); $result2 = Players::getPlayerById($id); foreach($result2 as $row) { print_r($row); } print("End: Fetch Players::getPlayerById($id):\n"); } catch (PDOException $e) { throw new Exception("Error: " . $e->getMessage() . "",0,$e); die(); return null; } catch (Exception $e) { throw new Exception('Error: Can not connect to database.',0,$e); } return null; } static function RunTestGetCountOfAllPlayers() { try { print("--------------------------------------------------------------\n"); print("Begin: Fetch Players::getCountOfAllPlayers():\n"); $result1 = Players::getCountOfAllPlayers(); foreach($result1 as $row) { print_r($row); } print("End: Fetch Players::getCountOfAllPlayers():\n"); } catch (PDOException $e) { throw new Exception("Error: " . $e->getMessage() . "",0,$e); die(); return null; } catch (Exception $e) { throw new Exception('Error: Can not connect to database.',0,$e); } return null; } static function RunTest() { try { self::RunTestDeleteAllPlayers(); self::RunTestInsertAllPlayers(); self::RunTestGetAllPlayersWithQuery(); self::RunTestGetAllPlayers(); self::RunTestGetPlayerById(); self::RunTestGetCountOfAllPlayers(); print("--------------------------------------------------------------\n"); print(" All test are Done. \n"); print("--------------------------------------------------------------\n"); } catch (PDOException $e) { throw new Exception("Error: " . $e->getMessage() . "",0,$e); die(); return null; } catch (Exception $e) { throw new Exception('Error: Can not connect to database.',0,$e); } return null; } } PlayersTest::RunTest(); ?> |
||
![]() |
![]() |
Svara |
|
|