1

MySQLクエリブラウザを使用して、手動でというテーブルを作成usersし、フィールドに日付を入力しました。に設定し、primary keyid設定しauto incrementます。あります3 rows、最高id3です。

次にclassmethodディレクトリに次のように作成して、テーブルなどのデータを呼び出します。

class Application_Model_DbTable_User extends Zend_Db_Table_Abstract
    {
        protected $_name = 'user';  

        public function getLatestUserId()
        {
            $id = $this->getAdapter()->lastInsertId();
            return $id;
        }   
    }

controller私は次のことを行います。これは、によって生成された値を取得し、methodそれにviewアクセスできるようにします。

   $usersDbModel = new Application_Model_DbTable_User();
    $lastUserId = $usersDbModel->getLatestUserId();     
    $this->view->lastUserId = $lastUserId; 

ビューで、それをエコーし​​てユーザーに表示します。

echo $this->lastUserId;

idただし、usersテーブルの最後が3であるにもかかわらず、 0が表示されます。

私も試しました:

 public function getLatestUserId()
    {    
        $sql = 'SELECT max(id) FROM user';  
        $query = $this->query($sql);
        $result = $query->fetchAll();
        return $result;
    }   

しかし、これはサーバーエラーをスローするだけです。

私は何を間違えましたか?
私は何かが足りないのですか?
これを行う別の方法はありますか?

4

4 に答える 4

2

答えは:

$sql = 'SELECT max(id) FROM user';  
        $query = $this->getAdapter()->query($sql);
        $result = $query->fetchAll();
        return $result[0]['max(id)']; 
于 2012-05-04T15:52:28.210 に答える
1

「SELECTidFROMUSERS SORT BY idDESCLIMIT0,1」のようにクエリした場合

最新のユーザーのIDしか取得できませんね。

于 2012-05-04T14:43:05.620 に答える
0

次のようなselectステートメントを使用する場合

SELECT max(id) FROM USERS;

コントローラで機能を試したことがない場合は、次のようにしてみてください。

class IndexController extends Zend_Controller_Action {

     public function init() {

    }

    public function indexAction() {

    }

    public function getLatestUserId()
    {
         $bootstrap = $this->getInvokeArg('bootstrap');
         $resource = $bootstrap->getPluginResource('db');
         $db = $resource->getDbAdapter();

         $sqlrequest = "select max(id) as Idmax from user";
         $rows = $db->fetchAll($sqlrequest);     

         foreach ($rows as $row)
             echo $maxId = $row['Idmax'];       

         return $maxId;
    }
}

ブートストラップファイルは次のようになります

 class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
 {

     protected function _initConfig()
    {
        $config = new Zend_Config($this->getOptions());
        Zend_Registry::set('config', $config);
        return $config;
    }
}

うまくいけば、そのようなものがうまくいくことを願っています

于 2012-05-04T14:44:59.423 に答える
0

問題は、Mysqlが実際にはサポートしていないことlastInsertId()です。場合によっては、自動インクリメントの主キーの最後のIDが返されます。
ここではいくつかの解決策を紹介しましたが、ほとんどの場合、主キーの最後のIDが返されます。これは、実際に必要なものである場合とそうでない場合があります。

このメソッドも、select()オブジェクトを使用して同じことを行います。

public function getlastInsertId(){
        $select = $this->select();
        $select->from($this->_name, "id");
        $select->order('id DESC');
        $select->limit(0, 1);
        $result = $this->fetchAll($select)->current();

        return $result->id;
    }

あなたが本当に求めているのが最後に挿入したIDである場合、時間の経過とともに、これらの種類のメソッドは信頼できないと思うかもしれません。レコードが追加および削除されると、データベースは、現在使用しているデータベースとそのデータベースの設定方法に応じて、空のIDを入力する場合と入力しない場合があります。
ほとんどの場合、最後のアイテムのIDは、挿入後すぐに挿入する必要があります。通常は、ビュースクリプトを更新します。この場合、私は通常、行オブジェクト全体をリターンの一部にします。

これが私が意味することの例です:

/**this method will save or update a record depending on data present in the array*/
public function saveUser(array $data) {
        /**cast data array as std object for convience*/
        $dataObject = (object) $data;
        /**if id exists as array and has a non null value*/
        if (array_key_exists('id', $data) && isset($data['id'])) {
            /**find row if updating*/
            $row = $this->find($dataObject->id)->current();
        } else {
            /**create new row*/
            $row = $this->createRow();
        }

        $row->first_name = $dataObject->first_name;
        $row->last_name = $dataObject->last_name;
        $row->email = $dataObject->email;
        /**save or update row*/
        $row->save();
        /**return the $row you just built or you can return $result = $row->save(); and get*/
        /** just the primary key. Save() will throw an exception if table is marked read only*/
        return $row;
    }
于 2012-05-05T13:09:29.133 に答える