bindParam 读写一个class的私有成员变量
bindParam literate through private member variable of a class
我创建了一个名为 User
的 class,只有私有成员变量和 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
时,它也显示运行时严格警告,插入代码为 bindParam
行生成警告 strict standards only variables should be passed by reference
.问了google后,我发现显然我必须分两步来做:
$id = $user->get_id()
$stmt->bindParam(':id', $id);
将它们转换为新格式后,一切正常,没有任何警告。
问题是,我原来的 User-class
比 20 个私有成员变量要大得多,而且我还有其他类似的 class。所以我在考虑遍历变量并将它们保存在一个数组中,然后 bindParam
它们作为数组。但是后来我遇到了 foreach
只循环遍历 public 变量而不是私有变量的问题......所以我现在的问题是:
- 是否可以将
bindParam
与循环结合起来?
- 如果是,我如何遍历私有成员变量并保存它们?
为了方便起见,我到处都使用相同的命名格式。即数据库中具有 firstname
的列将在 User-class
中具有对应的 m_firstname
与 get_firstname()
和 set_firstname($firstname)
作为 getter/setter
我认为你应该使用
public bool PDOStatement::bindValue ( mixed $parameter , mixed $value [, int $data_type = PDO::PARAM_STR ] )
而不是 bindParam() 并保留你的 getters :)
已从评论移至回答
我创建了一个名为 User
的 class,只有私有成员变量和 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
时,它也显示运行时严格警告,插入代码为 bindParam
行生成警告 strict standards only variables should be passed by reference
.问了google后,我发现显然我必须分两步来做:
$id = $user->get_id()
$stmt->bindParam(':id', $id);
将它们转换为新格式后,一切正常,没有任何警告。
问题是,我原来的 User-class
比 20 个私有成员变量要大得多,而且我还有其他类似的 class。所以我在考虑遍历变量并将它们保存在一个数组中,然后 bindParam
它们作为数组。但是后来我遇到了 foreach
只循环遍历 public 变量而不是私有变量的问题......所以我现在的问题是:
- 是否可以将
bindParam
与循环结合起来? - 如果是,我如何遍历私有成员变量并保存它们?
为了方便起见,我到处都使用相同的命名格式。即数据库中具有 firstname
的列将在 User-class
中具有对应的 m_firstname
与 get_firstname()
和 set_firstname($firstname)
作为 getter/setter
我认为你应该使用
public bool PDOStatement::bindValue ( mixed $parameter , mixed $value [, int $data_type = PDO::PARAM_STR ] )
而不是 bindParam() 并保留你的 getters :)
已从评论移至回答