Ik vraag me af wat de beste manier is om
een MySQL class te gebruiken.
Vaak extend ik een class met een MySQL class waarbij meerdere tellers en MySQL functies in zitten.
Graag zou ik willen weten of het wel de goede manier is om
MySQl te gebruiken.
En hoe dat zit met de stack en de heap.
Okeey.
Allemaal bedankt voor de snelle reacties.
Dan denk ik MySQLi toch per class apart te gaan gebruiken.
Dat zal met het sluiten van MySQL ook beter gaan.
Wat ik nu nog heb is:
<?php
$this->mysqli = new mysqli("host", "username", "password", "databasenaam");
?>
<?php
class Profiel extends MySQL{
public function __construct(){
$this->run("use `php`");
}
}
?>
Ik begrijp nu dat dit niet de bedoeling is.
Mijn MySQL class wat ik nu nog heb ziet er ongeveer zo uit:
public function __destruct() {$this->mysqli->close();}
protected function run($query){
include ("verbindmysqlinclass.php");
$sql =
<<<SQL
$query
SQL;
$this->result = $this->mysqli->query($sql);
if (!$this->result){
die("Er is iets fout gegaan bij het uitvoeren van de query ". $this->mysqli->error);
$this->{"$array[$i]"} = array(); //maak een variabele aan die de naam heeft van de inkomende array
//van die variabele wordt ook meteen een array gemaakt.
}
while ($this->row = $this->result->fetch_array()) { //het resultaat van de query array wordt in $this->row gezet {
//$this-row wordt dus doorlooped totdat die helemaal gevult is tot het einde
for($i = 0; $i < $hoeveelheid; $i++) { // een for loopje
array_push($this->{"$array[$i]"}, $this->row[$i]); // hier wordt de inkomende naam tegelijkertijd gevuld met de waardes van de mysql row
}
}
$this->result->free();
}
}
?>
Maar ik begrijp nu ook dat het mogelijk is om MySQLi rechstreeks te extenden.
Ik zou gewoon direct op PDO overgaan. PDO biedt de kans om later over te stappen op een andere database als mysql en het heeft alle zaken gewoon goed geregeld zoals De foutmeldingen (Exceptions).
een database class, die dus iets doet met databases, kan inderdaad mysql(i) extenden.
het is alleen niet de bedoeling om bijvoorbeeld een user class te laten extenden op mysql
als je in de user class een database connectie nodig hebt:
Probeer dit in gedachte te houden.
Want ik zie nu dat je dit eigenlijk niet doet.
Het kan wel, maar een extend is een uitbreiding op.
Heeft een profiel een relatie met een database?
Het antwoord is nee. Want je hebt alleen een database nodig om gegevens van een profiel te laden dus extenden op een database is niet nodig.
In jou geval zou het dus iets moeten worden als:
<?php
class profiel
{
protected $db;
public function __construct()
{
$this->db = new MySQL;
}
}
?>
In je class MySQL kan je wel extenden. Want daar is een connectie met mysqli wel nodig dus is wel een uitbreiding op.
<?php
class MySQL extends \MySQLi
{
// hier wat leuke dingen..
}
?>
Dat zal met het sluiten van MySQL ook beter gaan.
Je weet dat het niet perse nodig is om de database connectie te sluiten?
Dit gebeurt automagisch aan het einde van het script.
Mits dat je gebruik maakt van een persistent connection.. Dan heb je dat probleem.
Wat Ward en Ivo hebben uitgelegd is inderdaad goed om te weten.
De reactie daarna is een beetje misleidend want dat was wat ik toen nog had en nog niet met verbeteringen.
PDO lijkt mij ook een goede manier.
Wegens de MySQL hackers in de media en overbelasting lijkt mij het wel beter om de database connecties te sluiten terwijl het voor de werking niet nodig is.
Een profiel heeft inderdaad niet direct een relatie met MySQL en daar ga ik mijn script op verbeteren.
Bedankt voor de extra uitleg met voorbeelden.
>> Wegens de MySQL hackers in de media en overbelasting lijkt mij het wel beter om de database connecties te sluiten terwijl het voor de werking niet nodig is.
Dit zijn ongegronde argumenten, en bovendien is het slecht voor je performance om telkens verbindingen te openen en sluiten. Gewoon niet sluiten. Dat regelt PHP allemaal zelf.
Over welke "overbelasting" heb je het?
Wat en hoe heb je gemeten?
Welk stuk is traag?
Indien dat allemaal (nog) niet van toepassing is is er geen probleem. :)
Het is het zelfde als de denkwijze waarin je je script gaat verbeteren.
Als de verbinding niet nodig is, dan gebruik je het ook niet.
Een ander argument is om dit php zelf te laten regelen is dat als je je per ongeluk de verbinding te vroeg sluit je applicatie om zeep is. En dat kan uuuuuuuuuuuuren debuggen worden waarom het niet werkt.
Open connections (and similar resources) are automatically destroyed at the end of script execution. However, you should still close or free all connections, result sets and statement handles as soon as they are no longer required. This will help return resources to PHP and MySQL faster.
Daarom dacht ik dat het sluiten beter was.
Over de MySQL hacken dacht ik meer aan de media en het lijkt mij dat je er alleen binnen kan komen als het deurtje open staat of als die te makkelijk open te duwen is.
Ik begrijp niet welk script hiermee bedoeld wordt.
PHP of de MySQL query.
[size=xsmall]Toevoeging op 09/01/2015 19:06:05:[/size]
Het stuk op devzone.zend.com heb ik gevonden.
Er staat dat er verschil zit tussen de oude en de nieuwe versie.