Php 通过类的私有成员变量读取bindParam
我创建了一个名为Php 通过类的私有成员变量读取bindParam,php,pdo,private-members,bindparam,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
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,只有变量应该通过引用传递给bindParam
行。询问谷歌后,我发现显然我必须分两步来完成这项工作:
$id = $user->get_id()
$stmt->bindParam(':id', $id);
将它们转换为新格式后,一切都可以正常工作,没有任何警告
问题是,我原来的用户类
更大,有20多个私有成员变量,我还有其他类似的类。所以我想迭代变量并将它们保存在一个数组中,然后bindParam
将它们保存为数组。但是我面临的问题是,foreach
只循环公共变量,而不循环私有变量。。。所以我现在的问题是:
是否可以以某种方式将bindParam
与循环组合
如果是,如何循环私有成员变量并保存它们
为了方便起见,我在任何地方都使用相同的命名格式。i、 e.数据库中使用firstname
的列将在用户类中使用get\u firstname()
和set\u firstname($firstname)
作为getter/setter的对应项m\u firstname
,我认为您应该使用
public bool PDOStatement::bindValue(混合$parameter,混合$value[,int$data\u type=PDO::PARAM\u STR])
而不是bindParam(),并保留getter:)
从注释转移到回答我认为你应该使用public bool语句::bindValue(mixed$parameter,mixed$value[,int$data\u type=PDO::PARAM\u STR])
而不是bindParam,并保留你的getter…只需使用bindValue
该方法仅适用于插入,不适用于更新。这怎么可能?在指定数据类型时尝试使用it事件不会导致数据库中的任何更新。我正在使用sqlsrv pdo。有什么想法吗?