Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Автоподстановка данных в поля при редактировании

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Perun
Отправлено: 08 Марта, 2017 - 21:29:58
Post Id


Гость


Покинул форум
Сообщений всего: 116
Дата рег-ции: Дек. 2016  


Помог: 0 раз(а)




Есть форма с новостью - для редактирования. Задача - Если при редактировании случайно было очищено какое-то поле и отправлена форма, как отредактрованная - чтобы это поле в уже отредактированной новости не осталось пустым, как ошибочно удаленное, а перезаписалось значение, которое было там ранее, до редактирования.
Реализовал вот так:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. // Getting of  the news' data from DB for an ID from GET array.
  3. $getset = "SELECT * FROM `news` WHERE `id` = ".$_GET['key1']." LIMIT 1 ";
  4. $edit = mysqli_fetch_assoc(query($getset));
  5. // If the "CONFIRM EDIT" button is clicked
  6. if (isset($_POST['news_cat'], $_POST['title'], $_POST['author'], $_POST['short_description'], $_POST['full_description'], $_POST['editconf'], $_GET['key1'])) {
  7.         $post = array('news_cat'=>$_POST['news_cat'], 'title'=>$_POST['title'], 'author'=>$_POST['author'], 'short_description'=>$_POST['short_description'], 'full_description'=>$_POST['full_description']);
  8.   foreach ($post as $postk => $postv) {
  9.     if ($postv == '') {
  10.       $_POST[$postk] = $edit[$postk];
  11.     }
  12.     else {
  13.       $_POST[$postk] = $postv;
  14.     }
  15.   }
  16. // Updating of news' details if the CONFIRM EDIT button is clicked  
  17.     query("  UPDATE `news` SET
  18.                `news_add_date`     = NOW(),
  19.                `title`             = '".arrrealstr($_POST['title'])."',
  20.                `cat`               = '".arrrealstr($_POST['news_cat'])."',
  21.                `author`            = '".arrrealstr($_POST['author'])."',
  22.                `full_description`  = '".arrrealstr(nl2br($_POST['full_description']))."',
  23.                `short_description` = '".arrrealstr($_POST['short_description'])."'
  24.              WHERE `id`            = ".$_GET['key1']."
  25.          ");
  26.   // Redirect to the news' list page  
  27.     $_SESSION['success'] = 'The choosen news has been successfully edited!';
  28.     exit_redirect('news/news');    
  29.   }
  30.  
  31. else { // If the "CONFIRM EDIT" button is not clicked
  32.   $newsmes = 'Edit the news field below and click "CONFIRM EDIT" or go back to the news list. The fields with the "*" mark are required.';
  33. }
  34.  
  35. ?>

Собственно строки 7-14...
Или лучше прямо в части UPDATE проверять не пустое ли поле для каждого значения?
 
 Top
haveFun
Отправлено: 09 Марта, 2017 - 12:22:32
Post Id



Гость


Покинул форум
Сообщений всего: 102
Дата рег-ции: Янв. 2010  


Помог: 0 раз(а)




PHP:
скопировать код в буфер обмена
  1.  
  2. $arSetUpdate = [];
  3. foreach ($_POST as $sKey => $sValue) {
  4.     if (strlen($sValue) == 0) {
  5.         continue;
  6.     }
  7.  
  8.     switch ($sKey) {
  9.         case 'title':
  10.         case 'cat':
  11.         case 'author':
  12.         case 'short_description':
  13.             $arSetUpdate[] = $sKey . '="' . arrrealstr($sValue) . '"';
  14.             break;
  15.  
  16.         case 'full_description':
  17.             $arSetUpdate[] = $sKey . '="' . arrrealstr(nl2br($sValue)) . '"';
  18.             break;
  19.     }
  20. }
  21. if (count($arSetUpdate) > 0) {
  22.     $sSetUpdate = 'UPDATE news SET ' . implode(',', $arSetUpdate) . ' WHERE id = ' . intval($_GET['key1']); // надеюсь id у вас это число...
  23.     query($sSetUpdate);
  24. }
  25.  


лишний запрос из 3 и 4 строки можно не выполнять.
и поменяйте в форме инпут news_cat на cat, пусть все будет приведено к единому виду, если это проблема, то выносите в отдельный кейс.

(Отредактировано автором: 09 Марта, 2017 - 12:24:10)

 
 Top
Perun
Отправлено: 09 Марта, 2017 - 14:11:31
Post Id


Гость


Покинул форум
Сообщений всего: 116
Дата рег-ции: Дек. 2016  


Помог: 0 раз(а)




haveFun пишет:
лишний запрос из 3 и 4 строки можно не выполнять.

У меня дальше в части представления идет обращение к этим данным для вывода в форму уже имеющихся данных для этой новости. Чтобы видеть, чем уже заполнены поля.
$_GET['key1'] я обрабатываю (int). Не дописал...

haveFun пишет:
$arSetUpdate = [];

Это то же самое, что и
$arSetUpdate = array();
?
haveFun пишет:
if (strlen($sValue) == 0)

А если значение в поле будет именно "0"?
Почему не на пустое значение проверка?
haveFun пишет:
if (count($arSetUpdate) > 0)

Зачем проверять еще на ">0"
count же вернет в любом случае отличное значение от нуля, если массив не пустой
Почему не просто if (count()) {...}
 
 Top
haveFun
Отправлено: 09 Марта, 2017 - 14:31:17
Post Id



Гость


Покинул форум
Сообщений всего: 102
Дата рег-ции: Янв. 2010  


Помог: 0 раз(а)




1. селект нужно делать после апдейда, а не перед ним.
2. да. отвыкайте от этих древних array().
3. если значение будет 0 - strlen вернет 1 потому что http://php.net/manual/ru/function.strlen.php
пустое значение (null) в посте не приходит.
4. тогда уж if (!empty($arSetUpdate)) - если наносекунды экономим.
 
 Top
Perun
Отправлено: 09 Марта, 2017 - 17:27:23
Post Id


Гость


Покинул форум
Сообщений всего: 116
Дата рег-ции: Дек. 2016  


Помог: 0 раз(а)




haveFun пишет:
1. селект нужно делать после апдейда, а не перед ним.

Почему??? Селектом я получаю старые значения из ДБ, и дальше в представлении в форме использую старые, а апдейтом(если будет подтверждение редактирования) заношу в БД уже новые значения...

haveFun пишет:
пустое значение (null) в посте не приходит.

А какое значение приходит? Если значение в поле не указано, элемент в массиве $_POST все равно создается. И собственно сама проверка на пустое значение работает. Объясните пожалуйста.

haveFun пишет:
тогда уж if (!empty($arSetUpdate)) - если наносекунды экономим.

Так какая разница между вариантами:
if (count($arSetUpdate) > 0)
if (count($arSetUpdate))
if (!empty($arSetUpdate))
и
if (strlen($sValue) == 0) {} else{}
 
 Top
haveFun
Отправлено: 10 Марта, 2017 - 09:52:52
Post Id



Гость


Покинул форум
Сообщений всего: 102
Дата рег-ции: Янв. 2010  


Помог: 0 раз(а)




1. зачем это нужно, если вы обновляете только те значения, которые собираются в массиве arSetUpdate? если значение - пустая строка, то оно не добавится в массив, не добавится в запрос, и соответственно не обновится - останится старым.
после обновления достаните актуальные данные, и выведе во вью, а то что используете вы - велосипед из кастылей, жуткая практика, но все приходит с опытом.

2. приходит пустая строка = '', ее длина равна 0.
стоит обратить внимание например на то, что не выделенный чекбокс вообще не придет, в отличие от текстового инпута или селекта.

3. начнем с конца. если текущее значение пустая строка - мы не обновляем данные для текущего поля.
разница между ифами чисто в контексте:

1 - если мы используем каунт - соответственно мы собираемся работать с результирующим числом, например сравнивать его с другим числом.
2 - так не пишут. просто не пишут и все. хотя можно написать, но зачем нам каунт, если мы ожидаем не число, а булиновое значение?
3 - проверка на пустой/не пустой массив - используется там где требуется именно эта проверка. отрабатывает быстрее чем каунт, но это заметно только при сравнении внутри большого кол-ва циклов, например при переборе десятков или сотен тысяч записей из бд.
при добавлении данных из формы 1 и 3 варианты отработают примерно с одинаковой скоростью.

проверка эта нужна потомоу что она нужна. просто приучайте себя проверять и валидировать все данные, которые приходят со стороны клиента, особенно когда эти данные вносятся в бд.

(Отредактировано автором: 10 Марта, 2017 - 10:09:49)

 
 Top
Perun
Отправлено: 10 Марта, 2017 - 18:01:03
Post Id


Гость


Покинул форум
Сообщений всего: 116
Дата рег-ции: Дек. 2016  


Помог: 0 раз(а)




haveFun пишет:
2. приходит пустая строка = '', ее длина равна 0.
стоит обратить внимание например на то, что не выделенный чекбокс вообще не придет, в отличие от текстового инпута или селекта.

Так речь именно о полях, а не чекбокс, поэтому я и спрашиваю в этом контексте. Почему нельзя использовать поверку на '' ? В Вашем же варианте два развития событий - когда пустая строка и когда не пустая. Отсюда у меня и был вариант
if ($sValue == '') {} else{}
haveFun пишет:
проверка на пустой/не пустой массив - используется там где требуется именно эта проверка

Так тут как раз и нужно поверять, пустой ли массив. Разве нет?
 
 Top
haveFun
Отправлено: 13 Марта, 2017 - 11:23:52
Post Id



Гость


Покинул форум
Сообщений всего: 102
Дата рег-ции: Янв. 2010  


Помог: 0 раз(а)




1. стоит различать сравнение строк
if ($sValue == '') {} else{}
и получение размера строки
if (strlen($sValue) == 0)
это принципиально разные вещи.

почитайте http://stackoverflow[dot]com/questio[dot][dot][dot]rlenstr-0-in-php

2. да, для этого существует специальный метод empty(), я же написал.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB