2
class Users
{
    function inWork($uid) 
    {
        $q = 'SELECT in_work FROM user_activity WHERE user_id=? LIMIT 1';

        $stmt = $this->pdo->prepare($q);
        $params = array($uid);
        $count = $stmt->execute($params);

        $row = $stmt->fetch(PDO::FETCH_ASSOC);

        if($row['in_work'] == 0){
            $status = 'Not Working';
        } elseif($row['in_work'] == 1){
            $status = 'Working';
        }

        return $status;
    }

}

class Call_log extends Users
{
    function getUserCalls($uid)
    {
        print $this->inWork($uid);
    }
}

$call_log = new Call_log;
print $call_log->inWork(n); 

つまり、データベースからの整数値に基づいて「動作中」または「動作していません」と表示されます。

内部から同じメソッドを呼び出すと、Call_log正しく動作しないか、予期しない結果が得られます。

メソッドは「動作していません」のみを出力しますか?

私の Call_log クラスはユーザーからすべてのメソッドを継承しているのでinWork($uid)、内部からの呼び出しgetUserCalls($uid)は問題になりませんか? または、少なくとも私はそう思いました。

バックグラウンド:

SELECT in_work FROM user_activity WHERE user_id=32 LIMIT 1;
+---------+
| in_work |
+---------+
|       1 |
+---------+

SELECT in_work FROM user_activity WHERE user_id=2 LIMIT 1;
+---------+
| in_work |
+---------+
|       0 |
+---------+

編集:長いバージョン:

function getUserCalls($uid){

    $stmt = $this->pdo->prepare("CALL select_calls_by_extn(?)");
    $stmt->bindParam(1, $uid, PDO::PARAM_INT, 5);
    $stmt->setFetchMode(PDO::FETCH_ASSOC);
    $stmt->execute();

    $rows = $stmt->fetchAll();

    if(!$rows){
        throw new Exception('We couldn\'t find any records for that name.');
    }

    foreach ($rows as $row){

        if($row['in_work'] == 0){
            $status = 'Not Working';
        } elseif($row['in_work'] == 1){
            $status = 'Working';
        }   

        //$status = $this->inWork($uid);


        print '<tr><td>'.$row['ext_num'].'</td><td>'.$row['username'].'</td><td>'.$status.'</td><td>'.$row['avg_in'].'</td><td>'.$row['avg_out'].'</td><td>'.$row['calls_in'].'</td><td>'.$row['calls_out']."</td></tr>\n";
    }
}

「コメントアウトされた」$status変数が継承を使用して値を取り、コードの重複を削減することを望んでいました。

4

1 に答える 1

0

あなたは正しい概念を持っています。inWork内部からの呼び出しgetUserCallsは完全に有効です。クエリ/ストアド関数が問題ではないことを確認するには、2 つの異なる値をハードコーディングしてから、メソッドを実行して正しい結果が得られるかどうかをテストすることをお勧めします。

class Users
{
    function inWork($uid) 
    {
        // instead of getting data from the database, let's force the data 
        // to look as if the database has provided us the data. 
        // If user id 32 is passed, flag staticData to 1
        $staticData = ($uid === 32) ? 1 : 0;
        $row = array('in_work'=>$staticData);

        if($row['in_work'] == 0){
            $status = 'Not Working';
        } elseif($row['in_work'] == 1){
            $status = 'Working';
        }

        return $status;
    }
}


class CallLog extends Users
{
    function getUserCalls($uid)
    {
        echo $this->inWork($uid);
    }
}


$callLog = new CallLog();
print $callLog->inWork(2); // Should print Not Working
print $callLog->getUserCalls(2); // Should print Not working

print $callLog->inWork(32); // Should print Working
print $callLog->getUserCalls(32); // Should print working

使用した 2 つの異なるステートメントでavar_dumpまたはprint_ronを実行して、アプリケーションをデバッグします。$rows

  1. select .... from ....、 と
  2. CALL select_calls_by_extn

同一の結果が得られるはずです。var_dump の結果により、変数で何が起こっているか、また SQL の結果が実際の問題であるかどうかを確認できます。

私が読んだ限りでは、あなたの遺伝理論は大丈夫です。

于 2013-09-04T17:48:20.033 に答える