Вопрос раз: Имеется набор полей вида HTML: <div id="set1"> Поле 1: <input name="field1[]" value="" /><br /> Поле 2: <input name="field2[]" value="" /><br /> Поле 3: <input name="field3[]" value="" /><br /> Поле 4: <input name="field4[]" value="" /><br /> </div> <div id="set2"> Поле 1: <input name="field1[]" value="" /><br /> Поле 2: <input name="field2[]" value="" /><br /> Поле 3: <input name="field3[]" value="" /><br /> Поле 4: <input name="field4[]" value="" /><br /> </div> наборов может быть достаточно много, полей намечается 26 - 30. Условие, упрощённо: если field1 в наборе заполнено, то должно быть заполнено и field2 и на оборот. Для field3 и field4 аналогично. Полей и взаимных связей, как говорил, много. Вопрос как бы это выкрутить? Вариант тупо в лоб: PHP: <?php /** * Check mutual existanse of fields * * @param array $vars * @param int $k * @return bool */ function checkSets($vars, $k) { foreach ($vars as $v) { if (isset($_POST[$v][$k]) && !empty($_POST[$v][$k])) { foreach ($vars as $v2) { if (!isset($_POST[$v2][$k]) || empty($_POST[$v2][$k])) { return FALSE; } } } } return TRUE; } foreach ($_POST['field1'] as $k => $v) { $check = array('field1', 'field2'); if ($this->checkSets($check, $k)) { $errors[] = 'Please, select '.implode(',', $check).' in set #'.($k+1); } $check = array('field3', 'field4'); if ($this->checkSets($check, $k)) { $errors[] = 'Please, select '.implode(',', $check).' in set #'.($k+1); } } ?> не нравится. Прошу не судить строго. Только начинаю изучать пхп Вопрос два: PDO, Zend_DB и иже с ними. Prepared statements и функции работы с датами в mysql. КАК???!!!
можно и матрицу соответствий забацать, но, имхо, это не намного лучше… Всё тот же слаборасширяемый и негибкий подход
Luge объеденить все связаные поля в логические блоки HTML: <div id="set1"> Поле 1: <input name="field[1][]" value="" /><br /> Поле 2: <input name="field[1][]" value="" /><br /> Поле 3: <input name="field[2][]" value="" /><br /> Поле 4: <input name="field[2][]" value="" /><br /> </div> или это и будет матрица соответствий?
что-то вроде этого HTML: <div id="set1"> Поле 1: <input name="field[0][]" value="" /><br /> Поле 2: <input name="field[1][]" value="" /><br /> Поле 3: <input name="field[2][]" value="" /><br /> Поле 4: <input name="field[3][]" value="" /><br /> </div> <div id="set2"> Поле 1: <input name="field[0][]" value="" /><br /> Поле 2: <input name="field[1][]" value="" /><br /> Поле 3: <input name="field[2][]" value="" /><br /> Поле 4: <input name="field[3][]" value="" /><br /> </div> PHP: <? for($i=0,$c=count($_POST['field']);$i<$c;$i++){ if( isset($_POST['field'][($i+1)]) && (count($_POST['field'][$i])!==count($_POST['field'][($i+1)]) || (in_array("",$_POST['field'][$i]) || in_array("",$_POST['field'][($i+1)])) )){ print "Fields: '".$i.",".($i+1)."' must be inserted<br>"; } } ?>
Что как? Для Zend_DB и использования функций в запросах, надо или писать запросы ручками. Или при сборке запроса оборачивать функции в Zend_Db_Expr()
Спасибо всем откликнувшимся. Самым правильным решением было поговорить с главным фантазёром и разнести разные параметры в разные формы Ктоб сомневался. есть тут одна обёртка над zend_db, которая умеет на основе array_object обновлять данные простым присваиванием, но во всём остальном страшный тормоз.
Luge Я вопроса не улавливаю И да, обновлять при простом присваивании - это *опа. PHP: <?php $class = new DB; $class->name = 'a'; // запрос? $class->desc = 'a'; // запрос? $class->role = 'a'; // запрос?
PHP: <?php $row = Model::find('one', array('conditions' => array(array ('anr_ad_id = ?',$id))), 'ads_need_request'); $row['anr_type'] = $type; //запрос $row['anr_is_done'] = 0; //запрос ?>
Не. Это не пойдет - фигня полная полторы сотни запросов на страницу каталога товаров в каком-то из магазинов покажутся детским лепетом в сравнении с этим. А связанные апдейты? А транзакции? Оно само ведь этого не узнает. P.S. Я писал связанную с таким решением вещь. Скрипт учитывал структуру сущностей хранимых в EAV таблицах. В процессе использования по накопленным данным делался анализ и таблицы денормализовывались. И все на автомате в реальном времени работы скрипта. Продукт был убит в зародыше в виду полной несостоятельности - нагрузка была просто недетской на примитивных страницах.