2010-03-28 5 views
3

현재 내 스크립트 설정은 모두 내가 포함하는 PHP 파일에 있습니다. 나는 이러한 설정 (약 100)을 '설정'이라는 데이터베이스 테이블로 이동하는 중입니다. 그러나 나는 그들 모두를 파일로 가져 오는 효율적인 방법을 찾기 위해 고심하고있다.PHP 변수로 많은 수의 데이터베이스 설정을 효율적으로 검색하는 방법은 무엇입니까?

  • ID (autoincrements)
  • 이름

두 예를 들어 행이있을 수 있습니다 :

admin_user   john 
admin_email_address [email protected] 

유일한

설정 테이블은 3 열이 나는 eac을 검색하는 방법을 생각할 수있다. 시간 설정은 다음과 같이이다 :

$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']; 

등 등

이 방법은 코드의 많은을 차지하게됩니다 그 일 가능성 느려집니다.

더 좋은 방법이 있습니까?

+0

실제로, PHP 스크립트로 설정을 저장하는 것이 데이터베이스에서 읽고 파싱하는 것보다 훨씬 빠릅니다. 모든 데이터베이스가 데이터를위한 것이므로 동기를 이해합니다. 그러나이 경우 속도와 구현을 줄일 수 있습니다. PHP는 가상 머신입니다. 스크립트를 포함 시키면 바로 실행됩니다. – amn

+0

데이터베이스에서 PHP로 설정 (용서)을 다시 설정하는 PHP 스크립트를 생성하는 것을 고려해 보셨습니까? 즉, 설정이 자주 변경되지 않거나 매우 예측 가능한 방식으로 설정을 변경하는 경우 이러한 설정은 편의를 위해 데이터베이스에 있습니다. – amn

답변

7

100 설정? 한꺼번에로드하십시오. 그것은 전혀 시간이 걸리지 않을 것입니다. 절대적으로은 한 번에 하나씩로드하지 않으려합니다. 당신은 당신이 그것을 할 필요가 방법에 따라, 어떻게 든 이러한 구획해야하는 경우

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

, 당신은 테이블에 카테고리 또는 무언가를 넣고 단지 특정 범주의 모든 설정을로드 할 수있다. 나는 어떤 종류의 객체 뒤에이 추출되는 제안 무엇

:

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]; 
    } 
} 

이 당신이 시도 될 때까지 설정이로드되지 않습니다 방법 및 액세스 하나

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

100 개의 설정은 데이터베이스에 넣을 가치가 없습니다. 단지''등. – Zarel

+0

데이터베이스에 설정을 넣는 것을 이해할 수 있습니다. 실제로는 문제가 아닙니다. 관리 인터페이스로 변경하는 것이 더 쉽습니다. 100 개의 설정이 실제로 크지 않습니다. cletus가 말했던 것 외에도 캐시 시스템을 중간에 추가하는 것이 좋습니다. 페이지 중 하나가 데이터베이스에 도달 할 필요가 없다는 점을 고려하면 (캐시 ​​된 항목을 사용하지 않거나 캐시 된 항목을 사용하기 때문에) 많은 시간이 걸릴 수 있습니다 (예, 데이터베이스 연결이 느림). – Savageman

1

가 잘 나는 것 그것을 알아 낸합니다 :

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

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

내가 평가를() 사용에 대한 예리한 아니었지만 작동하지만 t 그것이 유일한 방법이라고 생각해라.

많은 호스트가 eval()을 사용할 수 없는지 궁금합니다. 이견있는 사람?

+0

그냥 cletus가 준 코드를 사용하십시오. 또한 어떻게 작동하는지 이해하기 위해 http://stackoverflow.com/faq를 읽는 것을 고려하십시오. – user187291

+0

나는 Cletus의 코드를 다시 한 번 보았다. 고마워. 내 설정이 이미 사용 된 모든 사례를 업데이트한다는 의미로 생각되지만 장기적으로 가치가있을 것이라고 확신합니다. 나는 SO FAQ를 읽을 것이다. – Steven

관련 문제