В 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. Если использовать его не постоянно, а изредка для отдельных задач - натыкаешься на подобные грабли.






Последние комментарии