Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Здравствуйте.
Столкнулся с необьяснимым. Не хочет сохраняться в таблице первая строка двумерного массива.
Код самый простой. Перебираю в цикле массив и обновляю записи в базе.
Из двумерного массива беруться значения. Первый элемент в массиве 0, так ?
При начале цикла с нуля апдейтяться все записи кроме первой строки.
При начале цикла с 1 тоже самое, апдейтяться все записи кроме первой строки.
При начале цикла с 2, записи обновляются с начиная с третьей строки.
Не могу же я сделать переменную " $i " отрицательной ?
"Это какой то ... фиаско.
for ($i=1; $i<count($csvarr); $i=$i+1)
{
if (isset($csvarr[$i][0])) { $NUMBER = $csvarr[$i][0]; } else {$NUMBER = " ";}
if (isset($csvarr[$i][1])) { $NUMBER2 = $csvarr[$i][1]; } else {$NUMBER2 = " ";}
if (isset($csvarr[$i][2])) { $WEIGHT = $csvarr[$i][2]; } else { $WEIGHT = " ";}
if (isset($csvarr[$i][3])) { $VPE = $csvarr[$i][3]; } else {$VPE = " ";}
if (isset($csvarr[$i][4])) { $VIN = $csvarr[$i][4]; } else {$VIN = " ";}
if (isset($csvarr[$i][5])) { $NL = $csvarr[$i][5]; } else { $NL = " ";}
if (isset($csvarr[$i][6])) { $TITLE = $csvarr[$i][6]; } else { $TITLE = " ";}
if (isset($csvarr[$i][7])) { $TEILEART = $csvarr[$i][7]; } else { $TEILEART = " ";}
$record = vagprice::where('NUMBER', $NUMBER)->update(['NUMBER2' => $NUMBER2, 'WEIGHT' => $WEIGHT, 'VPE' => $VPE, 'VIN' => $VIN, 'NL' => $NL, 'TITLE' => $TITLE, 'TEILEART' => $TEILEART]);
// $i++;
}
Не в сети
Первый элемент в массиве 0, так ?
Обычно так. Поэтому условие цикла должно быть
for ($i = 0; $i <= count($csvarr); $i++)
или лучше
foreach ($csvarr as $i => $item)
потому что в PHP массивы могут быть всякими
вот эти некрасивые строки
if (isset($csvarr[$i][0])) { $NUMBER = $csvarr[$i][0]; } else {$NUMBER = " ";}
. . .
...->update(['NUMBER2' => $NUMBER2, ...])
можно заменить на
...->update([
'NUMBER' => $csvarr[$i][0] ?? " ",
. . .
]);
Изменено artoodetoo (01.12.2020 07:39:58)
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Не в сети
Я уже не знаю.
Пробовал и foreach и for при $i=0 $i=1.
Вроде не в этом дело. Массив я дамплю и проверяю, первый элемент $csvarr в порядке, и подходит для записи в базу.
Все последующие строки нормально записываются.
Все строки абсолютно одинаковые, вот они в csv:
496354;865;455;0;15;9;zestankel;propilen
1093804;231;12;8;42;5;buwezlen;dectil
735161;9879;89;6;37;6;drezina;railway
7475450;9789;87;5;92;6;ceramin;pmixture
8615;5235;35;2;41;4;notice;error
4451925;4363;76;4;80;6;knowledge;moonlight
275;643643;23;9;70;8;raiser;Sunday
20124;64364;97;1;60;5;blaiser;mushroom
780;6443;23;1;54;5;Fafaru;mubaki
9818;745865;55;2;75;6;dorequ;nodoku
4977;967;78;7;74;7;pokrywka;nato
4;23532;33;3;23;8;tpmas;qwemdo
45696745;48565;55;5;49;9;weclomen;rytiol
Извините за простыню, но я уже вручную индекс, без цикла:
$NUMBER = $csvarr[2][0];
$NUMBER2 = $csvarr[2][1];
$WEIGHT = $csvarr[2][2];
$VPE = $csvarr[2][3];
$VIN = $csvarr[2][4];
$NL = $csvarr[2][5];
$TITLE = $csvarr[2][6];
$TEILEART = $csvarr[2][7];
$record = vagprice::where('NUMBER', $NUMBER)->update(['NUMBER2' => $NUMBER2, 'WEIGHT' => $WEIGHT, 'VPE' => $VPE, 'VIN' => $VIN, 'NL' => $NL, 'TITLE' => $TITLE, 'TEILEART' => $TEILEART]);
dd($record); // результат 1
$NUMBER = $csvarr[1][0];
$NUMBER2 = $csvarr[1][1];
$WEIGHT = $csvarr[1][2];
$VPE = $csvarr[1][3];
$VIN = $csvarr[1][4];
$NL = $csvarr[1][5];
$TITLE = $csvarr[1][6];
$TEILEART = $csvarr[1][7];
$record = vagprice::where('NUMBER', $NUMBER)->update(['NUMBER2' => $NUMBER2, 'WEIGHT' => $WEIGHT, 'VPE' => $VPE, 'VIN' => $VIN, 'NL' => $NL, 'TITLE' => $TITLE, 'TEILEART' => $TEILEART]);
dd($record); // результат 1
$NUMBER = $csvarr[0][0];
$NUMBER2 = $csvarr[0][1];
$WEIGHT = $csvarr[0][2];
$VPE = $csvarr[0][3];
$VIN = $csvarr[0][4];
$NL = $csvarr[0][5];
$TITLE = $csvarr[0][6];
$TEILEART = $csvarr[0][7];
$record = vagprice::where('NUMBER', $NUMBER)->update(['NUMBER2' => $NUMBER2, 'WEIGHT' => $WEIGHT, 'VPE' => $VPE, 'VIN' => $VIN, 'NL' => $NL, 'TITLE' => $TITLE, 'TEILEART' => $TEILEART]);
dd($record); // результат 0
То есть первая строка из массива ни в какую не хочет вставляться.
496354;865;455;0;15;9;zestankel;propilen , Если менять строки местами в csv файле, то все равно первая не вставляется.
Это какая то фантастика, но наяву.
Не в сети
Update не вставляет, а изменяет существующую запись. Если её нет, значит нет
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Не в сети
Почему бы тебе не почитать документацию вместо проб на удачу!
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Не в сети
Да есть же.
У меня две функции в контроллере, одна апдейтит одиночную запись, вторая списком из csv.
Первая функия апдейтит все записи включая первую, вторая функция списком, все кроме первой.
Убиться об стену.
Не в сети
ИМХО, мы говорим на разных языках. Типа кто-то путает запись и поле, вставку и обновление. В документацию!
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Не в сети
Сидел всю ночь над этим, могу и перепутать. Спасибо за участие.
Не в сети
Кстати, твой dd($record); должен показывать сколько строк обновлено, если не ошибаюсь.
0 может означать как то что условие where не позволило ничего обновить (записи нет), так и случай, когда новые значения полей совпали со значеними в существующей записи — фактически ничего не обновлено.
"То есть первая строка из массива ни в какую не хочет вставляться." — не вставляться, а обновляться, т.к. здесь update, а не insert.
Изменено artoodetoo (01.12.2020 13:16:10)
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Не в сети
Кстати сам подумал, что может не заходит запись,
И получил при
$NUMBER = $csvarr[0][0] ; // $NUMBER = 496354 есть значение из csv
vagprice::where('NUMBER', $NUMBER)->get() // НЕ находит $records = 0
vagprice::where('NUMBER','496354')->get() // Находит $records = 1
$NUMBER = (string) $NUMBER;
vagprice::where('NUMBER', $NUMBER)->get() // опять НЕ находит
Поле NUMBER в базе текстовое.
Тоже самое с методом Update, наверное.
Может я не так пише этот запрос
where('NUMBER', $NUMBER)
Изменено alonewalker (01.12.2020 13:34:06)
Не в сети