【问题标题】:bindParam literate through private member variable of a classbindParam 通过类的私有成员变量读写
【发布时间】:2016-02-26 09:19:54
【问题描述】:

我创建了一个名为 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(也显示运行时严格警告)时,插入代码会为 bindParam 行生成警告 strict standards only variables should be passed by reference。问了谷歌后,我发现显然我必须分两步完成:

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

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

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

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

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

【问题讨论】:

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

标签: php pdo private-members bindparam


【解决方案1】:

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

从评论转到回答

【讨论】:

  • 该方法仅适用于插入,不适用于更新。这怎么可能 ?任何在指定数据类型时使用它事件的尝试都会导致数据库中没有任何更新。我正在使用 sqlsrv pdo。有什么想法吗?
猜你喜欢
  • 2015-11-15
  • 2016-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-15
相关资源
最近更新 更多