Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

Hoi,

ich habe ein Problem. Wenn ich versuche darauf zuzugreifen kommt ein Fehler. Kann mir jemand sagen an was das liegt?


<?php
class DBConnection
{
private $db['host'] = 'localhost'; // Datenbank Host
private $db['user'] = 'root'; // Datenbank Benutzername
private $db['pass'] = ''; // Datenbank Passwort
private $db['db'] = 'test'; // Datenbankname

public getHost(){
return $db['host'];
}

public getUser(){
return $db['user'];
}

public getPass(){
return $db['pass'];
}

public getDB(){
return $db['db'];
}
}
?>
[/PHP]

Und hiermit versuche ich es abzufrage (Testmäßig)

[PHP]
<?php
require("includes/db.inc.php");
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>New Document</title>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
</head>
<body>
<?php
$db = new DBConnect();
$connect = new mysqli($db->getHost(),$db->getUser(),$db->getPass(),$db->getDB());

if(!$connect){
echo "Es konnte keine Verbindung aufgebaut werden!";
}else{
echo "Alles lief bestens!";
$connect->close();
}
?>
</body>
</html>

Und das ist der Fehler:


Parse error: parse error, unexpected '[', expecting ',' or ';' in /srv/www/htdocs/clehmann/test/includes/db.inc.php on line 4
[/PHP]

Mfg Chris

du versuchst verschiedene Variablen zu definieren die gleich heißen aber andere Feldnamen haben. das geht nicht.

private $db = array(

'host' => ...,

'user' => .....

);

das sollte gehen.

ich würde dir jedoch empfehlen das im Konstruktor zu setzen, ist flexibler

Und wenn du einen schritt weiter gehen möchtest, mach ein Singleton draus. (singleton-pattern in einer suchmaschine deiner Wahl)

Ich weiß was ein Singleton ist ;) Hatte ein Seminar über Design Pattern (Entwurf Muster) :D

Danke nochmal!

Der Felher liegt in Zeile 4, also hier:


<?php

  class DBConnection

  {

    [b]private $db['host'] = 'localhost';[/b]

Da du private und public nutzt, nutzt du also php 5 (davor gab es das nicht). In php 5 kannst du aber Felder in einer Klasse nicht so initialisieren bei der deklaration.

Definier deine Felder und initialisiere sie im Konstruktor:


<?php
class DBConnection
{
private $db = array();
...
function __construct()
{
$db["host"] = "bla";
...
}
[/php]

Die Deklaration als Array ist sauberer, muss aber AFAIK bei php nicht unbedingt sein (sollte aber auf jeden Fall).

Siehe:

Beispiel 19.2. Einfache Klassendefinition

...

Der Standardwert muss ein konstanter Ausdruck sein, keine (z.B.) variable, Klassenattribut oder Funktionsaufruf.

[/Quote]

Und bei dir ist der Standardwert ja keine Konstante.

Ich hab dazu auch irgenwo mal einen vergleich zu php 4 gelesen, da wurde das expliziter beschrieben. Auch auf dieser Seite, aber finde es nicht mehr im Moment.

Jetzt sieht das ganze so aus aber funktioniert nicht da er mir anzeigt das die Felder leer sind. also 'host, 'user', 'pass' und 'db'.


<?php
class DBConnection
{
private $db;

function __construct(){
$db = array(
'host' => 'localhost',
'user' => 'test',
'pass' => 'test',
'db' => 'test'
);
}

public function getHost(){
return $db['host'];
}

public function getUser(){
return $db['user'];
}

public function getPass(){
return $db['pass'];
}

public function getDB(){
return $db['db'];
}
}
?>
[/PHP]

und hier die Index.php (die $connect ist auskommentiert)

[PHP]
<?php
require("includes/db.inc.php");
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>New Document</title>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
</head>
<body>
<?php
$db = new DBConnection();
//$connect = new mysqli($db->getHost(),$db->getUser(),$db->getPass(),$db->getDB());
echo $db->getHost() . ", ". $db->getUser(). ", ". $db->getPass();
?>
</body>
</html>

An was liegt es das die Array Felder leer sind? Da ich das Array im Konstruktor fülle und ich ja eine neue Instanz der Klasse mache sollte er eigentlich den Konstruktor aufrufen was er, wie es scheint, jedoch nicht tut.

Mfg Chris

Beispiel 19.2. Einfache Klassendefinition

<?php

class SimpleClass

{

// Memberdeklaration

public $var = 'ein Vorgabewert';

// Methodendeklaration

public function displayVar() {

echo $this->var;

}

}

?>

OK, hier ist erstmal das mit dem Vorgabewert wieder drin, was man eigentlich so nicht tun sollte, AFAIK ;)

Aber was ich meine ist das $this, also bei dir:



public function getHost()
{
return $this->db['host'];
}

[/php]

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.