login  Naam:   Wachtwoord: 
Registreer je!
 Scripts:

Scripts > PHP > Overige scripts > [PHP5] dbAccess

[PHP5] dbAccess

Auteur: Addow - 05 november 2006 - 15:44 - Gekeurd door: Joel - Hits: 4456 - Aantal punten: (0 stemmen)




.voorwoord:
Vakantie was pas begonnen in juli, of ik heb mij volledig into PHP5 gesmeten. Ik was al aardig op de hoogte van OOP, maar ik wilde meteen enkele klassen uitschrijven om in de toekomst een hoop werk te besparen.

Een weekje bezig geweest met de belangrijkste van allen: dbAccess! Aangezien je in je websites vaak een heleboel queries nuttigt, kan dit wel een boel werk besparen.


.uitleg:
Mijn keuze voor de Engelse benamingen van functies? Een stuk korter, duidelijker en naar de toekomst toe een must, vind ik.

De klasse heeft 2 essentiele methoden: dbConnect(), dbClose(). Deze worden automatisch doorgevoerd door respectievelijk de contructor en destructor, maar het beste is om na iedere query je dbVerbinding te sluiten(!).
Indien je vervolgens weer een query uitvoert, controleert de methode altijd of je verbinding open hebt staan of niet, dus no worries about that...

Daarnaast zal je over het algemeen gebruik maken van executeSQL(), waar je dan je query aan meegeeft (zoals je dat altijd gewoon bent met mysql_query()).
Om alle teruggegeven queries op te halen (bij een SELECT), controleer je of je alle queries hebt ingeladen ahv eof(). Again, vergeet je verbinding niet te sluiten é?

Om je gegevens uit te lezen heb ik de methoden fetchArray() en fetchAssoc() toegevoegd, die gewoon gebruik maken van de sql-fetch-functies, en de werkrij eentje verhogen...

Daarnaast zitten er nog enkele methoden in, indien nodig, weet je ze wel te vinden. De naamgeving wijst zichzelf al uit. Vorige maand heb ik nog een aantal MSSQL-methoden toegevoegd, op aanvraag. Die gebruik ikzelf eigenlijk nooit, maar zitten er ineens bij zie 


.installatie:
1] Vooreerst geef je je database gegevens in, gebruik makend van deze variabelen:
Indien je andere globale variabelen wil gebruiken, kan je dat gerust, maar dan moet je dit even in de constructor (__construct()) van de klasse wijzigen.
  1. <?php
  2.  
  3. $g_sDBHost = ""; // db server (meestal: localhost)
  4. $g_sUser = ""; // db gebruiker
  5. $g_sPassword = ""; // db wachtwoord
  6. $g_sDBName = ""; // db naam hier invullen
  7.  
  8. ?>


2] Vervolgens includen we onze klasse:
  1. <?
  2. include_once("dbAccess.php");
  3. ?>


3] Om een verbinding op te zetten, maken we een nieuw object van onze klasse aan:
  1. <?
  2. $objDB = new dbAccess;
  3. ?>


4] We willen gegevens uit onze database halen dmv een query. (fictief in dit geval)
  1. <?
  2. $sql = "SELECT id, titel, nieuws, bron FROM nieuws LIMIT 0,30 ORDER BY id ASC";
  3. ?>


5] Om al onze nieuwspostgegevens op te halen, kunnen we bvb. het volgende doen:
  1. <?
  2. if($objDB->executeSQL($sql) {
  3. $aNP = array(); $aNieuws = array();
  4. if(!$objDB->eof()) {
  5. $aNP = $objDB->fetchArray(); // Array van nieuwsgegevens
  6. array_push($aNieuws, $aNP); // we voegen de nieuwspost array toe aan de array waar al onze nieuwsposts in zullen steken
  7. $objDB->dbClose(); // we sluiten onze verbinding voor de veiligheid
  8. }
  9. }
  10. ?>


6] Ik ga niet alle situaties uit de doeken doen, maar dit moet toch al flink een stap in de richting van... wezen.


.naamgeving:
Een extra toelichting bij m'n speciale naamgeving. Ge denkt misschien van wtf?? Maar... er zit een logica achter, die ik gebruik sinds ik het in een PHP-naslagwerk tegenkwam:
- Allereerst kom je in een klasse 3 soorten variabelen tegen: globals, members, parameters. Elk van hun krijgt een eigen prefix, resp.: g_, m_, p_
- Vervolgens geef ik nog een teken mee, waarmee ik herken wat voor type variabele het is: array, integer, string, boolean,... krijgen resp. een r, n, s, b,... toegewezen.

Als resultaat geeft dat bvb. $g_sUser, $m_rConnection,...


.vereist:
- PHP 5.x op server
- MySQL/MSSQL database
- basis OOP-kennis


Informatie over een persistente verbinding vind je in je php.net!
Veel succes alvast, en hopelijk kunnen/willen jullie er handig gebruik van maken!
Addow

Code:
  1. <?php
  2.  
  3. /*#######################################################
  4. # dbAccess.php
  5. #
  6. # Deze klasse handelt alle database acties af
  7. # Methoden:
  8. # dbConnect()
  9. # dbClose()
  10. # executeSQL()
  11. # eof(), bof()
  12. # isEmpty()
  13. # moveNext(), movePrevious(), moveFirst(), moveLast()
  14. # numRows(), affectedRows()
  15. # fetchArray(), fetchAssoc()
  16. # getLastInsertedId()
  17. # startTransaction(), commit(), rollback(), endTransaction() - enkel voor MSSQL
  18. #
  19. # Auteur: Addow (info at addow dot be)
  20. # Datum aangemaakt: 7 juli 2006
  21. # Datum laatst gewijzigd: 5 november 2006
  22. #######################################################*/
  23.  
  24. class dbAccess {
  25. // Configureer variabelen
  26. private $m_bPersistent = false; // Persistente verbindingen
  27. private $m_sQuery = ""; // Query om geopend te worden
  28. private $m_rConnection = null; // Databaseverbinding
  29. private $m_nCurrentRow = 0; // Huidige database rij
  30. private $m_nRecordSetRow = 0; // Laatste opgehaalde rij
  31. private $m_rResult = null; // Resultaat
  32.  
  33. private $m_sDBHost = ""; // Hostnaam
  34. private $m_sDBName = ""; // Database naam
  35. private $m_sUser = ""; // Gebruikersnaam
  36. private $m_sPassword = ""; // Wachtwoord
  37.  
  38. function __construct($p_sQuery = "", $p_bPersistent = false, $p_sDBName = "") {
  39. global $g_sDBHost;
  40. global $g_sUser;
  41. global $g_sPassword;
  42. global $g_sDBName;
  43.  
  44. $this->m_sDBHost = $g_sDBHost;
  45. $this->m_sDBName = $g_sDBName;
  46. $this->m_sUser = $g_sUser;
  47. $this->m_sPassword = $g_sPassword;
  48.  
  49. // Alle argumenten overzetten naar member variabelen
  50. $this->m_bPersistent = $p_bPersistent;
  51. if($p_sDBName != "")
  52. $this->m_sDBName = $p_sDBName;
  53.  
  54. // Verbindt met de database
  55. $this->dbConnect();
  56.  
  57. // Wanneer een query is meegegeven, voer deze uit...
  58. if($p_sQuery != "")
  59. $this->executeSQL($p_sQuery);
  60. }
  61.  
  62. function _destruct() {
  63. $this->dbClose();
  64. }
  65.  
  66. public function dbConnect() {
  67. if(!$this->m_rConnection) {
  68. // Geen SQL Server verbinding opgezet
  69. // Maak verbinding...
  70. if($this->m_bPersistent) {
  71. // Open een persistente verbinding
  72. $this->m_rConnection = @mysql_pconnect($this->m_sDBHost, $this->m_sUser, $this->m_sPassword);
  73. @mysql_select_db($this->m_sDBName);
  74. } else {
  75. // Open een gewone verbinding
  76. $this->m_rConnection = @mysql_connect($this->m_sDBHost, $this->m_sUser, $this->m_sPassword);
  77. @mysql_select_db($this->m_sDBName);
  78. }
  79. }
  80.  
  81. if(!$this->m_rConnection) {
  82. $sErrorMessage = "SQL Error [".mysql_errno()."] ".mysql_error();
  83. throw new Exception($sErrorMessage);
  84. }
  85. }
  86.  
  87. public function dbClose() {
  88. if($this->m_rConnection) {
  89. @mysql_close($this->m_rConnection);
  90. $this->m_rConnection = null;
  91. }
  92. }
  93.  
  94. public function executeSQL($p_sQuery) {
  95. // Bewaar de query
  96. $this->m_sQuery = $p_sQuery;
  97.  
  98. try {
  99. // Open verbinding indien deze nog niet eerder geopend is
  100. if(!$this->m_rConnection)
  101. $this->dbConnect();
  102.  
  103. // Probeer de query uit te voeren
  104. $this->m_rResult = @mysql_query($this->m_sQuery, $this->m_rConnection);
  105. } catch(Exception $e) {
  106. // hergenereer de exception
  107. throw new Exception($e->getMessage());
  108. }
  109.  
  110. // Controleer op fouten, benodigd aangezien msql_query vanaf deze fase geen exceptions meer genereert.
  111. if($this->m_rResult == false)
  112. {
  113. $nErrorID = mysql_errno($this->m_rConnection);
  114. $sErrorMessage = "SQL Error: [".$nErrorID."[ ".mysql_error($this->m_rConnection)." [".$this->m_sQuery."]";
  115. throw new Exception($sErrorMessage, $nErrorID);
  116. }
  117.  
  118. // Plaats huidige rij op 0
  119. $this->m_nCurrentRow = 0;
  120. return true;
  121. }
  122.  
  123. public function eof() {
  124. $rows = mysql_num_rows($this->m_rResult);
  125.  
  126. if($rows == 0)
  127. return true;
  128. if($rows == $this->m_nCurrentRow)
  129. return true;
  130. return false;
  131. }
  132.  
  133. public function bof() {
  134. if($this->m_nCurrentRow == 0)
  135. return true;
  136. }
  137.  
  138. public function isEmpty() {
  139. if(mysql_num_rows($this->m_rResult) == 0)
  140. return true;
  141. return false;
  142. }
  143.  
  144. public function moveNext() {
  145. $this->m_nCurrentRow++;
  146. }
  147.  
  148. public function movePrevious() {
  149. $this->m_nCurrentRow--;
  150. if($this->m_nCurrentRow < 0)
  151. $this->m_nCurrentRow = 0;
  152. }
  153.  
  154. public function moveFirst() {
  155. $this->m_nCurrentRow = 0;
  156. }
  157.  
  158. public function moveLast() {
  159. try {
  160. $this->m_nCurrentRow = mysql_num_rows($this->m_rResult) - 1;
  161. } catch(Exception $e) {
  162. throw new Exception($e->getMessage(), $e->getCode());
  163. }
  164. }
  165.  
  166. public function numRows() {
  167. $nResult = 0;
  168. try {
  169. $nResult = mysql_num_rows($this->m_rResult);
  170. } catch(Exception $e) {
  171. throw new Exception($e->getMessage(), $e->getCode());
  172. }
  173. }
  174.  
  175. public function affectedRows() {
  176. }
  177.  
  178. public function fetchArray() {
  179. $aCurrentRec = array();
  180.  
  181. try {
  182. if($this->m_nRecordSetRow != $this->m_nCurrentRow) {
  183. mysql_data_seek($this->m_rResult, $this->m_nCurrentRow);
  184. }
  185.  
  186. $this->m_nRecordSetRow = $this->m_nCurrentRow + 1;
  187. $aCurrentRec = mysql_fetch_array($this->m_rResult);
  188. } catch(Exception $e) {
  189. throw new Exception($e->getMessage(), $e->getCode());
  190. }
  191. return $aCurrentRec;
  192. }
  193.  
  194. public function fetchAssoc() {
  195. $aCurrentRec = array();
  196.  
  197. try {
  198. if($this->m_nRecordSetRow != $this->m_nCurrentRow) {
  199. mysql_data_seek($this->m_rResult, $this->m_nCurrentRow);
  200. }
  201.  
  202. $this->m_nRecordSetRow = $this->m_nCurrentRow + 1;
  203. $aCurrentRec = mysql_fetch_assoc($this->m_rResult);
  204. } catch(Exception $e) {
  205. throw new Exception($e->getMessage(), $e->getCode());
  206. }
  207. return $aCurrentRec;
  208. }
  209.  
  210. public function getLastInsertedId() {
  211. return mysql_insert_id();
  212. }
  213.  
  214. public function startTransaction() {
  215. try {
  216. $sQuery = "SET AUTOCOMMIT=0;";
  217. $this->executeSQL($sQuery);
  218. $sQuery = "BEGIN;";
  219. $this->executeSQL($sQuery);
  220. } catch(Exception $e) {
  221. throw new Exception($e->getMessage(), $e->getCode());
  222. }
  223. }
  224.  
  225. public function commit() {
  226. try {
  227. $sQuery = "COMMIT;";
  228. $this->executeSQL($sQuery);
  229. $sQuery = "SET AUTOCOMMIT=1";
  230. $this->executeSQL($sQuery);
  231. } catch(Exception $e) {
  232. throw new Exception($e->getMessage(), $e->getCode());
  233. }
  234. }
  235.  
  236. public function rollBack() {
  237. try {
  238. $sQuery = "ROLLBACK;";
  239. $this->executeSQL($sQuery);
  240. $sQuery = "SET AUTOCOMMIT=1;";
  241. $this->executeSQL($sQuery);
  242. } catch(Exception $e) {
  243. throw new Exception($e->getMessage(), $e->getCode());
  244. }
  245. }
  246.  
  247. public function endTransaction() {
  248. try {
  249. $sQuery = "SET AUTOCOMMIT=1";
  250. $this->executeSQL($sQuery);
  251. } catch(Exception $e) {
  252. throw new Exception($e->getMessage(), $e->getCode());
  253. }
  254. }
  255. }
  256.  
  257. ?>
Download code! Download code (.txt)

 Stemmen
Niet ingelogd.

 Reacties
Post een reactie
Lees de reacties (7)
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.101s