1

使用 MySQL 查询浏览器,我手动创建了一个名为的表users并在字段中输入了一些日期。我将其设置primary keyid并将其设置为auto increment。有3 rows,最高id的是3

class然后我在目录中进行了以下method操作以调用表中的数据等。

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;

但是,即使我idusers表中的最后一个是 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

如果您查询“SELECT id FROM USERS SORT BY id DESC LIMIT 0,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 回答