2010-03-28 3 views
3

Actuellement, tous les paramètres de mon script se trouvent dans un fichier PHP que j'intègre. Je suis en train de déplacer ces paramètres (environ 100) vers une table de base de données appelée «paramètres». Cependant, j'ai du mal à trouver un moyen efficace de récupérer tous dans le fichier.Comment puis-je récupérer efficacement un grand nombre de paramètres de base de données en tant que variables PHP?

Le tableau des paramètres a 3 colonnes:

  • ID (autoincrements)
  • Nom
  • valeur

Deux rangées par exemple pourraient être:

admin_user   john 
admin_email_address [email protected] 

La seule comme je peux penser à récupérer eac réglage h est comme ceci:

$result = mysql_query("SELECT value FROM settings WHERE name = 'admin_user'"); 
$row = mysql_fetch_array($result); 
$admin_user = $row['value']; 

$result = mysql_query("SELECT value FROM settings WHERE name = 'admin_email_address'"); 
$row = mysql_fetch_array($result); 
$admin_email_address = $row['value']; 

etc etc

En procédant ainsi, prendra beaucoup de code et sera probablement lente.

Y a-t-il un meilleur moyen?

+0

En fait, la configuration des paramètres (oh, quelle expression) est beaucoup plus rapide en les incluant dans un script PHP, que de les lire et de les analyser depuis la base de données. Je comprends la motivation - après toutes les bases de données sont pour les données - mais dans ce cas, vous pouvez économiser sur la vitesse et la mise en œuvre. PHP est une machine virtuelle, et plutôt rapide - quand vous incluez un script, il est lancé en un rien de temps. – amn

+0

Encore mieux, avez-vous envisagé de générer un script PHP qui configure les paramètres (pardon à nouveau) par PHP, à partir d'une base de données? C'est-à-dire, si vos paramètres ne changent pas très souvent, ou vous les changez d'une manière très prévisible, et ceux-ci sont simplement dans la base de données pour plus de commodité. – amn

Répondre

7

100 réglages? Chargez-les tous en même temps. Cela ne prendra pas de temps du tout. Vous absolument ne voulez pas les charger un à la fois.

$result = mysql_query('SELECT * FROM settings'); 
$settings = array(); 
while ($row = mysql_fetch_assoc($result)) { 
    $settings[$row['name']] = $row['value']; 
} 

Si vous avez besoin de compartimenter ces quelque sorte, selon la façon dont vous avez besoin de le faire, vous pouvez mettre une catégorie ou quelque chose sur la table puis charger tous les paramètres dans une catégorie particulière.

Ce que je suggère est abstraire cela derrière un objet quelconque:

class Settings { 
    private $settings; 

    public function __get($name) { 
    if (!$this->settings)) { 
     $result = mysql_query('SELECT * FROM settings'); 
     $this->settings = array(); 
     while ($row = mysql_fetch_assoc($result)) { 
     $this->settings[$row['name']] = $row['value']; 
     } 
    } 
    return $this->settings[$name]; 
    } 
} 

De cette façon, les paramètres ne sont pas chargés jusqu'à ce que vous essayez et un accès:

$settings = new Settings; 
echo $settings->admin_name; // now they're loaded 
+0

100 paramètres ne vaut pas vraiment la peine de les mettre dans une base de données, soit. Utilisez simplement un fichier qui dit ' 'etc. – Zarel

+0

Je peux comprendre pour mettre les paramètres dans la base de données, pas vraiment un problème. Il est plus facile de les changer avec une interface d'administration. 100 paramètres n'est vraiment pas grand. En plus de ce que dit Cletus, je suggère d'ajouter un système de cache quelque part entre les deux. Considérant qu'un de vos pages n'a pas besoin d'atteindre la base de données (car il n'a pas besoin ou parce qu'il utilise aussi des éléments en cache), vous gagnerez beaucoup de temps (oui, une connexion à la base de données est lente). – Savageman

1

Eh bien, je semble avoir pensé à elle:

$settings = mysql_query("SELECT * FROM settings"); 

while ($row = mysql_fetch_assoc($settings)) { 
eval('global $' . $row['name'] . ';'); 
eval('$' . $row['name'] . ' = "' . $row['value'] . '";'); 
} 

il fonctionne bien que je n'étais pas désireux d'utiliser eval(), mais je t Hink c'est le seul moyen.

Je me demande maintenant si de nombreux hôtes ont eval() désactivé. Des pensées?

+0

il suffit d'utiliser le code que vous a donné cletus. Envisagez également de lire http://stackoverflow.com/faq pour vous assurer de bien comprendre le fonctionnement de SO. – user187291

+0

J'ai eu un autre regard sur le code de Cletus et j'ai réussi à le faire fonctionner. Merci beaucoup à Cletus. Je pense que cela signifiera la mise à jour de tous les cas où mes paramètres sont déjà utilisés mais je suis sûr que cela en vaudra la peine à long terme. Je vais lire la FAQ de SO. – Steven

Questions connexes