syntax error unexpected T_PUBLIC
syntax error unexpected T_PUBLIC on line .. dat is dit stukje maar ik zie niet wat er fout is, zou er even iemand mee willen kijken :)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
public function openConnection()
{
# code...
try
{
if($this->config->connector == "mysql")
{
$this->connection = mysql_connect($this->config->hostname, $this->config->username, $this->config->password);
$this->selectdb = mysql_select_db($this->config->database);
}
elseif($this->config->connector == "mysqli")
{
$this->connection = mysql_connect($this->config->hostname, $this->config->username, $this->config->password);
$this->selectdb = mysql_select_db($this->config->database);
}
}
catch (Exception $e)
{
return $e;
}
}
?>
public function openConnection()
{
# code...
try
{
if($this->config->connector == "mysql")
{
$this->connection = mysql_connect($this->config->hostname, $this->config->username, $this->config->password);
$this->selectdb = mysql_select_db($this->config->database);
}
elseif($this->config->connector == "mysqli")
{
$this->connection = mysql_connect($this->config->hostname, $this->config->username, $this->config->password);
$this->selectdb = mysql_select_db($this->config->database);
}
}
catch (Exception $e)
{
return $e;
}
}
?>
Bij dit soort meldingen zit de echte fout er altijd voor. Php verwacht namelijk geen public keyword, maar nog iets anders. Je mist dus een haakje, puntkomma oid ervoor.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?php
class config
{
public $hostname;
public $username;
public $password;
public $database;
public $prefix;
public $connector;
function __construct($hostname = NULL, $username = NULL, $password = NULL, $database = NULL, $prefix = NULL, $connector = NULL)
{
$this->hostname = !empty($hostname) ? $hostname : "";
$this->username = !empty($username) ? $username : "";
$this->password = !empty($password) ? $password : "";
$this->database = !empty($database) ? $database : "";
$this->prefix = !empty($prefix) ? $prefix : "";
$this->connector = !empty($connector) ? $connector : "mysql"; //mysql of mysqli waarde opgeven (database)
}
function __destruct()
{
#destruction!
}
}
class db
{
private $connection;
private $selectdb;
private $lastQuery;
private $config;
function __construct($config)
{
# code...
$this->config = $config;
}
function __destruct()
{
#destruction!
}
}
?>
class config
{
public $hostname;
public $username;
public $password;
public $database;
public $prefix;
public $connector;
function __construct($hostname = NULL, $username = NULL, $password = NULL, $database = NULL, $prefix = NULL, $connector = NULL)
{
$this->hostname = !empty($hostname) ? $hostname : "";
$this->username = !empty($username) ? $username : "";
$this->password = !empty($password) ? $password : "";
$this->database = !empty($database) ? $database : "";
$this->prefix = !empty($prefix) ? $prefix : "";
$this->connector = !empty($connector) ? $connector : "mysql"; //mysql of mysqli waarde opgeven (database)
}
function __destruct()
{
#destruction!
}
}
class db
{
private $connection;
private $selectdb;
private $lastQuery;
private $config;
function __construct($config)
{
# code...
$this->config = $config;
}
function __destruct()
{
#destruction!
}
}
?>
Welke PHP-versie heb je?
versie 5.3.6 ( draai dit lokaal op MAMP )
In welke class zit die functie? Beide classes zijn namelijk afgesloten, dus als dit erna komt dan kan die public niet. Een functie buiten een class kan je niet public maken.
ik heb er private van gemaakt en dit werkte ook niet. ik ben niet zo lang met OOP bezigg dit is pas mijn 3e class ofzo dus ik zie ook niet zo snel wat er fout is. even voor de zekerheid hier hoe de hele code in elkaar zit..
http://pastebin.com/FArdQEqh
De class db wordt afgesloten op regel 23, daarna definieer je echter nog functies die in die class horen. Omdat die nu buiten een class vallen, verwacht php geen public keyword. Het haakje van regel 23 moet dus ergens anders, ik gok regel 257.
in mijn log zie ik het volgende
[08-Jun-2012 22:48:26] PHP Parse error: syntax error, unexpected T_ELSEIF, expecting T_CATCH in /Applications/MAMP/htdocs/library/class.db.php on line 227
dat is de function van countRows waarin ik mysql_num_rows uitvoer. waarom is dit fout?
Kijk goed naar de haakjes. De elseif staat nu achter het haakje sluiten van de try, dat klopt niet. Die elseif moet achter de if komen. Je if heeft nu helemaal geen haakjes.
als je even naar het geheel kijkt. is dit een beetje goed OOP of zijn er dingen die ik echt anders moet doen?
Het eerste was het returnen van het exception object (return $e). Op zich kan dat uiteraard, alleen is het niet gebruikelijk. Meestal handel je de fout daar helemaal af, of gooi je opnieuw een exception, die je dan ergens anders dan weer kan afhandelen.
Het tweede is dat je door je hele object heen de mysql en mysqli functies gebruikt. In elke functie weer heb je een if en else staan zodat je beide functies kan gebruiken. Wat als je nu ook pdo wil gaan gebruiken, ga je dan al die functies af om een volgende optie erbij te bouwen? Wat ik zou proberen is de mysql/mysqli/pdo functies er compleet uit te halen en dat in aparte classes te plaatsen. Een class voor mysql, een class voor mysqli, een class voor pdo, een class voor.... wat er dan ook nog later kan komen. De class die je nu hebt krijgt gewoon een object van een van die classes meegegeven (maakt niet uit welke) en gebruikt dat object om echt de functie uit te voeren. Deze class die je nu hebt kan dus naar de rest van je applicatie als 'het' database object gezien worden, maar eronder kan je verschillende methodes toepassen.
- kan je me een voorbeeld geven van zown foutafhandeling?
- bedoel je met dat apart maken van die classes en een aparte db classe en dan welke db class ik gebruik hierop extenden?
Kan de class het zelf, dan moet je dat doen. Bijvoorbeeld als er foute input is gegeven, dan kan je dat vervangen door een default waarde. Doe dat en geef weer een normale return waarde terug.
Kan de class het niet zelf, als er bijvoorbeeld echt helemaal geen database connectie mogelijk is, dan zal er een fout pagina getoond moeten worden. Dat kan deze class niet, dus gooi je een nieuwe exception, zodat dat later weer kan worden opgevangen.
Op het tweede punt wil ik morgen wel een voorbeeld geven. Het is me nu even te laat :-)
deze van Niels en deze van mijzelf.
Over het eerste:
- een goed artikel
- dit topic (vanaf de gelinkte reactie, daarvoor zeg ik allemaal onwetende domme dingen... ;)
Code (php)
maar ik krijg: de tabel werd niet benaderd. Wanneer ik dan in de php_log kijk dan zie ik geen foutmelding en ook met de display_errors zie ik niets. volgens mij ligt het aan de function waarin ik de slashes toevoeg dat dit fout gaat. of waarin ik de table eruit haal met str_replace. kan iemand in het linkje naar deze 2 functies kijken voor me of hier iets fout in zit?
Toevoeging op 08/06/2012 23:52:33:
editedit: bedankt wouter! ik ga even naar de linkjes kijken :) -> ik heb er naar gekeken en vond jou manier iets duidelijker ik ga het even proberen zoals daar beschreven en post hier dan wel even een linkje van hoe het geworden is. dat andere is mij nu veel te laat voor geworden ga ik morgen zeker doornemen als ik er tijd voor vind naast het voetbal kijken en werken!
Gewijzigd op 08/06/2012 23:59:41 door Reshad F
Voor de objecten wacht ik nu even af waar je zelf mee komt, daar kunnen we dan verder op door.
Gewijzigd op 09/06/2012 08:45:50 door Erwin H
Dus wat wil je hier mee? Zoals je het nu hebt krijg je een foutmelding.
Code (php)
1
2
3
4
2
3
4
<?php
$query = str_replace("}", "", $query);
$query = str_replace("{", "", $this->config->prefix, $query);
?>
$query = str_replace("}", "", $query);
$query = str_replace("{", "", $this->config->prefix, $query);
?>