Вопрос по zend-framework, php, zend-db – Zend Framework $ db-> Результат обновления

3

Zend_Db_Adapter::update() возвращает количество строк, затронутых операцией обновления. Каков наилучший способ определить, был ли запрос успешным?

$data = array(
    'updated_on'      => '2007-03-23',
    'bug_status'      => 'FIXED'
); 

$n = $db->update('bugs', $data, 'bug_id = 2');
Если это не удастся - будет выдано исключение zerkms
Я говорю, что это не всегда вызовет исключение. Единственное исключение, возникающее при обновлении, - конфликт адаптера, все остальное будет второстепенным. поэтому, если ваш синтаксис правильный и, возможно, идентификатор неверный, вы можете получить ошибку sql, но вы не получите исключение php. RockyFord
@RockyFord: если есть исключение - ничего не будет возвращено из этого вызова zerkms
@zerkms Я думаю, что если нет проблемы с адаптером или неправильного запроса, который вызывает исключение Zend_Db_Statement, обновление вернет 0 строк, если ни одна строка не затронута. Однако вы, скорее всего, получите ошибку Mysql / pdo из-за недостаточного количества связанных параметров или чего-то подобного. RockyFord
@RockyFord: если будет ошибка SQL - она будет преобразована в исключение, не так ли? & quot; может получить ошибку sql, но вы не получите исключение php & quot; - Я уверен, что для этого будет исключение php ;-) zerkms

Ваш Ответ

3   ответа
5
$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');
}
0

$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;
}

Попробуйте что-то подобное, исходя из того, что вы хотите убедиться, что обновлено количество записей, которые вы хотели обновить.

количество фактически обновленных строк зависит от исходных значений. Так что даже если$result равно 0 - тогда это не означает, что что-то случилось не так
3

это решение является лучшим для обработки успеха в модели:

Класс Default_Model_Test extends Zend_Db_Table {

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;

            }

        }

    }

}

Это отличное решение, когда вы работаете с несколькими типами ресурсов, используете переключатель типа исключения и делаете то, что соответствует потребностям вашей программы. Ничто не может избежать этого вакуума.

Похожие вопросы