アルファサード株式会社 代表取締役 野田 純生のブログ


[Memo]PHPからMT経由でMicrosoft SQL ServerにオブジェクトをINSERTする


公開日 : 2013-08-20 20:19:51


メモっとかないとな。普通にやると、

Error Code: 544 Message: [Microsoft][SQL Server Native Client 11.0][SQL Server]Cannot insert explicit value for identity column in table 'mt_entry' when IDENTITY_INSERT is set to OFF. ]

INSERT文に entry_id があると、どうもこいつが出るようで

INSERT INTO mt_entry(entry_id,entry_author_id,...
SET IDENTITY_INSERT mt_entry ON

とすると、今度は

Error Code: 515 Message: [Microsoft][SQL Server Native Client 11.0][SQL Server]Cannot insert the value NULL into column 'entry_id', table...

NULLなので、あかん、と出る(そりゃそうだ)。SQL文は mt/php/extlib/adodb/adodb-active-record.inc.php (function Insert())が生成しているので、INSERT文にentry_idが入るのは避けられない。SET IDENTITY_INSERT テーブル名 ON して、任意の値を入れられるようにして最大値に ++ したものを突っ込むように。IDの重複があればエラーになるので、上書きとかにはならんのですが、エラーの際には大きめの値をセットし直して突っ込むように(綺麗じゃないけど。保険)。

Enterprise.pack/php/mtdb.mssqlserver.php で function Insert を定義しなおすのが根本解決なんだろうけどな(メモっとかないとまたハマるからさっ)。

<?php
define( "MT_DIR", 'C:\mt\\' );
define( "TIME_OFFSET", 9 );

// create_entry( 1, 'title', 'text' );

function create_entry( $blog_id, $title, $text ) {
    $offset = TIME_OFFSET;
    $offset = $offset * 60 * 60;
    require_once( MT_DIR . 'php\mt.php' );
    try {
        $mt = MT::get_instance( $blog_id, MT_DIR . 'mt-config.cgi' );
    } catch ( Exception $e ) {
        sleep( 1 ); // Retry
        $mt = MT::get_instance( $blog_id, MT_DIR . 'mt-config.cgi' );
    }
    $title = $mt->db()->escape( $title );
    $text = $mt->db()->escape( $text );
    require_once( MT_DIR . 'php\lib\class.mt_entry.php' );
    $sql = 'SET IDENTITY_INSERT mt_entry ON';
    $mt->db()->Execute( $sql );
    $e = new Entry();
    $e->class = 'entry';
    $e->blog_id = $blog_id;
    $e->author_id = 1;
    $e->status = 1;
    $e->current_revision = 0;
    $e->title = $title;
    $e->text = $text;
    $ts = gmdate( "Y/m/d H:i:s", time() + $offset );
    $e->authored_on  = $ts;
    $e->modified_on = $ts;
    $e->created_on = $ts;
    $sql = 'select max(entry_id) from mt_entry';
    $res = $mt->db()->Execute( $sql );
    $max = $res->_array[0][''];
    $max++;
    $e->id = $max;
    try {
        $e->Insert();
    } catch ( Exception $e ) {
        // $e->getMessage();
        $max += 10;
        $e->id = $max;
        $e->Insert();
    }
    $sql = 'SET IDENTITY_INSERT mt_entry OFF';
    $mt->db()->Execute( $sql );
}
?>

何か最近こんなんばっか...



このブログを書いている人
野田純生の写真
野田 純生 (のだ すみお)

大阪府出身。ウェブアクセシビリティエバンジェリスト。 アルファサード株式会社の代表取締役社長であり、現役のプログラマ。経営理念は「テクノロジーによって顧客とパートナーに寄り添い、ウェブを良くする」。 プロフィール詳細へ