Saklama küresel sitesi tercihleri ​​[PHP / MySQL]

6 Cevap php

Herkes genel site tercihlerini depolamak için en iyi uygulamayı tavsiye edebilir misiniz? Örneğin, varsayılan sayfa başlığı komut bir set değil, ya da özellikli bir içerik kutusunda görüntülenecek öğelerin, ya da minik bir liste sayısı bir resim yüklendiğinde sistem yapmak gerektiğini boyutları eğer. Bu değerleri merkeziyetçi bir kolayca birçok sayfalarında kullanılmış olabilir tercihlerini değiştirmek için izin bariz yararı vardır.

Benim varsayılan bir yaklaşım * yudum * EAV tabloda nitelik / değer çiftleri olarak bu tercihleri ​​yerleştirmek oldu.

Bu tablo önemli bir boyutu haline hiç olası değildir, bu yüzden performansı hakkında çok endişeli değilim. Benim şema kalan ilişkisel olduğunu. Gerçi bazı lanet çirkin sorguları için yapar:

$sql = "SELECT name, value FROM preferences"
.    " WHERE name = 'picture_sizes'"
.    " OR name = 'num_picture_fields'"
.    " OR name = 'server_path_to_http'"
.    " OR name = 'picture_directory'";
$query = mysql_query($sql);
if(!$query) {
    echo "Oops! ".mysql_error();
}
while($results = mysql_fetch_assoc($query)) {
    $pref[$results['name']] = $results['value'];
}

Herkes daha iyi bir yaklaşım önerebilirsiniz?

6 Cevap

İşte bunu yapıyoruz yolu ince görünüyor.

Eğer sorgu çirkin arıyoruz endişe ediyorsanız, sizin SQL'ye biraz temizlik deneyebilirsiniz.

Burada söz verdi sorgu temiz bir versiyonu:

SELECT name, value FROM preferences
WHERE name IN ('picture_sizes','num_picture_fields','server_path_to_http','picture_directory')";

Ya da belki de bir tercih değeri döndürmek için saklı bir işlevi oluşturmak; Örneğin, böyle bir saklı işlevi kullanarak:

DELIMITER $$

CREATE FUNCTION `getPreference` (p_name VARCHAR(50)) RETURNS VARCHAR(200)
BEGIN
  RETURN (SELECT `value` FROM preferences WHERE `name` = p_name);
END $$

DELIMITER ;

Böyle bir sorgu kullanarak tercihlerinizi alabilir:

SELECT getPreference('server_path_to_http')

Sen tercihleri ​​(tabii ki) sabit kodlanmış kalmadan hızının biraz fedakarlık. Ama varsayılan tercihlerini değiştirmek için bir "site yöneticisi" etkinleştirmek için planlıyorsanız - Eğer veritabanında onları tutmak gerekir.

Benim uygulamada, ben bu yapıyı kullanabilirsiniz:

CREATE TABLE `general_settings` (
  `setting_key` varchar(255) NOT NULL,
  `setting_group` varchar(255) NOT NULL DEFAULT 'general',
  `setting_label` varchar(255) DEFAULT NULL,
  `setting_type` enum('text','integer','float','textarea','select','radio','checkbox') NOT NULL DEFAULT 'text',
  `setting_value` text NOT NULL,
  `setting_options` varchar(255) DEFAULT NULL,
  `setting_weight` int(11) DEFAULT '0',
  PRIMARY KEY (`setting_key`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Örnek veri:

mysql> select * from general_settings;
+-----------------------------+---------------+------------------------------+--------------+-------------------------------+---------------------------------------+----------------+
| setting_key                 | setting_group | setting_label                | setting_type | setting_value                 | setting_options                       | setting_weight |
+-----------------------------+---------------+------------------------------+--------------+-------------------------------+---------------------------------------+----------------+
| website_name                | website       | Website Name                 | text         | s:6:"DeenTV";                 | NULL                                  |              1 | 

I setting_value sütununda bir tefrika değer depolamak. Ben veritabanı ayarları kaydetmek için wordpress yoldan bu hile var.

setting_options sütun a select, radio için kullanılır, ya da checkbox setting_type. Bu tefrika dizi değer içerecektir. Admin, bu değer bir seçenek olarak görüntülenir, böylece yönetici bunun birini seçebilirsiniz.

Ben CodeIgniter'ı kullanmak beri, özellikle setting_key tek bir değer elde etmek için bir model var, bu yüzden kullanımı oldukça kolaydır.

Ben senin gibi özellikle yapılandırması küçük miktarlarda, mükemmel kabul edilebilir bir yapı olduğunu düşünüyorum.

Ayrıca, bir .ini dosya ve çağrı bu ayarları saklamak olabilir parse_ini_file. Eğer INI verir biraz daha esneklik (örn: iç içe diziler, vb) gerekiyorsa, o zaman sadece bir .php dosyasına hepsini koymak ve o içerebilir.

Eğer hala veritabanında yapılandırma ile gitmek istiyorsanız, o zaman belki de sadece tek bir seferde ve önbellek bunu tüm kayıtları okumak (satır sadece bir avuç orada verilen).

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

Ben dahil bir dosyası ile devam size daha fazla biraz güçlük tasarruf edeceğini düşünürdüm - Hiç değişkenlerden biri olarak bir dizi eklemek istiyorum özellikle. Bunu db sonra belki de daha iyi anında yapılandırma değişkenlerini değiştirme planı, ama onun görece statik kalmaya devam edersem 'config.php' dosyası tavsiye ediyorum

Örneğin dahil uygulamaları, bir çok Wordpress, serileştirme ve unserialization faydalanmak. Bu (proje (ler) için bir SITE_ID ile örneğin) bile sadece tek bir kayıt ile belki de çok basit bir tablo yapısını oluşturmak için olanak sağlar.

Dizideki tüm (pek çok) değişken bir dize için seri ve saklanır. Sonra zorlama ve geri dizi yapısı dizgilenmemiş.

Pro: You don't have to plan perfect config structures beforehand, doing lots of ALTER TABLE stuff.

Con: You can't search through your serialized array structure by means of SQL.

Komutları:

string serialize  ( mixed $value  )
mixed unserialize  ( string $str  )

Lütfen nesneler ile de çalışır. Bir nesneyi Unserializing __ başlatmada () yöntemi yararlanabilirler.

Sadece yapılandırma sınıf oluşturmak ve sınıf değişkeni istediğiniz her değer depolamak.

aradığını tüm dosyalar bu sınıfını içerir.

Artık tüm dosyaları bu sınıf erişebilir ve tüm fonksiyonlarda küresel bildirerek configure sınıfını erişebilirsiniz.

Umarım bu yardımcı olur.