Lurifaksen Skrevet 8. august 2008 Del Skrevet 8. august 2008 Tenkte å unngå å finne opp hjulet på nytt, men å finne en simpel MySQL-klasse for PHP var lettere sagt enn gjort. De jeg har funnet er alt for svære (flere KB) med masse unødvendige funksjoner, og er ikke like effektive - dvs må kjøre flere funksjoner for å oppnå ting (først oppkobling, så spørring, så hente ut resultat osv..) Er det noen som har laget en enkel klasse med funksjoner som ganske enkelt tar sql-spørringen som argument og utfører dette: - kjører select spørring og returnerer et array med resultat-tabellen - kjører select og returnerer én enkeltverdi (for spørringer hvor du bare får én verdi som resultat, f.eks SELECT COUNT...) - kjører update, og returnerer antall felter som er berørt (er vel i praksis likt som punktet over?) - kjører Insert, og returnerer ID'en på raden som ble satt inn (mysql_insert_id()?) Lenke til kommentar
Alex Moran Skrevet 8. august 2008 Del Skrevet 8. august 2008 (endret) Du trenger ikke å finne opp hjulet på nytt, når du har PDO. (Krever PHP5) Eksempel: // Prepared statements $pdo = new PDO('mysql:dbname=test;host=localhost', 'user', 'pass'); $stmt = $pdo->prepare('SELECT * FROM table WHERE name = ?'); $name = 'Per'; $stmt->execute(array($name)); $results = $stmt->fetchAll(PDO::FETCH_ASSOC); print_r($results) Endret 8. august 2008 av Ultraskarp Lenke til kommentar
grimjoey Skrevet 8. august 2008 Del Skrevet 8. august 2008 (endret) Kan ikke garantere for at alt fungerer (den er så vidt testet), men her er et par klasser jeg har laget. (se nederst) $db = new Db; $db->Connect('host', 'user', 'pass', 'dbname'); $db->Query('SELECT ...'); // returnerer vanlig resultat ressurs $db->Escape('...'); // er samme som mysql_real_escape_string() $db->GetArrABC('SELECT ...'); // returnerer et array med assosiative arrayer array( [0] = array( ['id'] = 0 ['navn'] = 'navnet' ) [1] = array( .... .... ) ) $db->GetArrN('SELECT ...'); // returnerer numerisk array med numeriske arrayer samme som ovenfor men uten feltnavn $result = $db->GetObj('SELECT ...'); //returnerer et objekt med objekter $row = $result->GetRow('0'); $id = $row->id; elns (utestet) $db->GetXML('SELECT ...'); // returnerer ett xml document. <?xml version="1.0"?> <result> <row id="0"> <field id="0">0</field> <field id="1">Kåre</field> </row> <row id="1"> <field id="0">1</field> <field id="1">Bengt</field> </row> <result> praktisk for ajax applikasjoner <?php function error($e) { if ($e->getCode() == 123) print 'Warning: ' . $e->getMessage() . "\n"; else print 'Exception caught: ' . $e->getMessage() . "\n"; print ' ' . $e->getFile() . ': ' . $e->getLine() . "<br />\n"; if ($e->getCode() != 123) die(); } class MysqlTableObject { private $ArrayOfRowsAsObjects; public function __construct($ArrayOfRowsAsObjects = null) { try { if ($ArrayOfRowsAsObjects === null) throw new Exception('Must include an array of rows as objects on creation!'); else $this->ArrayOfRowsAsObjects = $ArrayOfRowsAsObjects; } catch (Exception $e) { error($e); } } public function GetRow($Row) { try { if ($this->ArrayOfRowsAsObjects[$Row] === null) throw new Exception('Row does not exist!'); return $this->ArrayOfRowsAsObjects[$Row]; } catch (Exception $e) { error($e); } } public function GetAll() { return $this->ArrayOfRowsAsObjects; } } class Mysql { public $DbLink; private $DbHost; private $DbUser; private $DbPass; public $DbName; public $P; public function Config($DbHost = null, $DbUser = null, $DbPass = null, $DbName = null) { try { if ($DbPass !== null) $this->DbPass = $DbPass; else throw new Exception('Password missing.'); if ($DbUser !== null) $this->DbUser = $DbUser; else throw new Exception('Username missing.'); if ($DbHost !== null) $this->DbHost = $DbHost; else throw new Exception('Hostname missing.'); $this->DbName = $DbName; } catch (Exception $e) { error($e); } } public function Connect($DbHost = null, $DbUser = null, $DbPass = null, $DbName = null) { try { if ($this->DbLink === null) { try { $this->Config($DbHost, $DbUser, $DbPass, $DbName); } catch (Exception $e) { error($e); } try { if ($this->P !== null) { if (!$this->DbLink = mysql_pconnect($this->DbHost, $this->DbUser, $this->DbPass)) throw new Exception('Unable to connect: ' . mysql_error()); } else { if (!$this->DbLink = mysql_connect($this->DbHost, $this->DbUser, $this->DbPass)) throw new Exception('Unable to connect: ' . mysql_error()); } } catch (Exception $e) { error($e); } try { if (!mysql_select_db($this->DbName, $this->DbLink)) throw new Exception('Unable to select db: ' . mysql_error(), 123); } catch (Exception $e) { error($e); } } else throw new Exception('Trying to connect but is already connected!', 123); } catch (Exception $e) { error($e); } } public function PConnect($DbHost = null, $DbUser = null, $DbPass = null, $DbName = null) { $this->P = true; $this->Connect($DbHost, $DbUser, $DbPass, $DbName); } public function SelectDb($DbName = null) { try { if ($DbName === null) throw new Exception('No arguments to function. Cannot select db.'); if ($this->DbLink === null) throw new Exception('Not connected. Cannot select db.'); $this->$DbName = $DbName; if (!mysql_select_db($this->DbName, $this->DbLink)) throw new Exception('Unable to select db: ' . mysql_error()); } catch (Exception $e) { error($e); } } public function Close() { try { if ($this->DbLink === null) throw new Exception('Not connected!'); else mysql_close($this->DbLink); } catch (Exception $e) {} } public function Query($Sql) { try { if ($this->DbLink === null) throw new Exception('Not connected!'); else { if (!$Res = mysql_query($Sql)) throw new Exception('Unable to perform query: ' . mysql_error()); return $Res; } } catch (Exception $e) { error($e); } } public function GetArrObj($Sql) { try { $Res = $this->Query($Sql); while ($Row = mysql_fetch_object($Res)) { $ArrayOfRowsAsObjects[] = $Row; } return new MysqlTableObject($ArrayOfRowsAsObjects); } catch (Exception $e) { error($e); } } public function GetArrN($Sql) { try { $Res = $this->Query($Sql); $ArrayN = Array(); while ($Row = mysql_fetch_array($Res, MYSQL_NUM)) { $ArrayN[] = $Row; } return $ArrayN; } catch (Exception $e) { error($e); } } public function GetArrABC($Sql) { try { $Res = $this->Query($Sql); $ArrayABC = Array(); while ($Row = mysql_fetch_assoc($Res)) { $ArrayABC[] = $Row; } return $ArrayABC; } catch (Exception $e) { error($e); } } public function Escape($Sql) { try { if (!is_numeric($Sql)) { if (get_magic_quotes_gpc()) $Sql = stripslashes($Sql); if ($this->DbLink === null) throw new Exception('Not connected!'); else $Sql = mysql_real_escape_string($Sql, $this->DbLink); } return $Sql; } catch (Exception $e) { error($e); } } } class Db extends Mysql{ public function GetXML($Sql, $NamedFields = null) { try { if ($NamedFields === null) $Array = $this->GetArrN($Sql); else $Array = $this->GetArrayABC($Sql); $XMLStart = "<?xml version=\"1.0\">\n<result>\n"; $XMLStop = "</result>\n"; $XMLMiddle = ''; foreach ($Array as $K => $V) { $XMLMiddle .= "\t<row id=\"" . $K . "\">\n"; foreach ($V as $Key => $Value) { $XMLMiddle .= "\t\t<field id=\"" . $Key . "\">" . $Value . "</field>\n"; } $XMLMiddle .= "\t</row>\n"; } $XMLOut = $XMLStart . $XMLMiddle . $XMLStop; return $XMLOut; } catch (Exception $e) { error($e); } } } if (!strcmp(substr($_SERVER['PHP_SELF'],-6), 'db.php')) print 'nothing to see here!'; ?> Endret 8. august 2008 av grimjoey Lenke til kommentar
Lurifaksen Skrevet 8. august 2008 Forfatter Del Skrevet 8. august 2008 Du trenger ikke å finne opp hjulet på nytt, når du har PDO. (Krever PHP5) Hmm.. dette var nytt. Men den eneste store fordelen jeg ser sånn umiddelbart er måten en setter variabler inn i SQL-setningen? Ellers er det jo her 5 funksjoner som må kjøres for noe jeg ikke ser noen grunn til å bruke mer enn funksjon til. Kan ikke garantere for at alt fungerer (den er så vidt testet), men her er et par klasser jeg har laget. (se nederst) Takk, det så meget brukbart ut Men igjen, den ser ikke ut til å være "like" smart som jeg ønsker. Dvs, at hver enkelt funksjon automatisk logger på database, åpner den, kjører spørring, returnerer resultat, lukker database - alt direkte i én funksjon. Skal studere den litt nøyere senere, kan jo forsåvidt fikse det selv. Lenke til kommentar
Jonas Skrevet 8. august 2008 Del Skrevet 8. august 2008 Du åpner og lukker da database-tilkoblinger i construct og destruct, dersom du programmerer OOP. Disse kalles jo automatisk og gjør klassen din "smart", slik det virker som du ønsker. Å gjøre dette for hver spørring vil jo være ueffektivt i milevis. Lenke til kommentar
Alex Moran Skrevet 8. august 2008 Del Skrevet 8. august 2008 (endret) Du trenger ikke å finne opp hjulet på nytt, når du har PDO. (Krever PHP5) Hmm.. dette var nytt. Men den eneste store fordelen jeg ser sånn umiddelbart er måten en setter variabler inn i SQL-setningen? Ellers er det jo her 5 funksjoner som må kjøres for noe jeg ikke ser noen grunn til å bruke mer enn funksjon til. Du trenger jo ikke bruke prepared statements. Ta en titt på PDO::exec() og PDO::query() // Få resultatene i en array $results = $pdo->query('SELECT * FROM table')->fetchAll(PDO::FETCH_ASSOC); // Antall affected rows $affected = $pdo->exec('UPDATE table SET field = value'); // eller $affected = $pdo->query('UPDATE table SET field = value')->rowCount(); Endret 8. august 2008 av Ultraskarp Lenke til kommentar
Peter Skrevet 9. august 2008 Del Skrevet 9. august 2008 Det er vel dette hjulet som blir funnet opp flest ganger, i alle mulige fasonger. Her er vel de som er blandt de meste "runde": http://no2.php.net/pdo http://framework.zend.com/manual/en/zend.db.html http://ezcomponents.org/docs/api/latest/in...n_Database.html Lenke til kommentar
Lurifaksen Skrevet 9. august 2008 Forfatter Del Skrevet 9. august 2008 Du trenger jo ikke bruke prepared statements. Ta en titt på PDO::exec() og PDO::query() Nå begynner det å ligne på noe ja! Men har heller lite erfaring med PHP-klasser og denne slags nye funksjoner. Jeg er mer vant til C# i Visual Studio, og der har jo jeg intellisens slik at jeg får opp en liste over alle metodene når jeg setter et "punktum" etter klassenavnet. Det synes jeg gjør det mye enklere å lære å bruke klassene, siden jeg da raskt enkelt får full oversikt over alt som er mulig, og hvilke parametre som trengs. Finnes det noe gratis, eller ikke alt for dyrt software til PHP som har lignende funksjonalitet? Peter: Takk, mye bra eksempelkode der! Om noen skulle ha link til noen tutorials om PDO for nybegynnere er det bare å poste Lenke til kommentar
Jonas Skrevet 9. august 2008 Del Skrevet 9. august 2008 (endret) Jeg liker Komodo utrolig godt. Den har det du spør etter og, i tillegg til phpDoc. Enorm støtte for en hel haug med ting gjør den ganske tung, men det går bra så lenge du ikke jobber med gigantiske filer. Edit: Programmet er for øvrig gratis. Endret 9. august 2008 av Jonas Lenke til kommentar
Peter Skrevet 9. august 2008 Del Skrevet 9. august 2008 Når jeg tenker meg om så burde jeg selvsagt nevnt phpdoctrine[1] og propel[2] som antakelig er de to mest gjennomførte ORM-pakkene som finnes for PHP idag. Dersom du ikke vet hva ORM er, kan du lese mer på wikipedia[3], men kort fortalt tar det abstraksjonsnivået ett hakk videre. Av de to har jeg bare erfaring med phpdoctrine, og den har fått mest skryt også. [1] http://www.phpdoctrine.org/ [2] http://propel.phpdb.org/trac/ [3] http://en.wikipedia.org/wiki/Object-relational_mapping Lenke til kommentar
Lurifaksen Skrevet 9. august 2008 Forfatter Del Skrevet 9. august 2008 Du trenger jo ikke bruke prepared statements. Ta en titt på PDO::exec() og PDO::query() // Få resultatene i en array $results = $pdo->query('SELECT * FROM table')->fetchAll(PDO::FETCH_ASSOC); $affected = $pdo->query('UPDATE table SET field = value')->rowCount(); Jeg får ikke det der til å fungere... "Call to a member function fetchAll() on a non-object" Jeg liker Komodo utrolig godt. Den har det du spør etter og, i tillegg til phpDoc. Enorm støtte for en hel haug med ting gjør den ganske tung, men det går bra så lenge du ikke jobber med gigantiske filer. Wow, det programmet var jo topp! Hva er det med folk som driver å anbefaler programmer som notepad++/notepad2 etc til php programmering!? Peter: Det der blir kanskje litt vel avansert... Min bruk av database er svært simpel. Lenke til kommentar
Martin A. Skrevet 10. august 2008 Del Skrevet 10. august 2008 Har du opprettet PDO-objektet før du kjører spørringen? $pdo = new PDO('mysql:dbname=test;host=localhost', 'user', 'pass'); Lenke til kommentar
Lurifaksen Skrevet 10. august 2008 Forfatter Del Skrevet 10. august 2008 Ja: $pdo = new PDO("mysql:host=serveren;dbname=dbnavn", "brukeren", "passordet"); $result = $pdo->query("SELECT * FROM blabla")->fetchAll(PDO::FETCH_ASSOC); Fungerer heller ikke å ta det i to deler: $pdo = new PDO("mysql:host=serveren;dbname=dbnavn", "brukeren", "passordet"); $q = $pdo->query("SELECT * FROM blabla"); $result = $q->fetchAll(PDO::FETCH_ASSOC); Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå