我想在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);
答案 0 :(得分:4)
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