2015-01-27 2 views
0

, так как я обновляю PHP до PHP 5.5 на своем сервере, я хочу переписать один проект с использованием PDO вместо mysql_. В этом проекте у меня есть контроллер и Modell (естественно, с точки зрения, но это не важно :-)) В «старой» версии кода lookes так:mysql_ -> PDO | Как я могу достичь того же результата

контроллера (mysql_)

public function saveAction() 
{ 
    $iFilterID = filter_input(INPUT_POST, 'id'); 
    $this->_setRealEscape($iFilterID); 
    $iReqID = $this->_getRealEscape(); 
    if (isset($_REQUEST['aLinks'])) 
    { 
     $this->oSubCat = new links(); 
     if (isset($iFilterID)) 
     { 
      $this->oSubCat->loadLinksID($iReqID); 
     } 
     foreach ($_REQUEST['aLinks'] AS $key => $value) 
     { 
      $value = $this->_cleanString($value); 

      $this->oSubCat->$key = $value; 
     } 
    } 
    $this->oSubCat->saveLinks(); 


} 

модель (mysql_)

public function loadLinksID($id) 
{ 
    $sSql = "SELECT * FROM links WHERE id =".$id; 
    $query = mysql_query($sSql); 
    $oLinks = mysql_fetch_object($query); 
    if(is_object($oLinks)) 
    { 
     foreach ($oLinks as $key => $value) 
     { 
      $this->$key = $value; 
     } 
    } 

} 

public function saveLinks() 
{ 
    if ($this->id) 
    { 

     $this->updateLinks(); 
    } 
    else 
    { 
     $this->insertLinks(); 
    } 
} 

public function updateLinks() 
{ 
    $sSql = "UPDATE links SET"; 
    $first = true; 
    foreach ($this as $property => $value) { 
     if ($first) { 
      $first = false; 
      $sSql .= " $property='$value'"; 
     } else { 
      $sSql .= ", $property='$value'"; 
     } 
    } 
    $sSql .= " WHERE id = ".$this->id; 
    mysql_query($sSql); 
    header("location: index.php?module=helper&action=success&func=links"); 
} 

В PDO-версии выглядит следующим образом:

контроллер (PDO)

public function saveAction() 
{ 
    $iFilterID = filter_input(INPUT_POST, 'id'); 
    if (isset($_REQUEST['aLinks'])) 
    { 
     $this->oSubCat = new links(); 
     if (isset($iFilterID)) 
     { 
      $this->oSubCat->loadLinksID($iFilterID); 
     } 
     foreach ($_REQUEST['aLinks'] AS $key => $value) 
     { 
      $this->oSubCat->$key = $value; 
     } 
    } 
    $this->oSubCat->saveLinks(); 


} 

модель (PDO)

public function loadLinksID($id) 
{ 
    $PDOpre = $this->connection->prepare("SELECT * FROM links WHERE id =:id"); 
    $PDOpre->bindvalue(':id',$id, PDO::PARAM_STR); 
    $PDOpre->execute(); 
    $oLinks = $PDOpre->fetch(PDO::FETCH_OBJ); 

    if(is_object($oLinks)) 
    { 
     foreach ($oLinks as $key => $value) 
     { 
      $this->$key = $value; 
     } 
    } 

} 

public function saveLinks() 
{ 
    if ($this->id) 
    { 

     $this->updateLinks(); 
    } 
    else 
    { 
     $this->insertLinks(); 
    } 
} 

public function updateLinks() 
{ 
    $sSql = "UPDATE links SET"; 
    $first = true; 
    foreach ($this as $property => $value) { 
     if ($first) { 
      $first = false; 
      $sSql .= " $property='$value'"; 
     } else { 
      $sSql .= ", $property='$value'"; 
     } 
    } 
    $sSql .= " WHERE id = ".$this->id; 
    echo $sSql; 
    $this->connection->query($sSql); 
    header("location: index.php?module=helper&action=success&func=links"); 
} 

mysql_-версия работает нормально, но PDO-версия показывает:

Catchable fatal error: Object of class PDO could not be converted to string in /.../httpdoc/new/model/class.links.php on line 61

Line 61 = $sSql .= " $property='$value'"; в публичной функции updateLin ks()

Я совершенно новичок в PDO, и сейчас это совершенно потрясающе.

Может кто-нибудь дать мне толчок в правильном направлении, как это решить.

Справка действительно оценили.

Заранее спасибо

Марк

+0

Я не знаю, почему вы переезжаете в PDO, но если SQL Injection звучит знакомо вам, ваш оператор обновления уязвим. Предположим, что вы динамически составляете свой оператор «UPDATE links SET field1 =: value1, field2 =: value2», затем подготовьте инструкцию, bindParams и выполните. – PauloASilva

+0

Я перемещаюсь, потому что mysql_ будет устаревшим, спасибо за ваше предложение. – Mark

+0

Вы должны переместить свой вызов 'header' на контроллер ... он не принадлежит вашей модели. – prodigitalson

ответ

0

Я изменил свой код, используя этот Answer. Он использует ленивую привязку. PDO Info

public function updateLinks() 
{ 
    $query_params = array();Array to hold parameters for lazy binding 
    $sSql = "UPDATE links SET"; 
    $first = true; 
    foreach ($this as $property => $value) { 
     if ($first) { 
      $sSql .= " $property=?"; 
      $first = false;//Set after first 

     } else { 
      $sSql .= ", $property =?"; 
     } 
    array_push($query_params,$value);//Push values into array 
    } 
    array_push($query_params,$this->id); 
    $sSql .= " WHERE id = ?"; 
    echo $sSql; 
    $stmt = $this->connection->prepare($sSql); 
    $result = $stmt->execute($query_params); 

    header("location: index.php?module=helper&action=success&func=links"); 
} 
+0

Большое спасибо за вашу помощь. Это очень помогает. Это не помогает с _Catchable фатальной ошибкой: объект класса PDO не может быть преобразован в строку в /.../httpdoc/new/model/class.links.php в строке 6_, но я думаю, что я понял, почему я получаю это :-) – Mark

Смежные вопросы