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]   

> Описание: Запись массива в бд построчно.
Arredatore
Отправлено: 06 Сентября, 2011 - 20:37:40
Post Id


Новичок


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


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




Пишу для фреймворка kohana, и вот ни как не могу решить проблему, надо записать в базу все теги соответствующие id элемента.
Пишу так
PHP:
скопировать код в буфер обмена
  1.             $keywordsall = explode(",", $keywords);
  2.             foreach($keywordsall as $a) {
  3.                     $tags ->obj_id = $idobj;
  4.                     $tags ->topic_tag_text = $a;
  5.                     try {
  6.                     $tags->save();
  7.                         return TRUE;
  8.                     }
  9.                     catch (ORM_Validation_Exception $e){
  10.                         return FALSE;
  11.                     }
  12.             }

Если вместо записи в базу подставить echo, выводится все корректно, то есть с массивом все в порядке, в базу же записывается только одна строка. Что не так?


Отредактировано модератором: Мелкий, 07 Сентября, 2011 - 10:15:52
 
 Top
Мелкий Супермодератор
Отправлено: 06 Сентября, 2011 - 20:59:27
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




Arredatore пишет:
$tags ->topic_tag_text = $a;

Вы точно понимаете, что вы этой строкой делаете? А если подумать?


-----
PostgreSQL DBA
 
 Top
Arredatore
Отправлено: 07 Сентября, 2011 - 07:13:06
Post Id


Новичок


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


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




Нет не точно предполагаю что орм составляет строку запроса и $tags->save(); ее отправляет. Я в курсе что foreach странный оператор "Внимание: Цикл foreach оперирует не исходным массивом, а его копией. Это означает, что любые изменения, которые вносятся в массив, не могут быть "видны" из тела цикла" Но все ж таки, что сделать то? Заменить на for? Или собирать строку запроса в теле цикла, и отправлять ее по его завершению?
 
 Top
Мелкий Супермодератор
Отправлено: 07 Сентября, 2011 - 09:51:54
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




Ок, я поясню.
Выполнение $etwas = $value; в цикле лишено смысла, т.к. $etwas будет содержать только последний элемент. Т.к. на каждой итерации переменная перезаписывается новым значением.

А foreach актуальных версий php - весьма хороший цикл и обходит массив быстрее эквивалентных записей через for и while.


-----
PostgreSQL DBA
 
 Top
Arredatore
Отправлено: 07 Сентября, 2011 - 10:01:54
Post Id


Новичок


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


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




С этим я не могу поспорить и сам понимаю, но мне казалось, что $tags->save(); все же выполняется каждую итерацию цикла? Не просто получается замкнутый круг, но могу же я записать все это обратно в массив? А потом выводить другим циклом foreach? Я понимаю может вопрос кажется глупым, но я реально не понимаю. Я вижу выход, начать собирать строку запроса в цикле, но хочется все ж таки орм использовать....
 
 Top
Мелкий Супермодератор
Отправлено: 07 Сентября, 2011 - 10:10:03
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




ааа, я в скобках запутался.
Тогда всё ещё проще - после return не исполняется ничего и никогда. Это die для функции, метода, подключаемого файла.


-----
PostgreSQL DBA
 
 Top
Arredatore
Отправлено: 07 Сентября, 2011 - 11:00:45
Post Id


Новичок


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


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




Да это я стормозил, но на самом деле все равно не работает, причем если нет поля $_primary_key в базе данных, то ругается пытаясь сохранить дважды с одним id, что в общем понятно, а если есть то сохраняет только последнюю запись. Раньше сохранял только первую, но в этом я уже покаялся Улыбка
 
 Top
Arredatore
Отправлено: 07 Сентября, 2011 - 17:01:25
Post Id


Новичок


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


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




Попробовал заменить на такой вариант

$keywordsall = explode(",", $keywords);
$a =count($keywordsall);
for($x=0;$x<$a;$x++){
$tags ->obj_id = $idobj;
$tags ->topic_tag_text = $keywordsall[$x];
$tags->save();
}
Все равно не работает.
 
 Top
Arredatore
Отправлено: 08 Сентября, 2011 - 11:55:36
Post Id


Новичок


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


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




На кохановском форуме мне все же ответили, если вдруг понадобится ответ такой.
<code>
After

$tags->save();
do

$tags->clear();
</code>
По тому что нужно каждый цикл инициализировать новый объект для записи.
 
 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