2014-01-17 44 views
-1

我正在做一个测试朋友送我来测试我的PHP技能 - 但我已经打了一堵墙。我需要能够在插入记录后用新的细节更新数据库。这完全是通过脚本完成的 - 没有GUI。PHP更新数据库中的字段 - 1行停止更新字段

下面是代码:

<?php 
class UserModel { 
public $name = null, $occupation = null, $email = null, $oldname = null,  $oldoccupation = null, $oldemail = null, $me, $handler, $result; 

public function __construct(){ 
    try{ 
     $this->handler = new PDO('mysql:host=127.0.0.1;dbname=lab19', 'root', 'root'); 
     $this->handler->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    } catch (PDOException $e) { 
     echo $e->getMessage(); 
     die(); 
    } 
} 

public function create($fields = array()){ 
    if(count($fields) == 3){ 
     $this->name = $fields['name']; 
     $this->occupation = $fields['occupation']; 
     $this->email = $fields['email']; 
    } 

} 

public function _save(){ 
    if($this->oldname == null && $this->oldoccupation == null && $this->oldemail == null){ 
     $sql = "INSERT INTO users (name, occupation, email) VALUES (:name, :occupation, :email)"; 
     $this->result = $this->handler->prepare($sql); 
     $this->result->execute(array(
      ':name'=>$this->name, 
      ':occupation'=>$this->occupation, 
      ':email'=>$this->email 
     )); 
    } else { 
     $sql = "UPDATE users SET name = :name, occupation = :occupation, email = :email WHERE name = :oldname"; 
     $this->result = $this->handler->prepare($sql); 
     $this->result->execute(array(
      ':name'=>$this->name, 
      ':occupation'=>$this->occupation, 
      ':email'=>$this->email, 
      ':oldname'=>$this->oldname 
     )); 
    } 
} 

public function name($given_name = null) { 
    if($this->name == null){ 
     if($given_name != null){ 
      $this->name = $given_name; 
     } 
    } else { 
     if($given_name != null){ 
      $this->oldname = $this->name; 
      $this->name = $given_name; 
     } 
    } 
    return $this->name; 
} 

public function occupation($given_occupation = null) { 
    if($this->occupation == null){ 
     if($given_occupation != null){ 
      $this->occupation = $given_occupation; 
     } 
    } else { 
     if($given_occupation != null){ 
      $this->oldoccupation = $this->occupation; 
      $this->occupation = $given_occupation; 
     } 
    } 
    return $this->occupation; 
} 

public function email($given_email = null){ 
    $this->verifyEmail($given_email); 
    if($given_email != null){ 
     // $this->oldemail = $this->email; // THIS LINE IS THE ISSUE 
     $this->email = $given_email; 
    } 
    return $this->email; 
} 

public function verifyEmail($givenemail = null){ 
    if($givenemail == null){ 
     $email = $this->email; 
    } else { 
     $email = $givenemail; 

    } 
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { 
     throw new Exception('Email not valid.'); 
     die(); 
    } 

} 
} 

$user = new UserModel(); 
$user->create(array(
'name' => 'Luke', 
'occupation' => 'Programmer', 
'email' => '[email protected]' 
)); 
$user->_save(); 
// $user->name('Jack'); 
// $user->occupation(); 
try { 
$user->email('[email protected]'); 
} catch (Exception $e) { 
echo $e->getMessage(); 
} 
$user->_save(); 

但是,当我在这行$this->oldemail = $this->email;,电子邮件不会在DB改变 - 但我把它拿出来时,一切工作正常。可能是什么问题呢??

回答

0

Where你有oldemail套餐吗?是否在你试图做一个_save之前?如果是这样,你最终可能会对不存在的记录执行UPDATE,而不是INSERT。代码不是很好 - 也许不是试图找出是否执行INSERT或UPDATE,而是简单地执行REPLACE INTO。

+0

'oldemail'设置在最顶端 – user3185528

+0

不,你在哪里做'$ this-> oldemail = $ this-> email;'你说它打破了吗?如果它在执行_save之前,oldemail将不会为空,并且_save将尝试执行UPDATE而不是INSERT。 –

0

你现在拥有它,与$user->name('Jack');$user->occupation();注释掉,$this->oldname$this->oldoccupation的方式永远不会从他们的null初始设置改变。

在您的UPDATE声明中,您的条件为WHERE name = :oldname。由于$this->oldnamenull,您没有更新任何内容。