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行生成警告。在问了谷歌之后,我发现显然我必须分两步执行此操作:

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

将它们转换为新格式后,一切正常,没有任何警告。

问题是,我的原始User-class文件更大,有 20 多个私有成员变量,而且我还有其他类似的类。所以我在考虑遍历变量并将它们保存在一个数组中,然后将它们保存bindParam为数组。但是后来我面临的问题是foreach只遍历公共变量而不是私有变量......所以我现在的问题是:

  1. 是否可以以bindParam某种方式与循环结合?
  2. 如果是,我如何遍历私有成员变量并保存它们?

为方便起见,我在任何地方都使用相同的命名格式。即数据库中的列 withfirstnamem_firstnameUser-classwithget_firstname()set_firstname($firstname)作为 getter/setter中具有对应项

4

1 回答 1

1

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

从评论转移到回答

于 2016-02-26T09:55:48.783 回答