2013-03-21 42 views
1

我有一些選項存儲在mysql中。 表包含4列看起來像這樣:在PHP foreach循環中從mysql中獲取數據的有效方法

option_id | option_name | option_default | option_user_value 
------------------------------------------------------------ 
1   | timezone | Europe/Athens | 
2   | mode  | 1    | 
3   | email  | [email protected] | 

到目前爲止,我使用類似下面的PHP代碼從DB獲得這些信息:

$table = 'options'; 
$values = ' 
    option_name, 
    option_default, 
    option_user_value 
'; 
$where = null; 
$options = get_db_entries($table, $values, $where); 

if ($options) 
{ 
    foreach ($options as $db_entry) 
    { 
     if ($db_entry['option_name'] == 'timezone') 
     { $_timezone = $db_entry['option_default']; } 

     if ($db_entry['option_name'] == 'mode') 
     { $_mode = $db_entry['option_default']; } 

     if ($db_entry['option_name'] == 'email') 
     { $_email = $db_entry['option_default']; } 
    } 
} 

有沒有更有效的方法,以避免循環中的那些'if'語句? 我的意思是有沒有辦法將這些信息從那些列直接插入到沒有IF的每個變量?

只是出於好奇,請檢查我的get_db_entries()功能,如果你想。 我還在學習(不熟悉面向對象),並提前致謝。 祝您有愉快的一天。

function get_db_entries($table, $values, $where) 
{ 
    $db_host = '........'; 
    $db_name = '........'; 
    $db_user = '........'; 
    $db_pass = '........'; 
    // ----------------------------------------------------- 
    $dbh = new PDO(
     'mysql:host='.$db_host.'; dbname='.$db_name, 
     $db_user, 
     $db_pass, 
     array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8") 
    ); 
    // ----------------------------------------------------- 
    if ($where) { $where = ' WHERE '.$where; } 

    $sql = 'SELECT '.$values.' FROM '.$table.$where; 
    $results = $dbh->query($sql); 
    // ----------------------------------------------------- 
    $results_array = array(); 
    foreach ($results as $db_entry) 
    { array_push($results_array, $db_entry); } 

    return $results_array; 
} 
+1

每次進行數據庫查詢時都不要重新創建數據庫句柄。而不是「如果 - 然後」你的循環死亡,爲什麼不把表結果放入數組? – Crontab 2013-03-21 16:35:36

+0

你是什麼意思「重新創建你的數據庫句柄」?如果你能解釋一下,我該怎麼做這個錯誤?另外,如果你檢查函數,它已經返回一個數組(檢查結束時檢查)。 – durduvakis 2013-03-21 16:40:40

+1

有關我的意思,請參閱cpattersonv1的答案。 – Crontab 2013-03-21 18:08:44

回答

1

每次你打電話跟你打開,查詢和關閉數據庫的連接數據庫連接是功能......這將導致SQL服務器和PHP/MySQL的連接器上的大量開銷。如果有很多查詢,可以運行服務器。它拉成陣列,使得僅使用一個DB連接和一個查詢是這樣的:

<?php 
$sql = "select * from database.table;"; 
$result = mysql_query($sql); 
while ($db_entry = mysql_fetch_array($result)){ 

    if ($db_entry['option_name'] == 'timezone') 
    { $_timezone = $db_entry['option_default']; } 

    if ($db_entry['option_name'] == 'mode') 
    { $_mode = $db_entry['option_default']; } 

    if ($db_entry['option_name'] == 'email') 
    { $_email = $db_entry['option_default']; } 

} 
?> 

實施例與PDO(未測試):

<?php 
try { 
$DBH = new PDO("mssql:host=$host;dbname=$dbname, $user, $pass");  
} 
catch(PDOException $e) { 
    echo $e->getMessage(); 
} 

$STH = $DBH->query('select * from database.table'); 

$STH->setFetchMode(PDO::FETCH_OBJ); 

while($row = $STH->fetch()) { 

    switch($row->option_name){ 
    case 'mode': 
    $_mode = $row->option_default; 
    break; 
    case 'email': 
    $_email = $row->option_default; 
    break; 
    case 'timezone': 
    //timezone 
    $_timezone = $row->option_default; 
    default: 
    //do something else 
    } 

} 

?> 
+0

謝謝,我明白了,但我可以使用PDO來做到這一點嗎?我爲它做了一個函數,以便每次使用更少的代碼等。 – durduvakis 2013-03-21 16:47:44

+0

感謝我現在正在嘗試使用它(您的PDO示例)。 – durduvakis 2013-03-21 17:14:37

0

使用數組,稱爲$option_defaults例如,代替的個人變量($_timezone,$_mode,$_email等),並使用$db_entry['option_name']作爲關鍵字將$db_entry['option_default']作爲關聯值向其添加條目。

+0

好主意。雖然'$ options'已經是一個數組,我認爲有一種更好的方式可以直接從數組中獲取數據,而不是我上面的數據。現在我正在嘗試你的解決方案。 – durduvakis 2013-03-21 16:57:21