2011-12-21 153 views
0

我已经尝试了一切,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。

这怎么可能?

我想要的是将整个数组添加到数据库中的一个字段。这是可能的,我该如何安排?

回答

0

我会开始寻找implode函数。

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

+0

只是说这是将整个数组插入单个字段的一种方法。不是在数据库中构建数据的最佳方式。 – 2011-12-21 22:02:45

0

有几件事情:

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

你应该做您的INSERT是,就是:

  • 一次准备SQL语句:

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

    ?标记SQL驱动程序将放置您的值的位置,稍后指定。 这告诉数据库做好准备接受(1个或多个)插入以这种形式,并且 显示数据库驱动程序(PDO,mysqli的,...)放在哪里值时,你以后 电话execute

  • 对于阵列中的每一行:

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

通常,在一个SQL数据库中的列应该只有一个值,而不是阵列。如果您有多个值,则应单独进行赋值,如果它们是一组完全不同类型的数据,则应单独赋值为单独的列;如果数组是多个相同类型的值,则赋值为从属表的多行数据的。

此规则来自First Normal Form

但是,如果您确实需要将PHP数组存储在一行中,则可以使用PHP的serialize()函数将PHP数组转换为字符串。这比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

如果我这样做插入SQL插入数据到数据库。但是,如果$ id foreach($ _ SESSION ['list'] as $ id => $ quantity){'具有不同的值(可以说3),whileloop会生成3个不同的数组,最后插入SQL会将3行添加到数据库。我想要的是一行而不是三行! – dymo 2011-12-22 07:49:55

相关问题