Созданные поля записываются в базу только после редактирования

в объявлениях

 
Посетитель
small user social cms
Медаль
Сообщений: 702
Не могу понять почему при добавлении объявлений, поля sroklic, skidka, pricelic не записываются в базу. НО записываются при редактировании. Что не правильно?
скидываю кусок кода фронтенд функции NEW BOARD ITEM
Спойлер
функция EDIT BOARD ITEM для сравнения...
Спойлер
Помогите, где я накосячил? уже мозг кипит, почему перестало работать...
Редактировалось: 2 раз (Последний: 20 августа 2013 в 14:49)
Модератор
small user social cms
МедальПочетный донор проектаКубок зрительских симпатийАвторитет форума
Сообщений: 1422
Код PHP:
  1. public function addRecord($item){
  2.  
  3. $inUser = cmsUser::getInstance();
  4. $item = cmsCore::callEvent('ADD_BOARD_RECORD', $item);
  5.  
  6. $sql = "INSERT INTO cms_board_items (category_id, user_id, obtype, title , content, formsdata, city, pubdate, pubdays, published, file, hits, ip)
  7. VALUES ({$item['category_id']}, {$item['user_id']}, '{$item['obtype']}', '{$item['title']}', '{$item['content']}', '{$item['formsdata']}',
  8. '{$item['city']}', NOW(), {$item['pubdays']}, {$item['published']}, '{$item['file']}', 0, INET_ATON('{$inUser->ip}'))";
  9.  
  10. $this->inDB->query($sql);
  11.  
  12. $item_id = $this->inDB->get_last_id('cms_board_items');
  13.  
  14. return $item_id ? $item_id : false;
  15. }
  16.  
  17. /* ==================================================================================================== */
  18. /* ==================================================================================================== */
  19.  
  20. public function updateRecord($id, $item){
  21.  
  22. $item = cmsCore::callEvent('UPDATE_BOARD_RECORD', $item);
  23.  
  24. $this->inDB->update('cms_board_items', $item, $id);
  25.  
  26. return true;
  27.  
  28. }
Нормальный хостинг, сервера быстрые - пользуюсь сам.
Реклама
cms
InstantCMS Team
small user social cms
МедальАвторитет форумаКубок зрительских симпатий
Сообщений: 4574
trOid, не выкладывайте такие портянки, прячьте за спойлер.
lokanaft уже намекнул куда думать, дополню:
addRecord привести к виду
Код PHP:
  1. public function addRecord($item){
  2.  
  3. $item['ip'] = ip2long(cmsUser::getInstance()->ip);
  4.  
  5. $item = cmsCore::callEvent('ADD_BOARD_RECORD', $item);
  6.  
  7. return $this->inDB->insert('cms_board_items', $item);
  8.  
  9. }
выполнить запросы к бд
Код SQL:
  1. ALTER TABLE `cms_board_items` CHANGE `hits` `hits` INT( 11 ) UNSIGNED NOT NULL DEFAULT '0'
Код SQL:
  1. ALTER TABLE `cms_board_items` CHANGE `pubdate` `pubdate` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP
Соответственно поля в таблице должны быть названы так же как у вас в коде pricelic, sroklic и т.д
Редактировалось: 1 раз (Последний: 20 августа 2013 в 14:54)
Видео каталог для InstantCMS | Аудио каталог для InstantCMS | Мы Вконтакте | Предложение для спонсоров
Посетитель
small user social cms
Медаль
Сообщений: 702
что то вы меня еще больше запутали!
в оригинале 1.10.2 функция addRecord такая
Код PHP:
  1. $item_id = $model->addRecord(array(
  2. 'category_id'=>$model->category_id,
  3. 'user_id'=>$inUser->id,
  4. 'obtype'=>$obtype,
  5. 'title'=>$title,
  6. 'content'=>$content,
  7. 'formsdata'=>$formsdata,
  8. 'city'=>$city,
  9. 'pubdays'=>$pubdays,
  10. 'published'=>$published,
  11. 'file'=>$file['filename']
  12. ));
мне ее менять на это?
Код PHP:
  1. $item = cmsCore::callEvent('ADD_BOARD_RECORD', $item);
  2.  
  3.  
  4.  
  5. $sql = "INSERT INTO cms_board_items (category_id, user_id, obtype, title , content, formsdata, city, pubdate, pubdays, published, file, hits, ip)
  6.  
  7. VALUES ({$item['category_id']}, {$item['user_id']}, '{$item['obtype']}', '{$item['title']}', '{$item['content']}', '{$item['formsdata']}',
  8.  
  9. '{$item['city']}', NOW(), {$item['pubdays']}, {$item['published']}, '{$item['file']}', 0, INET_ATON('{$inUser->ip}'))";
Посетитель
small user social cms
МедальКубок зрительских симпатий
Сообщений: 754
trOid:
в оригинале 1.10.2 функция addRecord такая
Ты сам запутался уже. Функция addRecord находится в /components/board/model.php
Код PHP:
  1. public function addRecord($item){
  2.  
  3. $inUser = cmsUser::getInstance();
  4. $item = cmsCore::callEvent('ADD_BOARD_RECORD', $item);
  5.  
  6. $sql = "INSERT INTO cms_board_items (category_id, user_id, obtype, title , content, formsdata, city, pubdate, pubdays, published, file, hits, ip)
  7. VALUES ({$item['category_id']}, {$item['user_id']}, '{$item['obtype']}', '{$item['title']}', '{$item['content']}', '{$item['formsdata']}',
  8. '{$item['city']}', NOW(), {$item['pubdays']}, {$item['published']}, '{$item['file']}', 0, INET_ATON('{$inUser->ip}'))";
  9.  
  10. $this->inDB->query($sql);
  11.  
  12. $item_id = $this->inDB->get_last_id('cms_board_items');
  13.  
  14. return $item_id ? $item_id : false;
  15. }
А сдесь формируется массив передаваемый функции addRecord
Код PHP:
  1. $item_id = $model->addRecord(array(
  2.  
  3. 'category_id'=>$model->category_id,
  4.  
  5. 'user_id'=>$inUser->id,
  6.  
  7. 'obtype'=>$obtype,
  8.  
  9. 'title'=>$title,
  10.  
  11. 'content'=>$content,
  12.  
  13. 'formsdata'=>$formsdata,
  14.  
  15. 'city'=>$city,
  16.  
  17. 'pubdays'=>$pubdays,
  18.  
  19. 'published'=>$published,
  20.  
  21. 'file'=>$file['filename']
  22.  
  23. ));
Допиши в функции addRecord свои созданные поля
INSERT INTO cms_board_items (category_id, user_id, obtype, title , content, formsdata, city, pubdate, pubdays, sroklic,pricelic,pricelic2,skidka,skidka2, published, file, hits, ip)
Соответственно и укажи значения VALUES {$item['sroklic']}, $item['pricelic']} и тд.
Установи строки отладчика
Код PHP:
  1. ini_set ('xdebug.collect_return', 1);
  2. ini_set ('xdebug.collect_params', 4);
  3. ini_set ('xdebug.collect_assignments', 1);
  4. xdebug_start_trace('C:\usr\***\**\links');//путь к файлу лога links.txt
  5.  
  6. Исследуемый код
  7.  
  8. xdebug_stop_trace();
Открой файл лога links.txt в нотепаде, при каждой перезагрузке страницы увидиш все входящие переменные и вся обработка функций будет ясна как день.
Посетитель
small user social cms
Медаль
Сообщений: 702
спасибо всем за развернутый ответ! попробую :)
Редактировалось: 1 раз (Последний: 22 августа 2013 в 04:42)
Посетитель
small user social cms
Медаль
Сообщений: 702
Спасибо, все работает если заполнены все поля! НО!
у меня две категории объявлений, "заявки" и "лицензии"
соответственно поля для ввода разные, точнее sroklic,pricelic,pricelic2,skidka,skidka2 - не заполняются в заявках.

А так же в лицензиях если поле не заполнено, то вылазит страница 404 /board/read.html, некоторые поля не обязательны для запонения...как сделать проверку?
Код PHP:
  1.  
  2. if (!$sroklic && $cat_id==11) { cmsCore::addSessionMessage($_LANG['NEED_SROK'], 'error'); $errors = true; }
  3. if (!$pricelic && $cat_id==11) { cmsCore::addSessionMessage($_LANG['NEED_PRICE'], 'error'); $errors = true; }
такая конструкция правильная?
Как быть с необязательными полями?
Редактировалось: 1 раз (Последний: 21 августа 2013 в 11:50)
Посетитель
small user social cms
Медаль
Сообщений: 702
ВСЕМ СПАСИБО! но проблема все еще не решена, т.е. если будут пустые значения необязательных полей - 404 ошибка :(
Редактировалось: 1 раз (Последний: 22 августа 2013 в 04:42)
Посетитель
small user social cms
МедальКубок зрительских симпатий
Сообщений: 754
В подкатах есть additem , есть edititem? Это был первый вопрос. Теперь тема read , на основе каких божественных провидений предполагать что там присходит в вашем варианте?
Посетитель
small user social cms
МедальКубок зрительских симпатий
Сообщений: 754
В моделе public function getRecord($item_id)
******
a.public as public,
a.sroklic as sroklic,
a.pricelic as pricelic,и далее по аналогии.
Пустые значения полей не приводят к 404.
frontend
Код PHP:
  1.  
  2. //находим
  3. if($do=='read'){
  4.  
  5. //вставляем "Начать отладку"
  6. // используем отладчик версия php 5.3 (OpenServer||Denver)
  7. ini_set ('xdebug.collect_return', 1);
  8. ini_set ('xdebug.collect_params', 4);
  9. ini_set ('xdebug.collect_assignments', 1);
  10. xdebug_start_trace('C:\usr\***\**\links');//путь к файлу лога links.txt
  11.  
  12. //Исследуем отладчиком код /board/frontend.php приводящий к ошибке 404
  13. $item = $model->getRecord($model->item_id);
  14. if (!$item){ cmsCore::error404(); }
  15.  
  16. // неопубликованные показываем админам, модераторам и автору
  17. if (!$item['published'] && !$item['moderator']) { cmsCore::error404(); }
  18.  
  19.  
  20. //вставляем "Закончить отладку"
  21. xdebug_stop_trace();
  22.  
Открываем нотепадом файл лога отладчика links.txt. И внимательно разбираем.
Редактировалось: 1 раз (Последний: 21 августа 2013 в 19:39)
Посетитель
small user social cms
Медаль
Сообщений: 702
добавил в function getRecord($item_id)
Код PHP:
  1.  
  2. a.sroklic as sroklic,
  3. a.pricelic as pricelic,
  4. a.pricelic2 as pricelic2,
  5. a.skidka as skidka,
  6. a.skidka2 as skidka2,
теперь при добавлении, если все поля заполнены - 404 ошибка board/read118.html, хотя на /board/ объявление показывается норм.
если не все поля - та же байда 404. /board/read.html
а так же перестают удаляться объявления в админке

насчет оттладчика, я не понял как его применять на хостинге, т.е. путь к файлу не могу указать правильный. получается белый экран при добавлении объявления
Посетитель
small user social cms
Медаль
Сообщений: 702
в edititem добавлено
Код PHP:
  1.  
  2. $sroklic = $inCore->request('sroklic', 'str', '');
  3. $pricelic = $inCore->request('pricelic', 'str', '');
  4. $pricelic2 = $inCore->request('pricelic2', 'str', '');
  5. $skidka = $inCore->request('skidka', 'str', '');
  6. $skidka2 = $inCore->request('skidka2', 'str','');
ниже
Код PHP:
  1.  
  2. if (!$sroklic && $cat == 11 ) { cmsCore::addSessionMessage($_LANG['NEED_SROK'], 'error'); $errors = true; }
  3. if (!$pricelic && $cat == 11 ) { cmsCore::addSessionMessage($_LANG['NEED_PRICE'], 'error'); $errors = true; }
и еще ниже в updateRecord
Код PHP:
  1.  
  2. 'sroklic'=>$sroklic,
  3. 'pricelic'=>$pricelic,
  4. 'pricelic2'=>$pricelic2,
  5. 'skidka'=>$skidka,
  6. 'skidka2'=>$skidka2,
в additem
Код PHP:
  1.  
  2. $sroklic = cmsCore::request('sroklic', 'str', '');
  3. $pricelic = cmsCore::request('pricelic', 'str', '');
  4. $pricelic2 = cmsCore::request('pricelic2', 'str', '');
  5. $skidka = cmsCore::request('skidka', 'str','');
  6. $skidka2 = cmsCore::request('skidka2', 'str','');
ниже
Код PHP:
  1.  
  2. if (!$sroklic && $cat_id==11) { cmsCore::addSessionMessage($_LANG['NEED_SROK'], 'error'); $errors = true; }
  3. if (!$pricelic && $cat_id==11) { cmsCore::addSessionMessage($_LANG['NEED_PRICE'], 'error'); $errors = true; }
далее $errors
Код PHP:
  1. $item['sroklic'] = $sroklic;
  2. $item['pricelic'] = $pricelic;
  3. $item['pricelic2'] = $pricelic2;
  4. $item['sdidka'] = $skidka;
  5. $item['sdidka2'] = $skidka2;
и в addRecord
Код PHP:
  1.  
  2. 'sroklic'=>$sroklic,
  3. 'pricelic'=>$pricelic,
  4. 'pricelic2'=>$pricelic2,
  5. 'skidka'=>$skidka,
  6. 'skidka2'=>$skidka2,
Посетитель
small user social cms
Медаль
Сообщений: 702
все еще ищу решение проблемы незаполненных полей...
Посетитель
small user social cms
МедальКубок зрительских симпатий
Сообщений: 754
Проверку заполненности полей можно выполнить так
Код PHP:
  1.  
  2. <input name="troid" id="troidinput" class="text-input" type="text" style="width:300px" value="{$item.troid|escape:'html'}" onchange="checktroid()" autocomplete="off"/>
  3. <span class="regstar">*</span>
  4. <div id="troidcheck"></div>
В шаблоне подключи js {add_js file='components/board/js/checktroid.js'}
Js файл checktroid.js
Код PHP:
  1. function checktroid(){
  2. var usertroid = $("#troidinput").attr('value');
  3. var reg= /^[a-zA-Z0-9_]{2,15}$/ ;
  4. if (reg.test(usertroid))
  5. {
  6. $("#troidcheck").load("/core/ajax/troid_board_check.php", {opt: "checktroid", data:usertroid});
  7.  
  8. }else
  9. {
  10. if (usertroid.length < 2){
  11. $("#troidcheck").html('<span style="color:red">Минимальная длина = 2</span>');
  12. } else {
  13. if (usertroid.length > 15){
  14. $("#troidcheck").html('<span style="color:red">Максимальная длина = 15</span>');
  15. } else {
  16. $("#troidcheck").html('<span style="color:red">Только латинские буквы и цифры</span>');
  17. }
  18. }
  19. }
  20. }
Файл /core/ajax/troid_board_check.php зделай аналогично /core/ajax/registration.php изменив if ($opt=='checktroid'){запрос на свой}

xdebug делай на локальном сервере в OpenServer или Denwer.
Редактировалось: 2 раз (Последний: 26 августа 2013 в 10:21)
Посетитель
small user social cms
Медаль
Сообщений: 702
oll, объясни пожалуйста что это скрипт делает, и какую возможность он дает?
как я понял он проверяет значение вводимого поля на макс и мин значение, и без русских букв.
Как это может быть связано с игнорируемостью пустых, незаполненных полей?
С сожалению нет возможности пользоваться денвером на раб. машине...
Редактировалось: 1 раз (Последний: 26 августа 2013 в 10:26)
В начало страницы
Предыдущая темаСледующая тема Перейти на форум: