Как добавить весь массив в одно поле в базе данных - PullRequest
0 голосов
/ 22 декабря 2011

Я перепробовал все, array_push, многомерный массив и т. Д., И у меня ничего не получалось.

Следующая ситуация:

try {
    if (isset($_SESSION['list']) > 0) {
    foreach($_SESSION['list'] as $id=> $quantity) {
            $sQuery = "SELECT * FROM table WHERE id = '".$id."' ";

        $oStmt = $db->prepare($sQuery); 
        $oStmt->execute();

        while($aRow = $oStmt->fetch(PDO::FETCH_ASSOC)) {
            $id = $aRow['id'];
        $name = $aRow['name'];
        $volume = $aRow['volume'];
                    }
        $testar = array(array('name' => $name, 'volume' => $volume, 'quantity' => $quantity));

        $sQuery = "INSERT INTO table (array_data, date) VALUES ('$testar', NOW())";
        $oStmt = $db->prepare($sQuery); 
        $oStmt->execute();

        print_r($testar);
        }
    }
    else {
        echo 'Nothing to add';
    }
    }

    catch(PDOException $e) { 
        $sMsg = '<p> 
    Regelnummer: '.$e->getLine().'<br /> 
    Bestand: '.$e->getFile().'<br /> 
    Foutmelding: '.$e->getMessage().' 
    </p>'; 
    trigger_error($sMsg); 
    }

при печати print_r ($ testar);Я получаю это:

Array ( [0] => Array ( [name] => test 1 [volume] => 1.50 [quantity] => 4 ) ) Array ( [0] => Array ( [name] => test 2 [volume] => 2.50 [quantity] => 5 ) ) Array ( [0] => Array ( [name] => test 3 [volume] => 2.50 [quantity] => 2 ) )

, но когда я добавляю его в базу данных, я вижу только: ARRAY.

Как это возможно?

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

Ответы [ 3 ]

2 голосов
/ 22 декабря 2011

Обычно столбец в базе данных SQL должен иметь только одно значение, а не массив.Если у вас есть несколько значений, вы должны указывать значения по отдельности, либо в виде отдельных столбцов, если они представляют собой набор данных совершенно разных типов, либо в виде одного столбца в нескольких строках зависимой таблицы, если массив содержит несколько значений одного и того же типа.данных.

Это правило взято из Первая нормальная форма .

Но если вам действительно нужно хранить массив PHP в одной строке, вы можете преобразовать массив PHP в строку сPHP serialize () функция.Это лучше, чем implode (), потому что serialize () сохраняет хеш-ключи, массивы массивов и т. Д.

$testar = array(array('name' => $name, 'volume' => $volume, 'quantity' => $quantity));
$testar_serialized = serialize($testar);

$sQuery = "INSERT INTO table (array_data, date) VALUES (?, NOW())";
$oStmt = $db->prepare($sQuery); 
$oStmt->execute( array($testar_serialized) );
0 голосов
/ 22 декабря 2011

Несколько вещей:

  • Вы не вставляете массив в таблицу SQL; Вы вставляете значения этого.
  • Ваша таблица SQL должна иметь «столбец» для каждого поля (например, name, volume, quantity) и получать «строку» для каждой записи во внешнем массиве.
  • В вашем SQL не должно быть ссылки на переменную. Это называется «вектором внедрения SQL», и (из-за несчастного случая или злого умысла) в конечном итоге нанесет вам ущерб.

Что вы должны сделать там, где ваш INSERT, это:

  • один раз подготовьте оператор SQL:

    INSERT INTO таблица (имя, объем, количество) VALUES (?,?,?);

    Знак ?, в котором драйверы SQL будут размещать ваши значения, которые вы укажете позже. Это говорит базе данных, чтобы она была готова принять (1 или более) вставки в этой форме, и показывает драйвер базы данных (PDO, mysqli,…), куда поместить значения, когда вы позже Звоните execute

  • Для каждой строки в массиве:

    • вызов execute со списком значений, например, ->execute ($testar->[$i]->['name'], …
0 голосов
/ 22 декабря 2011

Я бы начал смотреть на функцию implode .

Чем вы можете добавить все элементы массива в поле базы данных, представленное в виде строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...