Как сохранить массив в бд

326
19 июня 2021, 05:10
$file = file("P1802FAT_2017-02-19_08.55.11.dat");
foreach ($file as $value) {
$arr = explode(":", $value);
$sql = "INSERT INTO dat (beginheader, clk, typ, starttime, frames, starttrigger, stoptrigger, pda_reftimestamp, module_name_0, module_name_1, module_name_2, module_name_3, module_name_4, module_name_5, module_name_6, module_name_7, version, pdakeyinfo, pdakeyinfo2, pdadongleId, beginchannel, name, unit, pda_comment1, digchannel, pda_tbase, pda_typ, minscale, maxscale, xoffset, channel_offset, endchannel, endascii) VALUES ('$arr[1]')";
if (mysqli_query($link, $sql)) {
    echo "Запись успешно сохранена.";
} else {
    echo "Ошибка: Не удалось выполнить $sql. " . mysqli_error($link);
}

}

В браузере:

Ошибка: Не удалось выполнить INSERT INTO dat (beginheader, clk, typ, starttime, frames, starttrigger, stoptrigger, pda_reftimestamp, module_name_0, module_name_1, module_name_2, module_name_3, module_name_4, module_name_5, module_name_6, module_name_7, version, pdakeyinfo, pdakeyinfo2, pdadongleId, beginchannel, name, unit, pda_comment1, digchannel, pda_tbase, pda_typ, minscale, maxscale, xoffset, channel_offset, endchannel, endascii) VALUES (' '). Column count doesn't match value count at row 1Ошибка: Не удалось выполнить INSERT INTO dat (beginheader, clk, typ, starttime, frames, starttrigger, stoptrigger, pda_reftimestamp, module_name_0, module_name_1, module_name_2, module_name_3, module_name_4, module_name_5, module_name_6, module_name_7, version, pdakeyinfo, pdakeyinfo2, pdadongleId, beginchannel, name, unit, pda_comment1, digchannel, pda_tbase, pda_typ, minscale, maxscale, xoffset, channel_offset, endchannel, endascii) VALUES ('0.01 ').

Answer 1

Вы пытаетесь присвоить всем, или не всем полям в БД какое-то значение. MySQL не поддерживает хранение массивов. Сейчас у вас такой запрос(условно):

Присвой полям(имя, фамилия, отчество) значения(array), MySQL видит это так:

имя => array,
фамилия => Мне ничего не присвоили, выкину ошибку :(
отчество => Мне ничего не присвоили, выикину ошибку :(

У вас есть массив полей INSERT INTO dat (beginheader, clk,...) и должен быть соответствующий массив значений VALUES('someinfo', '123', ...). Так как вы используете "голый" sql-запрос, а не пользуетесь PDO - то могу предложить вам использовать следующий код:

$file = file("P1802FAT_2017-02-19_08.55.11.dat");
foreach ($file as $value) {
    $arr = explode(":", $value); // тут мы получили массив значений из строки
    $sql = "INSERT INTO dat (beginheader, clk, typ, starttime, frames, starttrigger, 
    stoptrigger, pda_reftimestamp, module_name_0, module_name_1, module_name_2, 
    module_name_3, module_name_4, module_name_5, module_name_6, module_name_7, version, 
    pdakeyinfo, pdakeyinfo2, pdadongleId, beginchannel, name, unit, pda_comment1, 
    digchannel, pda_tbase, pda_typ, minscale, maxscale, xoffset, channel_offset, 
    endchannel, endascii)";
    $values = implode(',', $arr) // тут мы "склеили" все значения в строку
    $sql .= " VALUES({$values})" // и тут просто дополнили наш sql-запрос
    if (mysqli_query($link, $sql)) {
        echo "Запись успешно сохранена.";
    } else {
        echo "Ошибка: Не удалось выполнить $sql. " . mysqli_error($link);
    }
}

НАПОМНЮ, что количество полей и количетсво значений ДОЛЖНО совпадать.

Об методе implode

READ ALSO
Капча в приложении, не использующем сессии

Капча в приложении, не использующем сессии

В приложении требуется использовать капчуГенерация и проверка капчи должна быть реализована локально, без использования внешних сервисов...

113
проблема с записью в базу данных mysql

проблема с записью в базу данных mysql

После перехода по ссылке на подтверждение емайл данные не записываются в базу данныхНе могу понять в чем проблема?

82
RedBeanPHP и PHP switch: case

RedBeanPHP и PHP switch: case

Есть рабочий вариант кода страницы, для вывода текста из БД с помощью RedBeanPHP:

93