Php Zend框架$db->;更新结果

Php Zend框架$db->;更新结果,php,zend-framework,zend-db,Php,Zend Framework,Zend Db,Zend\u Db\u Adapter::update()返回受更新操作影响的行数。 确定查询是否成功的最佳方法是什么 $data=array( '更新于'=>'2007-03-23', “bug_状态”=>“已修复” ); $n=$db->update('bugs',$data,'bug_id=2'); 也许: $data = array( 'updated_on' => '2007-03-23', 'bug_status' => 'FIXE

Zend\u Db\u Adapter::update()
返回受更新操作影响的行数。 确定查询是否成功的最佳方法是什么

$data=array(
'更新于'=>'2007-03-23',
“bug_状态”=>“已修复”
); 
$n=$db->update('bugs',$data,'bug_id=2');
也许:

$data = array(
    'updated_on'      => '2007-03-23',

    'bug_status'      => 'FIXED'
);
$result = $db->update('bugs', $data, 'bug_id = 2');
if ($result < $numRows) {//pass in numRows as method arg or hardcode integer.
    //handle error
} else {
    return TRUE;
}
$data=array(
'更新于'=>'2007-03-23',
“bug_状态”=>“已修复”
);
$result=$db->update('bugs',$data,'bug_id=2');
如果($result<$numRows){//将numRows作为方法arg或硬编码整数传递。
//处理错误
}否则{
返回TRUE;
}

尝试类似的方法,其目的是验证要更新的记录数是否已更新。

如果您只是在寻找布尔返回值,此解决方案最适合在模型中处理成功:

$data = array(
    'updated_on' => '2007-03-23',
    'bug_status' => 'FIXED',
);
$n = 0;
try {
    $n = $db->update('bugs', $data, 'bug_id = 2');
} catch (Zend_Exception $e) {
    die('Something went wrong: ' . $e->getMessage());
}
if (empty($n)) {
    die('Zero rows affected');
}
类Default_Model_Test扩展了Zend_Db_表{

public function updateTest($testId, $testData){

    try {

        $this->_db->update('test', $testData, array(
            'id = ?'        => $testId
        ));

        return true;

    }
    catch (Exception $exception){

        return false;

    }

}
}

但是,更好的解决方案是从控制器级别处理成功,因为它正在发出请求:

class Default_Model_Test extends Zend_Db_Table {

    public function updateTest($testId, $testData){

        $this->_db->update('test', $testData, array(
            'id = ?'        => $testId
        ));

    }

}

class Default_TestController extends Zend_Controller_Action {

    public function updateAction(){

        try {

            $testId = $this->_request->getParam('testId');
            if (empty($testId)) throw new Zend_Argument_Exception('testId is empty');

            $testData = $this->_request->getPost();
            if (empty($testId)) throw new Zend_Argument_Exception('testData is empty');

            $testModel->updateTest($testId, $testData);

        }
        catch (Exception $exception){

            switch (get_class($exception)){

                case 'Zend_Argument_Exception': $message = 'Argument error.'; break;
                case 'Zend_Db_Statement_Exception': $message = 'Database error.'; break;
                case default: $message = 'Unknown error.'; break;

            }

        }

    }

}

当使用多个资源类型、使用异常类型上的开关以及根据程序的需要执行适当的操作时,这是一个极好的解决方案。任何东西都无法摆脱这种真空。

如果不成功,将出现异常thrown@zerkms我认为,除非有适配器问题或抛出Zend_Db_语句的错误查询,否则如果没有行受到影响,异常更新将返回0行。但是,您可能会遇到Mysql/pdo错误,原因是绑定的参数不够或诸如此类。@RockyFord:如果出现异常,则每次调用都不会返回任何结果。我要说的是,它不会总是抛出异常。更新引发的唯一异常是适配器冲突,其他一切都是外围的。因此,假设语法正确,id可能不正确,可能会出现sql错误,但不会出现php异常。@RockyFord:如果出现sql错误,它将转换为异常,不是吗?“可能会出现sql错误,但不会出现php异常”--我确信会出现php异常;-)实际更新的行数取决于原始值。因此,即使
$result
等于0,也不意味着发生了错误