2013-06-21 71 views
0

這是我第一次使用OO PHP,MVC和Doctrine,所以我可能做了一些非常錯誤的事情! 我試圖對象保存到使用Doctrine數據庫,問題是該對象是completaly空PHP - Doctrine設置null爲變量

這是錯誤PHP返回我:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'NM_TIPO_SUPLEMENTO' cannot be null' in C:\Users\Alexandre\apache\workspace\projetoPeso\vendor\doctrine\dbal\lib\Doctrine\DBAL\Statement.php:138 Stack trace: #0 C:\Users\Alexandre\apache\workspace\projetoPeso\vendor\doctrine\dbal\lib\Doctrine\DBAL\Statement.php(138): PDOStatement->execute(NULL) #1 C:\Users\Alexandre\apache\workspace\projetoPeso\vendor\doctrine\orm\lib\Doctrine\ORM\Persisters\BasicEntityPersister.php(278): Doctrine\DBAL\Statement->execute() #2 C:\Users\Alexandre\apache\workspace\projetoPeso\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php(929): Doctrine\ORM\Persisters\BasicEntityPersister->executeInserts() #3 C:\Users\Alexandre\apache\workspace\projetoPeso\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php(318): Doctrine\ORM\UnitOfWork->executeInserts(Object(Doctrine\ORM\Mapping\ClassMetadata)) #4 C:\Users\Alexandre\apache\workspace\projetoPeso\vendor\doctrine\orm\lib\Doctrine\ORM\E in C:\Users\Alexandre\apache\workspace\projetoPeso\vendor\doctrine\dbal\lib\Doctrine\DBAL\DBALException.php on line 47 

我知道我做的映射正確,因爲如果我改變我的模型中的列的名稱,它說我的列不存在

這是我的模型:

<?php 
/** 
* @Entity @Table(name="tb_tipo_suplemento") 
**/ 
class TipoSuplemento { 

    /** @Id @Column(type="integer", name="ID_TIPO_SUPLEMENTO") @GeneratedValue(strategy="IDENTITY") **/ 
    protected $idTipo; 
    /** @Column(type="string", name="NM_TIPO_SUPLEMENTO", nullable=false) **/ 
    protected $nmTipo; 

    public function setIdTipo($idTipo) { 
     $this->idTipo = $idTipo; 
    } 
    public function getIdTipo() { 
     return $this->idTipo; 
    } 

    public function setNmTipo($NmTipo) { 
     $this->NmTipo = $NmTipo; 
    } 
    public function getNmTipo() { 
     return $this->NmTipo; 
    } 
} 

?> 

我的控制器:

<?php 
class ctrlTipoSuplemento { 
    public function salvarTipoSuplemento() { 
     require("../model/TipoSuplemento.php"); 
     require_once "../bootstrap.php"; 
     //criar um objeto novo e o preencher 
     $tpSuplemento = new TipoSuplemento(); 
     $tpSuplemento->setNmTipo($_POST['nmTipoSuplemento']); 

     $entityManager->persist($tpSuplemento); 
     $entityManager->flush(); 
    } 
} 
?> 

我view.php

<?php 
require("../util/header.php"); 
require("../util/footer.php"); 
require("../controller/ctrlTipoSuplemento.php"); 
getHeader("Manter Tipo de Suplemento", "Tipo de Suplemento"); 
montarFormulario(); 
?> 

<form action="" method="post"> 
    <input type="text" name="nmTipoSuplemento" required="required" placeholder="Tipo do Suplemento"><br> 
    <button type="submit">Salvar</button> 
</form> 

<?php 

/* 
* Salvar os dados do formulário acima 
*/ 
if ($_SERVER['REQUEST_METHOD'] == 'POST') { 
    $ctrl = new ctrlTipoSuplemento(); 
    $ctrl->salvarTipoSuplemento(); 
} 
terminarFomulario(); 
?> 

<?php getFooter();?> 

和bootstrap.php中

<?php 
// bootstrap.php 
use Doctrine\ORM\Tools\Setup; 
use Doctrine\ORM\EntityManager; 

require_once "vendor/autoload.php"; 

$isDevMode = true; 
$config = Setup::createAnnotationMetadataConfiguration(array(__DIR__."/model"), $isDevMode); 

// database configuration parameters 
$conn = array(
     'driver' => 'pdo_mysql', 
     'user'  => 'root', 
     'password' => '', 
     'dbname' => 'suplementos', 
); 

$entityManager = EntityManager::create($conn, $config); 

我的表:

CREATE TABLE IF NOT EXISTS `tb_tipo_suplemento` (
    `ID_TIPO_SUPLEMENTO` int(10) NOT NULL AUTO_INCREMENT, 
    `NM_TIPO_SUPLEMENTO` varchar(100) NOT NULL, 
    PRIMARY KEY (`ID_TIPO_SUPLEMENTO`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

太謝謝你了!

編輯1:新增view.php
編輯2:是不是有什麼毛病getter和setter方法?如果我通過public更換private,並設置變量值這樣$tpSuplemento->nmTipo = $_POST['nmTipoSuplemento'];它的工作原理

+0

我錯過了什麼或者是你的'$ _POST ['nmTipoSuplemento']'只是'null'?您將該列定義爲不可空。錯誤表明你正試圖向該列中插入一個「null」值。你可以檢查'$ _POST'變量的內容嗎? –

+0

它不是空的,有一個HTML表單設置它的值,如果我'echo'它的值,它顯示了我在表單中輸入的內容,所以我非常肯定'$ _POST ['nmTipoSuplemento']'是not null,我將view.php添加到問題 –

+0

您能否獲得您的教義查詢生成的實際SQL查詢?你可以從doctrine對象或sql日誌中獲得它。 –

回答

0

一個問題,我看到的是你的列NM_TIPO_SUPLEMENTO不允許空值。你想讓你的專欄允許或不是?

這裏有nullable=false

/** @Column(type="string", name="NM_TIPO_SUPLEMENTO", nullable=false) **/ 
protected $nmTipo; 

如果你不想允許空值,請確保你是不是在傳遞一個空值到您的$ nmTipo實體。

如果您確實想要允許空值,請將nullable=false更改爲nullable=true。此外,您需要將NM_TIPO_SUPLEMENTO的數據庫表設置爲允許nulls


的原因,你的getter/setter方法設置爲public作品是因爲你不能使用private方法外部。私人方法只能由班級在內部使用。我不知道爲什麼你沒有得到這樣做的語法錯誤。


另一個問題是在你的getter/setter中。你輸錯了。它應該看起來像這樣:

public function setNmTipo($NmTipo) { 
    $this->nmTipo = $NmTipo; 
} 
public function getNmTipo() { 
    return $this->nmTipo; 
} 

請注意小寫$this->nmTipo。這不是一樣的$this->NmTipo

+0

我確實希望它不能爲空..問題真的是大寫的N,非常感謝,現在正在工作! –