0

PDOを使用してデータベースに接続し、コーディングでOOPメソッドを使用しています

これは、投稿とコメントを取得する方法です

class MyWeb{
public function SelectStatus($user_id){
        try{
            $DBC = new DBConnector();

            $query = "SELECT * FROM users U, posts P where P.user_id_fk=U.user_id and U.user_id=:user_id_fk";

            $params = array(":user_id_fk"=>$user_id);


            $result = $DBC->SelectArray($query,$params);

            if($result){
                return $result;
            } else throw new Exception("Post not selected!");
        }catch(Exception $e){
            echo "Caught Exception: ".$e->getMessage();
            return null;
        }
    }
public function SelectComment($post_id){
        try{
            $DBC = new DBConnector();

            $query = "SELECT * FROM comments C, users U WHERE C.user_id_fk = U.user_id and C.post_id_fk = :post_id_fk";


            $params = array(":post_id_fk"=>$post_id);

            $result = $DBC->SelectArray($query,$params);

            if($result){
                return $result;
            } else throw new Exception("Comment not selected!");
        }catch(Exception $e){
            echo "Caught Exception: ".$e->getMessage();
            return null;
        }
    }
}

そして、これは関数を呼び出して投稿とコメントを表示する方法です

<?php
        $NewStatus = $session->SelectStatus($user_id);

        if(!empty($NewStatus)){
            foreach($NewStatus as $data){
                $username = $data->username;
                $post = $data->post;
                $post_id = $data->post_id;
                                echo "".$username." | ".$post."";

                               $NewComment = $session->SelectComment($post_id);

                if(!empty($NewComment)){
                    foreach($NewComment as $cdata){
                        echo $cdata->comment;
            }
        }
    }
}
?>

しかし悲しいことに、私は常にエラーが発生します - > Fatal error: Maximum execution time of 30 seconds exceeded in C:\xampp\htdocs\RIO\RIO\RAI\session_rai\includes\db.php on line 14

それで、この場合の解決策はありますか?ありがとう。

4

2 に答える 2

0

クラス構造が間違っています。

  1. DBConnector クラスは必要ありません
  2. 同じ認証情報でデータベースへの複数の接続を作成しない
  3. MyWeb クラスのほとんどのコードも役に立たない

したがって、PDO 接続を作成し、MyWeb クラスをインスタンス化してからデータを取得します。

class MyWeb{

    function __construct($dbc)
    {
        $this->dbc = $dbc;
    }

    public function SelectStatus($user_id)
    {
        $query = "SELECT * FROM users U, posts P 
                      WHERE P.user_id_fk=U.user_id and U.user_id=?";
        $stmt  = $this->dbc->prepare($query);
        $stmt->execute(array($user_id));
        return  $stmt->fetchAll();
    }

    public function SelectComment($post_id)
    {
        $query = "SELECT * FROM comments C, users U 
                      WHERE C.user_id_fk = U.user_id and C.post_id_fk = ?";
        $stmt  = $this->dbc->prepare($query);
        $stmt->execute(array($user_id));
        return  $stmt->fetchAll();
    }
}    

出力と同じ

<?php
$pdo = new PDO(... params);
$myweb = new MyWeb($pdo);
$NewStatus = $myweb->SelectStatus($user_id);
foreach($NewStatus as $row)
{
     echo $row['username']." | ".$row['post'];
     $NewComment = $myweb->SelectComment($post_id);
     foreach($NewComment as $cdata){
         echo $cdata['comment'];
    }
}

または、この方法で関数
を作成する場合selectArray

public function selectArray()
{
    $args = func_get_args();
    $sql  = array_shift($args);
    $stmt  = $this->pdo->prepare($sql);
    $stmt->execute($args);
    return  $stmt->fetchAll();
}

1、2 行節約できます。

public function SelectStatus($user_id)
{
    $query = "SELECT * FROM users U, posts P 
                  WHERE P.user_id_fk=U.user_id and U.user_id=?";
    return  $this->dbc->selectArray($query, $user_id);
}
于 2013-04-27T11:44:22.493 に答える
0

ここに構文エラーがあります

$query = "SELECT * FROM comments C, users U WHERE C.user_id_fk = U.user_id and C.post_id_fk = :post_id_fk";";

あるべきなのに

$query = "SELECT * FROM comments C, users U WHERE C.user_id_fk = U.user_id and C.post_id_fk = :post_id_fk";
于 2013-04-27T11:19:46.033 に答える