2016-02-26 20 views
1

我創建了一個只有私有成員變量和getter/setter函數稱爲User類的私有成員變量bindParam識字通過類

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。問谷歌之後,我發現,很明顯,我必須這樣做2個步驟:

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

它們轉換成新的格式後,一切正常,沒有任何警告。

事情是,我的原始User-class比20個私人成員變量更大,我也有其他類。所以我在想迭代變量並將它們保存在一個數組中,並將它們作爲數組。但後來我面臨的問題foreach只能通過公共變量循環,但不是私人的...所以我的問題,現在:

  1. 是有可能bindParam與循環莫名其妙結合?
  2. 如果是這樣,我怎樣才能循環訪問私有成員變量並保存它們?

爲了方便,我在每個地方都使用相同的命名格式。即在數據庫中列有firstname必須在User-class對方m_firstnameget_firstname()set_firstname($firstname)作爲的getter/setter

+2

我認爲你應該使用'公共BOOL PDOStatement對象::雙ndValue(mixed $ parameter,mixed $ value [,int $ data_type = PDO :: PARAM_STR])'而不是** bindParam **,並保持你的getters ... –

+0

只需使用'bindValue' –

回答

1

我認爲你應該使用
public bool PDOStatement::bindValue (mixed $parameter , mixed $value [, int $data_type = PDO::PARAM_STR ])
而不是bindParam(),並保持你的干將:)

從評論搬到回答

+0

thx,猜這是最簡單的方法來做到這一點 – yangsunny