Hallo

Ik ben bezig geweest met OOP (voor de config), voor het uit te proberen. Maar het werkt niet, het geeft geen errors...


<?php
$__error_reporting_level=1;
$_CONFIG = parse_ini_file($_SERVER["DOCUMENT_ROOT"] . '/../datafile.ini', true);

$hostnaam = $_CONFIG['hostnaam'];
$gebruikersnaam = $_CONFIG['gebruikersnaam'];
$wachtwoord = $_CONFIG['wachtwoord'];
$database = $_CONFIG['database'];

define('HOSTNAAM', $hostnaam);
define('GEBRUIKERSNAAM', $gebruikersnaam);
define('WACHTWOORD', $wachtwoord);
define('DATABASE', $database); 

error_reporting($__error_reporting_level);

class sql
{
	 protected $hostnaam = HOSTNAAM;
	 protected $gebruikersnaam = GEBRUIKERSNAAM;
	 protected $wachtwoord = WACHTWOORD;
	 protected $database = DATABASE;
	 private function connect()
	 {
		 $connections = mysql_connect($this->hostnaam, $this->gebruikersnaam, $this->wachtwoord) or die ('Unabale to connect to the database');
		 mysql_select_db($this->database) or die ('Unable to select database!');
		 return;
	 }
}
?>


index.php (STUKJE)

// IMPORTEER DE BENODIGE CODE \\
include $_SERVER["DOCUMENT_ROOT"] . '/paneel/assets/include/init.php';
include $_SERVER["DOCUMENT_ROOT"] . '/paneel/assets/include/functions.php';

$obj = new sql;
Wat verwacht je te gebeuren dan?

(En waarom oude mysql-functies?)
Oude mysql functies heb ik net al aangepast :P had even niet opgelet. Hij verwacht een error te geven als de gegevens verkeerd zijn in datafile.ini maar dit gebeurt niet.

[size=xsmall]Toevoeging op 05/01/2017 12:09:41:[/size]

EDIT:
[/code]
<?php
$_CONFIG = parse_ini_file($_SERVER["DOCUMENT_ROOT"] . '/../datafile.ini', true);

$hostnaam = $_CONFIG['hostnaam'];
$gebruikersnaam = $_CONFIG['gebruikersnaam'];
$wachtwoord = $_CONFIG['wachtwoord'];
$database = $_CONFIG['database'];

define('HOSTNAAM', $hostnaam);
define('GEBRUIKERSNAAM', $gebruikersnaam);
define('WACHTWOORD', $wachtwoord);
define('DATABASE', $database);

class DB {
protected $hostnaam = 'HOSTNAAM';
protected $gebruikersnaam = 'GEBRUIKERSNAAM';
protected $wachtwoord = 'WACHTWOORD';
protected $database = 'DATABASE';

public function connect() {
$connect_db = @new mysqli($this->hostnaam, $this->gebruikersnaam, $this->wachtwoord, $this->database);
if (mysqli_connect_errno()) {
printf("Er is een fout opgetreden. Foutcode ". mysqli_connect_error().'.');
exit();
}
return true;
}
}
?>
[/code]

index

$db = new DB();
$db->connect();


[size=xsmall]Toevoeging op 05/01/2017 12:10:17:[/size]

Hij geeft nu wel erros, maar hij zegt steeds host is onbekend. Define ik iets niet goed?
Omdat de hostnaam letterlijk 'HOSTNAAM' is in je class.

Persoonlijk zou ik deze gegevens in een je constructor meegeven:
$db = new DB(HOSTNAAM,GEBRUIKERSNAAM,WACHTWOORD,DATABASE);


En let erop dat een define die je aanroept niet tussen quotes staat:

<?php
define('NAAM', "Pietje");
echo "Hallo ".NAAM;
?>

Ook zou ik je class in een apart bestand opslaan, om de code schoon te houden.

[sub]NB: Los van dit is MySQLi zelf al een class op zich die je niet nogmaals in een andere class hoeft te wrappen. Maar ik neem aan dat het puur om oefening gaat. Als je echt serieus met de MySQLi-class aan de slag wilt gaan is het extenden al een handige bezigheid.[/sub]
- Rob - op 05/01/2017 11:30:22
Maar het werkt niet

Waar blijkt dit uit? Mogelijk reeds beantwoord.

- Rob - op 05/01/2017 11:30:22
het geeft geen errors...

Het is beter om constanten te gebruiken voor de errorlevels dan hun numerieke waarde. Deze numerieke waarden kunnen mogelijk in de toekomst veranderen, de constanten blijven... constant. Gebruik bijvoorbeeld E_ALL (ik zou niet eens weten wat "1" zou moeten rapporteren).

Met error_reporting() geef je aan wat je rapporteert, maar je moet ook aangeven waar er gerapporteerd moet worden. Dit doe je met display_errors() ini_set('display_errors', <locatie>);. Voor <locatie> kun je bijvoorbeeld 'stdout' gebruiken.
Volgensmij heb ik het nu goed gedaan..

<?php
$_CONFIG = parse_ini_file($_SERVER["DOCUMENT_ROOT"] . '/../datafile.ini', true);
define('HOSTNAAM', $_CONFIG['hostnaam']);
define('GEBRUIKERSNAAM', $_CONFIG['gebruikersnaam']);
define('WACHTWOORD', $_CONFIG['wachtwoord']);
define('DATABASE', $_CONFIG['database']);
class DB {
    protected $hostnaam = HOSTNAAM;
    protected $gebruikersnaam = GEBRUIKERSNAAM;
    protected $wachtwoord = WACHTWOORD;
    protected $database = DATABASE;
    
    public function connect() {    
        $connect_db = @new mysqli($this->hostnaam, $this->gebruikersnaam, $this->wachtwoord, $this->database);
        if (mysqli_connect_errno()) {
            printf("Er is een fout opgetreden. Foutcode ". mysqli_connect_error().'.');
            exit();
        }
        return true;
    }
}
?>


[size=xsmall]Toevoeging op 05/01/2017 13:03:35:[/size]


NB: Los van dit is MySQLi zelf al een class op zich die je niet nogmaals in een andere class hoeft te wrappen. Maar ik neem aan dat het puur om oefening gaat. Als je echt serieus met de MySQLi-class aan de slag wilt gaan is het extenden al een handige bezigheid.

Ehmm kunt u dit nog een keer maar dan anders voor mij uitleggen? Of een linkje sturen met uitleg
Wat gebeurt er nu precies? En waarom geef je die inlog-gegevens niet mee in een constructor?
- Rob - op 05/01/2017 12:59:49

Ehmm kunt u dit nog een keer maar dan anders voor mij uitleggen? Of een linkje sturen met uitleg

Lees ook eens: http://www.phptuts.nl/view/26/1/
Nu controleert hij de gegevens, als er 1 foutje is geeft hij een error. Als er geen fouten zijn, geeft die niks en laad de rest van de index pagina.
En waarom geef je die inlog-gegevens niet mee in een constructor?
Omdat als ik in 30 bestanden

$_CONFIG = parse_ini_file($_SERVER["DOCUMENT_ROOT"] . '/../datafile.ini', true);
define('HOSTNAAM', $_CONFIG['hostnaam']);
define('GEBRUIKERSNAAM', $_CONFIG['gebruikersnaam']);
define('WACHTWOORD', $_CONFIG['wachtwoord']);
define('DATABASE', $_CONFIG['database']);

of in 1 bestand, vind ik het makkelijker voor het in init.php te doen zodat ik het maar 1 keer hoef te doen.
Een database connectie maak je in het algemeen ook maar één keer aan op een site. Dus sowieso doe je dat maar één keer.
EDIT:
dus dit?:

<?php
session_start(); // START UNIEKE SESSIE \\

// IMPORTEER DE BENODIGE CODE \\
require $_SERVER["DOCUMENT_ROOT"] . '/paneel/assets/include/init.php';
require $_SERVER["DOCUMENT_ROOT"] . '/paneel/assets/include/functions.php';
$_CONFIG = parse_ini_file($_SERVER["DOCUMENT_ROOT"] . '/../datafile.ini', true);

define('HOSTNAAM', $_CONFIG['hostnaam']);
define('GEBRUIKERSNAAM', $_CONFIG['gebruikersnaam']);
define('WACHTWOORD', $_CONFIG['wachtwoord']);
define('DATABASE', $_CONFIG['database']);

$db = new DB(HOSTNAAM, GEBRUIKERSNAAM, WACHTWOORD, DATABASE);
$db->connect();

// KIJK OF DE BEZOEKER IS INGELOGD \\
if (loggedIn() == true) {
	header('Location: /paneel/dashboard');
	exit();
}
?>

[quote]
Quote:
NB: Los van dit is MySQLi zelf al een class op zich die je niet nogmaals in een andere class hoeft te wrappen. Maar ik neem aan dat het puur om oefening gaat. Als je echt serieus met de MySQLi-class aan de slag wilt gaan is het extenden al een handige bezigheid.

Ehmm kunt u dit nog een keer maar dan anders voor mij uitleggen? Of een linkje sturen met uitleg
[/quote
Ja, maar dan moet je nog een contructor in je class aanmaken. Uiteraard kan je die connect daar direct uitvoeren, i.p.v. een method die je steeds maar weer aanroept. Want een connectie hoort direct te gebeuren als je de database-class aanroept.

Als we het over het extenden van MySQLi hebben, dan gebruik ik het volgende.
Op deze manier heb ik binnen de overervende Database-class meteen foutafhandeling in mijn $db->query(".....");


<?php
class Database extends mysqli 
{ 
    function query($query) 
    { 
        $result = parent::query($query);
        if($this->error) {
            throw new Exception(mysqli_error($this), mysqli_errno($this));
        }
        return $result;
    } 
}  
?>


Ikzelf gebruik geen eigen aparte class voor mijn database, maar een extend op de bestaande MySQLi. Anders sta je feitelijk het wiel opnieuw weer uit te vinden. Met deze manier kan je zelf nieuwe functies toevoegen of huidige overerven...

Reageren