将多维数组插入MySQL表文本字段

时间:2014-02-09 14:04:20

标签: php mysql sql arrays multidimensional-array

我想在MySQL数据库字段中插入一个多维数组,以便以后可以轻松地从数据库中读回数组。实现这一目标的最佳方法是什么?

我尝试过以下无效:

$id    = "MXB-487"
$items = Array(Array("Coffee", "Blend", "500"), Array("Coffee1", "Blend1", "250"));
$items = implode(",", $items);
mysqli_query($con,"INSERT INTO carts (id, items) 
VALUES ($id, $items)");

/*Code that pulls the array from the Database based on id and stores in variable $info*/
restored_mdarray = explode(",", $info);

2 个答案:

答案 0 :(得分:4)

MySql中的

ID通常是唯一的(我很确定你是这样指定的)。因此,您无法共享多个项目的ID。此外,内爆将最终得到以下查询:

INSERT INTO carts (id, items) VALUES(MXB-487, Array, Array)

因为你有一个多维数组,你试图内爆,它不会递归内爆。

你应该做的是遍历对象,我不确定这里的关系是如何工作的,但看起来你需要一个关系表来连接这些项目。考虑以下结构:

    Carts:
    +----------+-----------+
    |    ID    |   Name    |
    +----------+-----------+
--<-|  MXB-487 | Blah blah |
|   +----------+-----------+
|
|   Items:
|   +----------+-----------+----------+-----------+
|   | Cart_ID  | Type1     | Type 2   | Amount    |
|   +----------+-----------+----------+-----------+
--->| MXB-487  | Coffee    | Blend    | 500       |
    +----------+-----------+----------+-----------+

为了在PHP中实现它,你可以这样做:

<?php
$id = "MXB-487";
$items = array(
    array("Coffee", "Blend", "500"),
    array("Coffee1", "Blend1", "500"),
);

$sql = "INSERT INTO actions (cart_id, type1, type2, amount) VALUES ";

$items_sql = array();
if (count($items)) {
    foreach ($items as $item) {
        $items_sql[] = "('$id', '{$item[0]}', '{$item[1]}', '{$item[2]}')";
    }
}

$sql .= implode(", ", $items_sql);

然后运行查询。

看起来像这样:

INSERT INTO actions (cart_id, type1, type2, amount) VALUES ('MXB-487', 'Coffee', 'Blend', '500'), ('MXB-487', 'Coffee1', 'Blend1', '500')

您可以稍后选择:

<?php
$id = "MXB-487";

$sql = "SELECT * FROM actions WHERE (cart_id = '$id')";

虽然作为附注,我建议您查看PDO以及如何绑定值,或者至少学会在SQL中转义您的值以防止将来注入。

我推测了表格的结构,当然你可以根据自己的需要进行修改。

要通过SQL正确连接表(以便稍后提取),您可以在定义表时使用FOREIGN KEY:

CREATE TABLE actions (
    id INT(11) NOT NULL AUTO_INCREMENT,
    cart_id VARCHAR(32) NOT NULL,
    type1 VARCHAR(32) NOT NULL,
    type2 VARCHAR(32) NOT NULL,
    amount INT NOT NULL,

    PRIMARY KEY (id),
    FOREIGN KEY (cart_id) REFERENCES carts(id)
)

答案 1 :(得分:2)

使用serialize

$a = array(array(1,2,3), array(3,4,5));
$b = serialize($a);
# write $b to and later read $b from database
$c = unserialize($b);
$a == $c   # => true