如何将整个数组添加到数据库中的一个字段

时间:2011-12-21 21:41:23

标签: sql arrays pdo

我已经尝试了所有东西,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 个答案:

答案 0 :(得分:1)

通常,SQL数据库中的列应该只有一个值,而不是数组。如果您有多个值,则应单独定义值,如果它们是完全不同类型的数据集,则作为单独的列,或者如果数组是相同类型的多个值,则作为依赖表的多行上的单个列数据的。

此规则来自First Normal Form

但是如果你真的需要在一行中存储一个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) );

答案 1 :(得分:0)

我会开始查看implode函数。

您可以将数组中的所有元素添加到数据库中的字段中,表示为字符串。

答案 2 :(得分:0)

一些事情:

  • 您不会将数组插入SQL表中;你插入它的值。
  • 你的SQL表应该有一个&#34;列&#34;对于每个字段(例如namevolumequantity),将获得&#34;行&#34;对于外部数组中的每个条目。
  • 您的SQL中不应该有变量引用。这被称为“SQL注入向量”,并且(由于意外或恶意)最终将对您造成严重破坏。

INSERT所在的位置应该是:

  • 准备一次SQL语句:

    INSERT INTO表(名称,数量,数量)VALUES(?,?,?);

    SQL驱动程序将放置值的?标记,稍后指定。 这告诉数据库准备接受(1个或多个)此表单中的插入,并且 显示数据库驱动程序(PDO,mysqli,...)以后将值放在何处 致电execute

  • 对于数组中的每一行:

    • 使用值列表调用execute,例如->execute ($testar->[$i]->['name'], …