За последние 24 часа нас посетили 22511 программистов и 1202 робота. Сейчас ищут 746 программистов ...

Вопросы от блондина

Тема в разделе "Вопросы от блондинок", создана пользователем Luge, 2 май 2010.

  1. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    Вопрос раз:
    Имеется набор полей вида
    HTML:
    1. <div id="set1">
    2.     Поле 1: <input name="field1[]" value="" /><br />
    3.     Поле 2: <input name="field2[]" value="" /><br />
    4.     Поле 3: <input name="field3[]" value="" /><br />
    5.     Поле 4: <input name="field4[]" value="" /><br />
    6. </div>
    7. <div id="set2">
    8.     Поле 1: <input name="field1[]" value="" /><br />
    9.     Поле 2: <input name="field2[]" value="" /><br />
    10.     Поле 3: <input name="field3[]" value="" /><br />
    11.     Поле 4: <input name="field4[]" value="" /><br />
    12. </div>
    наборов может быть достаточно много, полей намечается 26 - 30.
    Условие, упрощённо: если field1 в наборе заполнено, то должно быть заполнено и field2 и на оборот. Для field3 и field4 аналогично. Полей и взаимных связей, как говорил, много.
    Вопрос как бы это выкрутить?

    Вариант тупо в лоб:
    PHP:
    1. <?php
    2. /**
    3.  * Check mutual existanse of fields
    4.  *
    5.  * @param array $vars
    6.  * @param int $k
    7.  * @return bool
    8.  */
    9. function checkSets($vars, $k)
    10. {
    11.     foreach ($vars as $v) {
    12.         if (isset($_POST[$v][$k]) && !empty($_POST[$v][$k])) {
    13.             foreach ($vars as $v2) {
    14.                 if (!isset($_POST[$v2][$k]) || empty($_POST[$v2][$k])) {
    15.                     return FALSE;
    16.                 }
    17.             }
    18.         }
    19.     }
    20.     return TRUE;
    21. }
    22.  
    23. foreach ($_POST['field1'] as $k => $v) {
    24.  
    25.     $check = array('field1', 'field2');
    26.     if ($this->checkSets($check, $k)) {
    27.         $errors[] = 'Please, select '.implode(',', $check).' in set #'.($k+1);
    28.     }
    29.  
    30.     $check = array('field3', 'field4');
    31.     if ($this->checkSets($check, $k)) {
    32.         $errors[] = 'Please, select '.implode(',', $check).' in set #'.($k+1);
    33.     }
    34. }
    35. ?>
    не нравится.
    Прошу не судить строго. Только начинаю изучать пхп [​IMG]

    Вопрос два:
    PDO, Zend_DB и иже с ними. Prepared statements и функции работы с датами в mysql. КАК???!!!
     
  2. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    а какой то побитовый чексумм не придумывается?
     
  3. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    можно и матрицу соответствий забацать, но, имхо, это не намного лучше… Всё тот же слаборасширяемый и негибкий подход
     
  4. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    Luge
    а какой ты хотел гибкий подход, с кучей условий, зависящих от предметной области? ))
     
  5. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    вот чую седалищным нервом, что упускаю что-то, но что пока не понял :D
     
  6. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
  7. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Luge
    объеденить все связаные поля в логические блоки
    HTML:
    1. <div id="set1">
    2.     Поле 1: <input name="field[1][]" value="" /><br />
    3.     Поле 2: <input name="field[1][]" value="" /><br />
    4.     Поле 3: <input name="field[2][]" value="" /><br />
    5.     Поле 4: <input name="field[2][]" value="" /><br />
    6. </div>
    или это и будет матрица соответствий?
     
  8. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    что-то вроде этого

    HTML:
    1. <div id="set1">
    2.      Поле 1: <input name="field[0][]" value="" /><br />
    3.      Поле 2: <input name="field[1][]" value="" /><br />
    4.      Поле 3: <input name="field[2][]" value="" /><br />
    5.      Поле 4: <input name="field[3][]" value="" /><br />
    6.  </div>
    7.  <div id="set2">
    8.      Поле 1: <input name="field[0][]" value="" /><br />
    9.      Поле 2: <input name="field[1][]" value="" /><br />
    10.      Поле 3: <input name="field[2][]" value="" /><br />
    11.      Поле 4: <input name="field[3][]" value="" /><br />
    12.  </div>
    PHP:
    1. <?
    2. for($i=0,$c=count($_POST['field']);$i<$c;$i++){
    3.      if( isset($_POST['field'][($i+1)]) &&
    4.          (count($_POST['field'][$i])!==count($_POST['field'][($i+1)]) ||
    5.          (in_array("",$_POST['field'][$i]) || in_array("",$_POST['field'][($i+1)]))
    6.      )){
    7.         print "Fields: '".$i.",".($i+1)."' must be inserted<br>";
    8.      }
    9. }
    10. ?>
     
  9. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Что как?

    Для Zend_DB и использования функций в запросах, надо или писать запросы ручками.
    Или при сборке запроса оборачивать функции в Zend_Db_Expr()
     
  10. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    Спасибо всем откликнувшимся.
    Самым правильным решением было поговорить с главным фантазёром и разнести разные параметры в разные формы :) Ктоб сомневался.

    есть тут одна обёртка над zend_db, которая умеет на основе array_object обновлять данные простым присваиванием, но во всём остальном страшный тормоз.
     
  11. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Luge
    Я вопроса не улавливаю :)

    И да, обновлять при простом присваивании - это *опа.
    PHP:
    1. <?php
    2. $class = new DB;
    3. $class->name = 'a'; // запрос?
    4. $class->desc = 'a'; // запрос?
    5. $class->role = 'a'; // запрос?
    6.  
     
  12. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    PHP:
    1. <?php
    2. $row = Model::find('one', array('conditions' =>
    3.        array(array ('anr_ad_id = ?',$id))),
    4.        'ads_need_request');
    5.  
    6. $row['anr_type'] = $type; //запрос
    7. $row['anr_is_done'] = 0;  //запрос
    8. ?>
     
  13. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Не.
    Это не пойдет - фигня полная :(
    полторы сотни запросов на страницу каталога товаров в каком-то из магазинов покажутся детским лепетом в сравнении с этим.
    А связанные апдейты?
    А транзакции?

    Оно само ведь этого не узнает.

    P.S.
    Я писал связанную с таким решением вещь.
    Скрипт учитывал структуру сущностей хранимых в EAV таблицах.
    В процессе использования по накопленным данным делался анализ и таблицы денормализовывались.
    И все на автомате в реальном времени работы скрипта.

    Продукт был убит в зародыше в виду полной несостоятельности - нагрузка была просто недетской на примитивных страницах.
     
  14. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    а это не мой велосипед, я на нём ещё педали даже не нашёл )
     
  15. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    а это зря, пара сотен китайцев, сидящих между обёрткой и бд решили бы проблему :)
     
  16. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Нет не зря.

    Идея осталась, но реализация будет совсем другой.