, так как я обновляю 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, и сейчас это совершенно потрясающе.
Может кто-нибудь дать мне толчок в правильном направлении, как это решить.
Справка действительно оценили.
Заранее спасибо
Марк
Я не знаю, почему вы переезжаете в PDO, но если SQL Injection звучит знакомо вам, ваш оператор обновления уязвим. Предположим, что вы динамически составляете свой оператор «UPDATE links SET field1 =: value1, field2 =: value2», затем подготовьте инструкцию, bindParams и выполните. – PauloASilva
Я перемещаюсь, потому что mysql_ будет устаревшим, спасибо за ваше предложение. – Mark
Вы должны переместить свой вызов 'header' на контроллер ... он не принадлежит вашей модели. – prodigitalson