1

Userプライベート メンバー変数と getter/setter 関数のみで呼び出されるクラスを作成します

class User {
   private $m_id;
   private $m_firstname;
   private $m_lastname;

   public function get_firstname() { return $this->m_firstnmae; }
   public function set_firstname($firstname) { $this->m_firstname = $firstname; }
   ...
}

だからprint_r($user)私に次のようなものを与えるでしょう:

User Object
(
   [m_id:User:private] => 2725
   [m_firstname:User:private] => Alan
   [m_lastname:User:private] => Turing
)

現在、PDO を使用してオブジェクトをデータベースに挿入しています (問題の一部ではなく機能しているため、接続部分はスキップします)。ここで、データを挿入する私の関数:

function insert($user) 
{
    $insert_query = "insert into table (id,firstname,lastname) values (:id, :firstname, :lastname)";
    try
    {
        $stmt = $this->m_pdo->prepare($insert_query);
        $stmt->bindParam(':id', $user->get_id());
        $stmt->bindParam(':firstname', $user->get_firstname());
        $stmt->bindParam(':lastname', $user->get_lastname());

        $stmt->execute();
        return true;
    }
    catch (PDOException $ex)
    {
        echo $this->m_error_message = $ex->getMessage();
        return false;
    }
}

同様に動作します。ただし、php error_reporting を に変更するとE_ALL | E_STRICT、ランタイムの厳密な警告も表示され、挿入コードによって行の警告strict standards only variables should be passed by referenceが生成されbindParamます。Googleに尋ねたところ、明らかに2つのステップでこれを行う必要があることがわかりました。

$id = $user->get_id()
$stmt->bindParam(':id', $id);

それらを新しい形式に変換した後、すべてが警告なしで機能します。

問題は、私のオリジナルUser-classは20を超えるプライベートメンバー変数ではるかに大きく、このような他のクラスも持っているということです. だから私は変数を繰り返し処理し、それらを配列に保存し、bindParamそれらを配列として保存することを考えていました。しかし、その後foreach、パブリック変数のみをループし、プライベート変数をループしないという問題に直面します...だから私の質問は次のとおりです。

  1. bindParamどういうわけかループと組み合わせることができますか?
  2. もしそうなら、どうすればプライベートメンバー変数をループして保存できますか?

便宜上、どこでも同じ命名形式を使用しています。つまり、 with データベースの列には、withおよびas getter/setterfirstnameに対応するものがありますm_firstnameUser-classget_firstname()set_firstname($firstname)

4

1 に答える 1

1

bindParam()
public bool PDOStatement::bindValue ( mixed $parameter , mixed $value [, int $data_type = PDO::PARAM_STR ] )
の代わりに使用して、ゲッターを保持する必要があると思います:)

コメントから回答に移動

于 2016-02-26T09:55:48.783 に答える