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
Форумы портала PHP.SU :: Версия для печати :: Запись массива в бд построчно.
Форумы портала PHP.SU » » Работа с СУБД » Запись массива в бд построчно.

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

1. Arredatore - 06 Сентября, 2011 - 20:37:40 - перейти к сообщению
Пишу для фреймворка 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, выводится все корректно, то есть с массивом все в порядке, в базу же записывается только одна строка. Что не так?
2. Мелкий - 06 Сентября, 2011 - 20:59:27 - перейти к сообщению
Arredatore пишет:
$tags ->topic_tag_text = $a;

Вы точно понимаете, что вы этой строкой делаете? А если подумать?
3. Arredatore - 07 Сентября, 2011 - 07:13:06 - перейти к сообщению
Нет не точно предполагаю что орм составляет строку запроса и $tags->save(); ее отправляет. Я в курсе что foreach странный оператор "Внимание: Цикл foreach оперирует не исходным массивом, а его копией. Это означает, что любые изменения, которые вносятся в массив, не могут быть "видны" из тела цикла" Но все ж таки, что сделать то? Заменить на for? Или собирать строку запроса в теле цикла, и отправлять ее по его завершению?
4. Мелкий - 07 Сентября, 2011 - 09:51:54 - перейти к сообщению
Ок, я поясню.
Выполнение $etwas = $value; в цикле лишено смысла, т.к. $etwas будет содержать только последний элемент. Т.к. на каждой итерации переменная перезаписывается новым значением.

А foreach актуальных версий php - весьма хороший цикл и обходит массив быстрее эквивалентных записей через for и while.
5. Arredatore - 07 Сентября, 2011 - 10:01:54 - перейти к сообщению
С этим я не могу поспорить и сам понимаю, но мне казалось, что $tags->save(); все же выполняется каждую итерацию цикла? Не просто получается замкнутый круг, но могу же я записать все это обратно в массив? А потом выводить другим циклом foreach? Я понимаю может вопрос кажется глупым, но я реально не понимаю. Я вижу выход, начать собирать строку запроса в цикле, но хочется все ж таки орм использовать....
6. Мелкий - 07 Сентября, 2011 - 10:10:03 - перейти к сообщению
ааа, я в скобках запутался.
Тогда всё ещё проще - после return не исполняется ничего и никогда. Это die для функции, метода, подключаемого файла.
7. Arredatore - 07 Сентября, 2011 - 11:00:45 - перейти к сообщению
Да это я стормозил, но на самом деле все равно не работает, причем если нет поля $_primary_key в базе данных, то ругается пытаясь сохранить дважды с одним id, что в общем понятно, а если есть то сохраняет только последнюю запись. Раньше сохранял только первую, но в этом я уже покаялся Улыбка
8. Arredatore - 07 Сентября, 2011 - 17:01:25 - перейти к сообщению
Попробовал заменить на такой вариант

$keywordsall = explode(",", $keywords);
$a =count($keywordsall);
for($x=0;$x<$a;$x++){
$tags ->obj_id = $idobj;
$tags ->topic_tag_text = $keywordsall[$x];
$tags->save();
}
Все равно не работает.
9. Arredatore - 08 Сентября, 2011 - 11:55:36 - перейти к сообщению
На кохановском форуме мне все же ответили, если вдруг понадобится ответ такой.
<code>
After

$tags->save();
do

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

 

Powered by ExBB FM 1.0 RC1