1

mysql に保存されているいくつかのオプションがあります。テーブルには、次のような 4 つの列が含まれています。

option_id | option_name | option_default | option_user_value
------------------------------------------------------------
1         | timezone    | Europe/Athens  |
2         | mode        | 1              |
3         | email       | test@test.test |

これまでのところ、次のphpコードのようなものを使用してデータベースからその情報を取得しています:

$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()関数もチェックしてください。私はまだ学習中です (まだ OO に慣れていません)。よろしくお願いします。良い1日を。

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

2 に答える 2

1

DB接続でその関数を呼び出すたびに、データベースへの接続を開き、クエリを実行して閉じます...これにより、SQLサーバーとPHP/MySQLコネクタに多くのオーバーヘッドが発生します。多くのクエリがある場合、サーバーのリソースが不足する可能性があります。それを配列にプルして、次のように 1 つの DB 接続と 1 つのクエリのみを使用するようにします。

<?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
    }

}

?>
于 2013-03-21T16:40:43.297 に答える
0

個々の変数( 、、など)$option_defaultsの代わりに、たとえばと呼ばれる配列を使用し、関連付けられた値としてキーとして使用して、その配列にエントリを追加します。$_timezone$_mode$_email$db_entry['option_name']$db_entry['option_default']

于 2013-03-21T16:48:33.660 に答える