Door
A van Gent
op 20-07-2014 20:28
gewijzigd op 20-07-2014 20:57
1.356 views
Dag PHPHulp'ers,
Ik ben begonnen met het leren van PHP5 en heb zojuist mijn eerste script gemaakt, maar het werkt niet. Het is een script waarbij men een review kan toevoegen aan een MySQL database.
De errors: Notice: Undefined variable: db in /*/toevoegen.php on line 8
Fatal error: Call to a member function quote() on a non-object in /*/toevoegen.php on line 8
Ik kom er absoluut niet uit :( wie o wie kan mij helpen?
Het script:
[CODE]
<?PHP
error_reporting(E_ALL);
$db = new PDO('mysql:host=localhost;dbname=deb58854_rev', 'deb58854_rev', 'debalie');
function esc($db, $str)
{
return $db->quote($str);
}
class Ervaring
{
public $voornaam;
public $achternaam;
public $email;
public $ervaring;
public function __construct($voornaam, $achternaam, $email, $ervaring)
{
if (trim($voornaam == "") OR trim($achternaam == "") OR trim($email == "") OR trim($ervaring == ""))
{
throw new Exception ("<p>U heeft niet alle velden ingevuld.</p>");
}
Zo.. ik lees ik ben begonnen met PHP5 en ik zie al functies en zelfs een class :-)
Goed:
functies zijn min of meer geïsoleerde stukjes programmacode. Hetgeen wil zeggen dat als je buiten de functie een variabele declareert ($db in jouw geval) deze variabele nog niet bestaat binnen je functie.
Je zou dan bijvoorbeeld de variabele mee kunnen geven als een parameter net als $str
<?PHP
function esc($db, $str)
{
return $db->quote($str);
}
?>
vervolgens moet je dan ook wel een waarde meegeven bij het aanroepen zoals op regel 28
<?php
$this->voornaam = esc($db, $voornaam);
?>
Klopt, maar dan zou ik elke keer opnieuw de database connectie moeten maken in elke class. Stel dat ik dan een keer de database settings wil wijzigen dan moet ik dat in elke class doen.
Het lijkt er op alsof de PDO-verbinding niet tot stand gebracht wordt.
De PDO-verbinding werkt!
@ Frank:
Ja klopt, ben er enorm enthousiast over :)
Ik heb het script aangepast maar krijg alsnog de foutmeldingen:
Notice: Undefined variable: db in /*/toevoegen.php on line 28
Fatal error: Call to a member function quote() on a non-object in /*/toevoegen.php on line 8
Hier het aangepaste script:
[CODE]
<?PHP
error_reporting(E_ALL);
$db = new PDO('mysql:host=localhost;dbname=XXXX', 'XXXX', 'XXXXX');
function esc($db, $str)
{
return $db->quote($str);
}
class Ervaring
{
public $voornaam;
public $achternaam;
public $email;
public $ervaring;
public function __construct($voornaam, $achternaam, $email, $ervaring)
{
if (trim($voornaam == "") OR trim($achternaam == "") OR trim($email == "") OR trim($ervaring == ""))
{
throw new Exception ("<p>U heeft niet alle velden ingevuld.</p>");
}
// een constructor is ALTIJD public dus van mij mag je dat weghalen. Het is echter niet fout (in PHP).
/*public*/ function __construct($voornaam, $achternaam, $email, $ervaring)
{
$this->voornaam = esc($db, $voornaam);
$this->achternaam = esc($db, $achternaam);
$this->email = esc($db, $email);
$this->ervaring = esc($db, $ervaring);
$this->ip = $_SERVER['REMOTE_ADDR'];
$this->datum = time();
}
Ik heb het script aangepast maar krijg nu de foutmelding: Parse error: syntax error, unexpected T_VARIABLE, expecting T_FUNCTION in /*/toevoegen.php on line 39
Ik kan natuurlijk de $db database connectie in de function __construct() plaatsen maar dan zou ik dat in elke class moeten doen die ik ga maken. Wat ik wil doen is een config.php includen in al mijn bestanden. In dat bestand wordt dan de database connectie gemaakt. Als ik dan ooit de db gegevens moet aanpassen dan hoef ik dat maar in 1 bestand te doen ipv in alle classes.
[CODE]
<?PHP
error_reporting(E_ALL);
$db = new PDO('mysql:host=localhost;dbname=XXX', 'XXX', 'XXX');
function esc($db, $str)
{
return $db->quote($str);
}
function __construct($db, $voornaam, $achternaam, $email, $ervaring)
{
$this->db = $db;
if (trim($voornaam == "") OR trim($achternaam == "") OR trim($email == "") OR trim($ervaring == ""))
{
throw new Exception ("<p>U heeft niet alle velden ingevuld.</p>");
}
Ik kan natuurlijk de $db database connectie in de function __construct() plaatsen
Daar gaat het niet om. Je kan geen losse code in een class hebben, alles moet binnen methods (functies) staan. Regels 39 t/m 46 bij jou staan niet binnen een method, dat kan dus niet.