Aug 25

В Zend Framework всё замечательно! …пока не начинаешь его использовать на полную катушку…

Сегодня я просто приведу пример трех абсолютно различных синтаксисов, которые используются в Zend_Db для фетчинга, добавления и удаления записей.

В Zend_Db везде можно использовать array в качестве where, только нигде не сказано, как этот array должен выглядеть, а аналогий не прослеживается…

$productsTable = new Products();

Обычная вставка нового продукта:

$productsTable->insert(array(
    'name'  => 'Fucked Product!',
    'price' => 999.99,
  ));

Всё OK.

Поиск продукта по аналогии со вставкой:

$productsTable->fetchRow(array(
    'name'  => 'Fucked Product!',
    'price' => 999.99,
  ));

Выдаст SQL типа такого:

SELECT products.* FROM products WHERE (name) AND (price)

Что приведет к выдаче первого попавшегося продукта (что, естественно, нам не подходит).

Правильный вариант поиска продукта:

$productsTable->fetchRow(array(
    'name = ?'  => 'Fucked Product!',
    'price = ?' => 999.99,
  ));

Удаление продукта по аналогии с поиском:

$productsTable->delete(array(
    'product_id = ?' => 1000,
  ));

Выдаваемый SQL:

DELETE FROM products WHERE 1000

Приведет к удалению всех продуктов (sic!).

Причем самое интересное, что в случае со строкой - у вас будет ошибка, а вот в случае с числом, которое escape’ить не нужно - будут проблемы. Я с ними на днях столкнулся, и… получил пустую таблицу, в которой были важные данные. :( Благо, бэкап был.

Удаление продукта по аналогии со вставкой:

$productsTable->delete(array(
    'product_id' => 1000,
  ));

Полностью аналогично предыдущему случаю.

Правильный вариант удаления продукта:

$productsTable->delete(
    $productsTable->getAdapter()->quoteInto('product_id = ?', 1000)
  );

Вот вам и офигенный ZF. Если использовать его не постоянно, а изредка для отдельных задач - натыкаешься на подобные грабли.

written by fxposter \\ tags: ,


9 Responses to “Zend_Db: грабли в синтаксисе insert/delete/fetch”

  1. 1. Igorekk Says:

    Жуть какая. Вылизывать еще и вылизывать.

  2. 2. mihailt Says:

    багрепорт отправил?

  3. 3. o4kapuk Says:

    Да уж, приятного мало…

  4. 4. Develop7 Says:

    Zend_Db не юзал, но почему-то не удивляюсь.

  5. 5. http://necromant-2005.livejournal.com/ Says:

    Хм, советовал бы посмотреть в сторону Zend_Db_Table

  6. 6. FX Poster Says:

    А я бы посоветовал почитать сначала статью.

  7. 7. gg Says:

    а я бы вообще посоветовал не использовать ORM )

  8. 8. BaRoN! Says:

    ORM использовать – хорошо и правильно, а главное – быстро :-).
    Zend не пользовался, но с Doctrine подружился.
    Очень удобно, когда своего времени мало, ни на кого другого задание не спихнуть, а сделать надо чем раньше, тем лучше.

    Zend’овской реализацией “слегка” разочарован, с ZF не работал вообще, но автору поверю на слово.

  9. 9. Tanat Says:

    а такой штукой как select и where автор пользоваться не пробовал?
    $select = $db->select()->from(‘name_table’)->where(‘param=?’,$param);
    $resultArr = $db->fetchAll($selct);

Leave a Reply