0

OO PHP、MVC、および Doctrine を使用するのはこれが初めてなので、おそらく何か間違ったことをしている可能性があります!! 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:ゲッターとセッターに何か問題がありますか? に置き換えprivatepublic、このように変数値を設定する$tpSuplemento->nmTipo = $_POST['nmTipoSuplemento'];と機能します

4

1 に答える 1

0

問題の 1 つは、列でNM_TIPO_SUPLEMENTOnull 値が許可されていないことです。列にヌルを許可するかどうかを指定しますか?

ここにありますnullable=false

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

null を許可したくない場合は、$nmTipo のエンティティに null 値を渡していないことを確認してください。

null を許可したい場合は、 に変更nullable=falsenullable=trueます。さらに、NM_TIPO_SUPLEMENTO のデータベース テーブルを allow に設定する必要がありますnulls


getter/setter メソッドを機能するように設定する理由は、メソッドを外部publicで使用できないためです。privateプライベート メソッドは、クラスによって内部的にのみ使用できます。それを行っても構文エラーが発生しなかった理由がわかりません。


別の問題は、ゲッター/セッターにあります。あなたはそれを間違って入力しました。次のようになります。

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

小文字に注意してください$this->nmTipo。それは同じではありません$this->NmTipo

于 2013-06-22T00:08:11.763 に答える