[PHP] mysqli overerven

Pagina: 1
Acties:
  • 153 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Zoolander
  • Registratie: Januari 2003
  • Laatst online: 23-11-2022

Zoolander

superslim!

Topicstarter
Ik zit met een probleem.

Ik wil graag een klasse, ik noem hem mysql, schrijven waarin alle methoden van mysqli beschikbaar zijn.
In deze klasse wil ik dan alle gegevens zoals username, password, etc opnemen.

Op deze manier kan ik met autoload

PHP:
1
$mysql = new mysql;


een nieuwe mysqli connectie openen waarbij ik later dus methoden als

PHP:
1
$mysql->query();


kan gebruiken.

ipv elke keer alles te moeten opgeven...

het lijkt simpel,

Ik krijg hem alleen niet werkend.... ;)
En ik snap denk ik nog te weinig van OO om dit werkend te krijgen.
wat ik nu heb is:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php

// class that holds mysql data
// I have not yet been able to extend the mysqli class succesfull
class mysql extends mysqli
{
    // open object oriented mysql database connection using build-in mysqli class
    public $host        = "localhost";
    public $username    = "";
    public $password    = "";
    public $world       = "ims";

    public $mysqli

    function __construct()
    {
        $this->mysqli = mysqli_connect($this->host, $this->username, $this->password, $this->world);
    }
}


Ik zou denkden dat het object nu in andere klassen onder $mysqli werkend zou zijn, maar dat is niet zo?

Kan iemand helpen hoe ik dit kan overerven?

?>

mijn naam slaat nergens op, althans niet op mij :P


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 21-09 02:21

Janoz

Moderator Devschuur®

!litemod

Dat hele OO in php blijft wat josti. Wat jij fout doet is dat je het mysqli object door elkaar op een object en op een procedurele manier gebruikt. De connect is in object georienteerde mode enkel uit te voeren als constructor. Geen idee of je iets als super hebt in php. Ik neem aan dat username en password wel al zijn ingevuld, aangezien je deze niet achteraf kunt setten (Dan is de constructor immers al een keer aangeroepen en zouden deze gegevens al bekend moeten zijn).

---
Na even op php.net gekeken te hebben blijkt er wel iets als super te bestaan:
parent::__constructor(......);

[ Voor 12% gewijzigd door Janoz op 13-06-2005 14:16 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • MichelVH
  • Registratie: Oktober 2001
  • Laatst online: 16-09 20:54
Ik zou zeggen dat die regel 17 zoiets moet worden:
PHP:
1
$this->connect($this->host, $this->username, $this->password, $this->world)

Don't be afraid of the dark, be afraid of what it hides


Acties:
  • 0 Henk 'm!

  • Zoolander
  • Registratie: Januari 2003
  • Laatst online: 23-11-2022

Zoolander

superslim!

Topicstarter
Dat hielp me op weg, maar nu krijg ik dit:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php

// open mysql connection
class mysql extends mysqli
{
    // connection vars
    public $host        = "localhost";
    public $username    = "";
    public $password    = "";
    public $world       = "ims";
    
    // constructor
    function __construct()
    {
        parent::connect($this->host, $this->username, $this->password, $this->world);
    }   
}

?>


SELECT * FROM adress_book
gave: No database selected

wat bij deze code hoort:

PHP:
1
2
3
4
// mysql select
$query  = "SELECT * FROM adress_book";
$adress = $mysqli->query($query)
          or die($query. " <br /> gave: " .$mysqli->error);


terwijl ik de toch echt een DB opgeef zoals connect dat wil.

Ik roep het trouwens zo aan:

PHP:
1
2
3
4
5
6
// autoload required classes
function __autoload($classname) {
    require_once ("../extend/" .$classname. ".class.php");
}

$mysqli = new mysql;


Daarnaast mag ik om een voor mij onbekende reden, de constructor niet aanroepen met:

parent::__construct(args)

dan krijg ik:

Fatal error: Can not call constructor in .... locatie

[ Voor 45% gewijzigd door Zoolander op 13-06-2005 15:28 ]

mijn naam slaat nergens op, althans niet op mij :P


Acties:
  • 0 Henk 'm!

  • Maxxi
  • Registratie: Mei 2004
  • Laatst online: 19-04 19:18
Je verbind wel maar moet ook wel een database selecteren.
Ikzelf gebruik dit:

<?php
# Maakt verbinding met de server
$server = mysql_connect("localhost", "username", "password")
or die
("ERROR while connecting to database!");
# Selecteer database
mysql_select_db("DATABASENAAM", $server)
or die
('Er is een <b>fout</b> geconstateerd met het selecteren van de database: '.mysql_error() );
?>

Acties:
  • 0 Henk 'm!

  • ID-College
  • Registratie: November 2003
  • Laatst online: 23:05
idd, je mist de mysql_select_db ;)

[ Voor 11% gewijzigd door ID-College op 13-06-2005 15:33 ]


Acties:
  • 0 Henk 'm!

  • Zoolander
  • Registratie: Januari 2003
  • Laatst online: 23-11-2022

Zoolander

superslim!

Topicstarter
ja, maar vergeet niet dat ik mysqli gebruik en geen gewone mysql
Daar is het anders dacht ik, maar ga er nogmaals naar kijken.

het gekke is:

$this->connect("host", "user", "pass", "db");

direct aangroepen, dus niet als variabelen als hierboven, werkt wel.

mijn naam slaat nergens op, althans niet op mij :P


Acties:
  • 0 Henk 'm!

  • Maxxi
  • Registratie: Mei 2004
  • Laatst online: 19-04 19:18
ik weet niet het verschil tussen imysql en "gewone" maar waarom zou je niet gewoon mysql gebruiken?

Acties:
  • 0 Henk 'm!

  • Yo-han
  • Registratie: December 2001
  • Laatst online: 18-08 20:16

Yo-han

nope.

Maxxi schreef op maandag 13 juni 2005 @ 15:44:
ik weet niet het verschil tussen imysql en "gewone" maar waarom zou je niet gewoon mysql gebruiken?
MySQLI heeft veel extra functionaliteit die speciaal voor de nieuwe functies in MySQL > 4.0

Acties:
  • 0 Henk 'm!

  • Yo-han
  • Registratie: December 2001
  • Laatst online: 18-08 20:16

Yo-han

nope.

Zoolander schreef op maandag 13 juni 2005 @ 15:37:
ja, maar vergeet niet dat ik mysqli gebruik en geen gewone mysql
Daar is het anders dacht ik, maar ga er nogmaals naar kijken.

het gekke is:

$this->connect("host", "user", "pass", "db");

direct aangroepen, dus niet als variabelen als hierboven, werkt wel.
Je connnectie klopt gewoon. Met MySQLI kan je inderdaad de naam van de database als extra parameter meegeven waardoor mysqli_select_db() overbodig wordt (zie php.net).

Maar even over je probleem. Als ik de error melding bekijk zie ik alleen dat de database niet gevonden werd. Dat betekent dus dat er wel een connectie gemaakt wordt. Weet je zeker dat de waarden die je meegeeft kloppen? Mischien even de waarde van je variabel $this->db printen in je connect methode??

Acties:
  • 0 Henk 'm!

Verwijderd

Opmerkelijk om te zien dat elke eerste poging (ja ik zelf ook) tot het OO programmeren leidt tot classes die niets anders zijn dan grote vergaarbakken van functionaliteit. Probeer objecten te schrijven met eigenschappen die enkel aan hun toebehoren. 'username', 'password' etc zijn geen eigenschappen van een database object, maar van een connectie.

Uiteraard is het lastig om met een taal las php goed te leren OO programmeren, immers de heren zelf hebben het ook niet helemaal begrepen qua duidelijke naamgeving. 'mysqli' staat waarschijnlijk voor iets fantastisch als je de taal van R2D2 spreekt...

Acties:
  • 0 Henk 'm!

  • Yo-han
  • Registratie: December 2001
  • Laatst online: 18-08 20:16

Yo-han

nope.

Verwijderd schreef op maandag 13 juni 2005 @ 16:03:
...

Uiteraard is het lastig om met een taal las php goed te leren OO programmeren, immers de heren zelf hebben het ook niet helemaal begrepen qua duidelijke naamgeving. 'mysqli' staat waarschijnlijk voor iets fantastisch als je de taal van R2D2 spreekt...
Valt wel mee hoor, je had het kunnen gokken:
The extension is called ext/mysqli, with the 'i' standing for any one of: improved, interface, ingenious, incompatible or incomplete.

Acties:
  • 0 Henk 'm!

  • x-force
  • Registratie: Maart 2001
  • Laatst online: 05-01-2024
misschien een beetje offtopic maar waarom gebruik je bijvoorbeeld niet PEAR::DB Is het zelfde als wat jij wilt en is standaard degelijke programmateur.

Kijk er eens naar zou ik zeggen!

VangenopBetaalwater.nl Het platform om ervaringen over betaalwater in Frankrijk te delen met andere karpervissers zodat iedereen kan vangen op betaalwater!


Acties:
  • 0 Henk 'm!

  • Zoolander
  • Registratie: Januari 2003
  • Laatst online: 23-11-2022

Zoolander

superslim!

Topicstarter
Verwijderd schreef op maandag 13 juni 2005 @ 16:03:
Opmerkelijk om te zien dat elke eerste poging (ja ik zelf ook) tot het OO programmeren leidt tot classes die niets anders zijn dan grote vergaarbakken van functionaliteit. Probeer objecten te schrijven met eigenschappen die enkel aan hun toebehoren. 'username', 'password' etc zijn geen eigenschappen van een database object, maar van een connectie.

Uiteraard is het lastig om met een taal las php goed te leren OO programmeren, immers de heren zelf hebben het ook niet helemaal begrepen qua duidelijke naamgeving. 'mysqli' staat waarschijnlijk voor iets fantastisch als je de taal van R2D2 spreekt...
good one, ik vind ook dat de term mysqli beetje vaag is. R2D2 zal ik nog om uitleg vragen.

Maar ik weet zeker dat ik het goed overtype: bug?

mijn naam slaat nergens op, althans niet op mij :P


Acties:
  • 0 Henk 'm!

  • Zoolander
  • Registratie: Januari 2003
  • Laatst online: 23-11-2022

Zoolander

superslim!

Topicstarter
x-force schreef op maandag 13 juni 2005 @ 16:11:
misschien een beetje offtopic maar waarom gebruik je bijvoorbeeld niet PEAR::DB Is het zelfde als wat jij wilt en is standaard degelijke programmateur.

Kijk er eens naar zou ik zeggen!
hehe, ik probeer eerst mysqli maar eens te beheersen.
Maar het ziet er wel goed uit pear::DB

mijn naam slaat nergens op, althans niet op mij :P


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 21-09 02:21

Janoz

Moderator Devschuur®

!litemod

Zoolander schreef op maandag 13 juni 2005 @ 15:22:
Daarnaast mag ik om een voor mij onbekende reden, de constructor niet aanroepen met:

parent::__construct(args)

dan krijg ik:

Fatal error: Can not call constructor in .... locatie
Ik neem aan dat je begrijpt dat je de constructor alleen aan kunt roepen vanuit je eigen constructor. Als dat in php uberhaupt al mogenlijk is trouwens.

* Janoz programmeert OO in java.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Zoolander
  • Registratie: Januari 2003
  • Laatst online: 23-11-2022

Zoolander

superslim!

Topicstarter
Janoz schreef op maandag 13 juni 2005 @ 16:26:
[...]

Ik neem aan dat je begrijpt dat je de constructor alleen aan kunt roepen vanuit je eigen constructor. Als dat in php uberhaupt al mogenlijk is trouwens.

* Janoz programmeert OO in java.
doe ik, maar werkt niet.

mijn naam slaat nergens op, althans niet op mij :P


Acties:
  • 0 Henk 'm!

Verwijderd

Misschien moet hij als eerste?

Acties:
  • 0 Henk 'm!

  • Suepahfly
  • Registratie: Juni 2001
  • Laatst online: 17-09 17:05
x-force schreef op maandag 13 juni 2005 @ 16:11:
misschien een beetje offtopic maar waarom gebruik je bijvoorbeeld niet PEAR::DB Is het zelfde als wat jij wilt en is standaard degelijke programmateur.

Kijk er eens naar zou ik zeggen!
offtopic:
Dan ga ik toch voor het iets meer volwassen ADOdb Heeft net iets meer dirvers (20 ofzo,m inclius mysqli) en is iets uitgebreider, met o.a. een query cache, database based session handling, encriptie enz.
Pagina: 1