Wanneer ik de volgende methode uitvoer krijg ik de volgende foutmelding:


<?php
namespace TEST 
{
	class DB_Connectie
	{
		public function Connect()
		{
			$mysqli = new mysqli('localhost', 'gegevens', 'wachtwoord', 'gegevens');
			$mysqli->set_charset("utf8");
			if(mysqli_connect_errno())
			{
				trigger_error('Fout bij verbinding: '.$mysqli->error);
			}
		}
	}
}
?>


Fatal error: Class 'TEST\mysqli' not found op regel 8'

mysqli is wel geïnstalleerd. Dit heb ik ook gecontroleerd. Waar zit hier de fout?
Omdat je Namespaces gebruikt zoekt php de class mysqli in je eigen namespace TEST.
Daar is de class echter niet te vinden. De class is in de global namespace te vinden.
en dat kun je aangeven door voor de classnaam een \ te schrijven:

<?php
$mysqli = new \mysqli('localhost', 'gegevens', 'wachtwoord', 'gegevens');
?>

Je krijgt dit met alle standaard PHP classes zoals bijvoorbeeld ook DateTime.
Ok het probleem met de namespace heb ik inmiddels opgelost. Nu zit ik met het volgende probleem.
Wanneer ik een connectie wil openen op de volgende manier krijg ik de volgende foutmelding:




namespace TEST 
{
	class DB_Connectie
	{
		public function ConnectieOpenen()
		{
			$mysqli = new \mysqli('localhost', '**', '**', '**');
			$mysqli->set_charset("utf8");
			if(mysqli_connect_errno())
			{
				trigger_error('Fout bij verbinding: '.$mysqli->error);
			}
			return $mysqli;
		}
	}
}



namespace TEST 
{
	include ('DB_Connectie.php');
	
	class DL_Account extends BL_Account
	{	
		public function SelectAllAccounts()
		{			
			$DB_Connectie = new DB_Connectie();
			$DB_Connectie->ConnectieOpenen();
			$result = mysqli_query($mysqli, "SelectAllAccounts") or die("Query fail: " . mysqli_error());						
			return $result;	
		}
	}
}


Warning: mysqli_query() expects parameter 1 to be mysqli, null given in ... on line 11

Warning: mysqli_error() expects exactly 1 parameter, 0 given in ... on line 11
Query fail:
Je kunt mysqli op twee manieren gebruiken:

1. object oriënted
2. procedureel

Jij gebruikt beiden door elkaar en dat gaat niet werken.

Regel 11 zal iets worden als:
<?php
$mysqli->query("SelectAllAccounts");
?>

(niet getest)
Frank Nietbelangrijk op 20/11/2014 22:14:32

Je kunt mysqli op twee manieren gebruiken:

1. object oriënted
2. procedureel

Jij gebruikt beiden door elkaar en dat gaat niet werken.

Regel 11 zal iets worden als:
<?php
$mysqli->query("SelectAllAccounts");
?>

(niet getest)


Hierop krijg ik nu de volgende foutmelding:
Fatal error: Call to a member function query() on a non-object in ... on line 11
Tuurlijk werkt dat wel. de procedurele MySQLi manier is een wrapper om de object oriënted manier.

Wat niet werkt is een variabele gedefineerd in een scope gebruiken in een hele andere scope.
http://php.net/manual/en/language.variables.scope.php

Hoe kom je dan aan je connectie? Geef de connectie mee als argument aan de selectAllAccounts() methode, of aan de constructor van de class.
Dos Moonen op 20/11/2014 22:30:37

Tuurlijk werkt dat wel. de procedurele MySQLi manier is een wrapper om de object oriënted manier.

Wat niet werkt is een variabele gedefineerd in een scope gebruiken in een hele andere scope.
http://php.net/manual/en/language.variables.scope.php

Hoe kom je dan aan je connectie? Geef de connectie mee als argument aan de selectAllAccounts() methode, of aan de constructor van de class.


Oke ik zie het al inderdaad;) Het werkt
<?php

$mysqli = ...
$dl_account = ...

$dl_account->sellectAllAccounts($mysqli);

?>

Of

<?php

$mysqli = ...
$dl_account = new DL_Account($mysqli, ...);

$dl_account->sellectAllAccount();

?>

Of iets vergelijkbaars
Ok ja het werkt. Was iets te snel met reageren;) Toch heel erg bedankt
Dos Moonen op 20/11/2014 22:30:37

Tuurlijk werkt dat wel. de procedurele MySQLi manier is een wrapper om de object oriënted manier.


Hmmm Dos oké ik had al eerder op dit board dezelfde opmerking gelezen. Blijkt dus dat het wel kan werken maar vindt je het netjes? Ik zou dan toch voor één van de twee kiezen.
Netjes is inderdaad iets anders.

Reageren