我创建了一个名为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
只绕过公共变量,而不是私有变量......所以现在我的问题是:
bindParam
与循环结合起来?为方便起见我到处使用相同的命名格式。即firstname
数据库中的列将m_firstname
中的对应User-class
与get_firstname()
和set_firstname($firstname)
作为getter / setter
答案 0 :(得分:1)
我认为你应该使用
public bool PDOStatement::bindValue ( mixed $parameter , mixed $value [, int $data_type = PDO::PARAM_STR ] )
而不是 bindParam()并保持你的getter:)
从评论转到回答