MySQL tabelle als array auslesen und variable global übergeben.

benjaminbih

Mitglied
Hallo ich versuche mir gerade was zu basteln wo die settings einer PHP app Zentral über eine function aus der MySQL gelesen werden sollen und danach in allen scripts zur verfügung stehen.

Die MySQL tabelle:
Code:
CREATE TABLE IF NOT EXISTS `settings` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(100) NOT NULL,
  `description` varchar(15000) NOT NULL,
  `value` varchar(100) NOT NULL,
  `info` varchar(2000) NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `CFG_NAME` (`name`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;

--
-- Daten für Tabelle `settings`
--

INSERT INTO `settings` (`id`, `name`, `description`, `value`, `info`) VALUES
(1, 'deafult_cookie_expire', 'The default cookie lifetime in Seconds', '900', 'Example: 900 meens the cookie lifetime is 900 seconds = 15 minutes'),
(2, 'deafult_session_expire', 'The default session lifetime in Seconds', '900', 'Example: 900 meens the session lifetime is 900 seconds = 15 minutes');


Die function die per require_once(script.php) die Ergebnisse in allen scripts verfügbar machen soll:
Code:
<?php

//load configurations/settings
  function load_config(){
    global $db, $cfg;
	unset($cfg);
	$load_configs = $db->query("SELECT name,value FROM `settings`");
		while ($cfg= $db->fetch_array($load_configs))
			$GLOBALS[$cfg['name']] = $cfg['value'];
  }


?>
Die variable sollte jetzt per
Code:
$cfg["deafult_cookie_expire"]
verfügbar sein ist sie aber nicht.
Wenn ich per
Code:
var_dump($cfg["deafult_cookie_expire"]);
das ergebnis sehen will kommt nur NULL.

Kann jemand helfen, was mache ich da falsch, ich hatte es schon mal am lauffen aber habe es nicht gesichert.
 
Zuletzt bearbeitet:
Deine Zuweisung ist falsch.

PHP:
$GLOBALS[$cfg['name']] = $cfg['value'];

Sollte so aussehen:

PHP:
$GLOBALS['cfg'][$cfg['name']] = $cfg['value'];
 
Danke für die Antwort.

Wenn ich jetzt die var mit
Code:
$cfg["deafult_cookie_expire"]
ausgeben/aufrufen will erhalte ich deisen Fehler
Code:
Notice: Undefined index: deafult_cookie_expire in
 
Hast du denn mal getestet, ob du etwas aus der Datenbank ausliest?

Grundsätzlich finde ich allerdings, dass du in eine falsche Richtung gehst, wenn du alles im globalen Raum rumfliegen lässt.

Wie wäre es, wenn du dich bereits mit Funktionen auseinandersetzt, direkt mit Klassen anfreundest? Dort könnte das Registry Pattern etwas für dich sein.
 
Ja die query lieferte Daten.
Ich habe das jetzt mal so umgebaut:

PHP:
<?php
class init_config
{
/**
 *  function load_settings()
 *  load configurations/settings
 *  from database and make them global vars
 *  uasge: $cfg = new config();
 *         $cfg->load_settings($string)
 */

  function load_settings(){
    global $db, $cfg;
	unset($cfg);
	$this->load_configs = $db->query("SELECT name,value FROM `settings`");
		while ($row= $db->fetch_array($this->load_configs)){
			$this->name = $row[0];
			$this->value = $row[1];
			return $GLOBALS['$this->name'] = $this->value;
			}

  }

}
?>

Ich weis nicht ob es jetzt die Ideale Lösung ist?
Es liefert mir auf jeden fall mit der Query alle verfügbaren Daten aus der Tabelle in ein Array und mit
PHP:
$cfg->load_settings($string)
bekomme ich den gewünschten Wert zurück.

Ich habe mir auch die Registry Pattern angesehen den unterschied hierzu verstehe ich nicht wirklich.
Wäre es vielleicht besser nun statt den gesamten Daten aus der Tabelle nur den Wert den ich bracuhe mit
PHP:
$cfg->load_setting($string)
$this->load_configs = $db->query("SELECT name,value FROM `settings` WHERE name = '".$this->name."'");
auszulesen ?
Dies würde ja die Datenmenge geringer halten aber dafür eben mehr Querys erzeugen, ich schätze jetzt mal ab das die Tabelle irgendwann mit ca. 50-100 Einträgen gefüllt sein wird?
 
Zuletzt bearbeitet:
PHP:
return $GLOBALS['$this->name'] = $this->value;

Strings in einfachen Anführungszeichen werden nicht geparst, sprich deine Variable heißt danach auch "$this->name" und hat nicht den Wert von $this->name.

Ansonsten macht dein Beispiel keinen Sinn, denn es ist immer noch alles in einer Funktion und somit ist die Klasse auch nicht benötigt.
 
Zurück