bindParam通过类

时间:2016-02-26 09:19:54

标签: php pdo private-members bindparam

我创建了一个名为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。在问谷歌之后,我发现显然我必须分两步完成:

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

将它们转换为新格式后,一切都可以正常运行。

问题是,我的原始User-class更大,有超过20个私有成员变量,我还有其他这样的类。所以我在思考迭代变量并将它们保存在一个数组中,bindParam将它们作为数组。但后来我面临的问题是foreach只绕过公共变量,而不是私有变量......所以现在我的问题是:

  1. 是否有可能以某种方式将bindParam与循环结合起来?
  2. 如果是,我如何循环访问私有成员变量并保存它们?
  3. 为方便起见我到处使用相同的命名格式。即firstname数据库中的列将m_firstname中的对应User-classget_firstname()set_firstname($firstname)作为getter / setter

1 个答案:

答案 0 :(得分:1)

我认为你应该使用
public bool PDOStatement::bindValue ( mixed $parameter , mixed $value [, int $data_type = PDO::PARAM_STR ] )
而不是 bindParam()并保持你的getter:)

从评论转到回答