mysql数组入库
class DataIntoTable {
public $conn = [];
function __construct()
{
$servername = 'localhost';
$username = 'root';
$password = '';
$database = 'mytest';
$this->conn = new MySQLi($servername,$username,$password,$database);
if ($this->conn->connect_error) {
die('connection faild:'.$this->conn->connect_error);
}
$this->conn->set_charset('utf8');
}
public function insert($arr = '', $json = true)
{
if ($json) {
$content = json_encode($arr);
} else {
$content = serialize($arr);
}
$query = "insert into myguests (firstname,lastname,email,content) VALUES ('张三','李四','lisi@example.com','$content')";
$result = $this->conn->query($query);
echo $this->conn->error;
$this->conn->close();
}
public function select($ids)
{
$idsstr = '(';
foreach ($ids as $id) {
$idsstr .= $id . ',';
}
$idsstr = substr($idsstr, 0, strlen($idsstr) - 1) . ')';
$query = 'select * from myguests where id in' . $idsstr;
$result = $this->conn->query($query);
if (!$result) {
echo $this->conn->error;
$this->conn->close();
} else {
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
$content = $row['content'];
echo strlen($content) . '<br>';
//serialize 处理过的 $content,使用 unserialize($content) 解析
// var_dump(json_decode($content,true));
// var_dump(unserialize($content));
}
} else {
echo "0 结果";
}
$this->conn->close();
}
}
}
json
数组转json,插入json数据
$arr = array(
array(
'level' => 1,
'discount' => 100,
'content' => '等级1不打折',
'html' => '<div class="new ok source" value="455345"></div>'
)
);
$data = new DataIntoTable();
$data->insert($arr);
入库以后得到的参数出错
入库字符串: [{"level":1,"discount":100,"content":"u7b49u7ea71u4e0du6253u6298","html":"<div class="new ok source" value="455345"></div>"}]
正确编码字符串:[{"level":1,"discount":100,"content":"\u7b49\u7ea71\u4e0d\u6253\u6298","html":"<div class=\"new ok source\" value=\"455345\"><\/div>"}]
可以发现所有的反斜杠“\”全部都不见了,这是因为mysql会自动去掉转义字符。第一个“\”会被认为是转义字符,第二个“\”才会被认为是正常内容。所以需要将所有要保留的“\”转化为“\”,才能不让数据丢失。把insert()方法改一下。
public function insert($arr = '', $json = true)
{
if ($json) {
$content = json_encode($arr);
$content = str_replace('\\', '\\\\', $content);
}
...
}
查询数据
json_decode解析json数据,转换为数组或对象。
$data = new DataIntoTable();
$select = $data->select(array(43));
serialize
数组序列化,插入serialize数据
$arr = array(
array(
'level' => 1,
'discount' => 100,
'content' => '等级1不打折',
'html' => '<div class="new ok source" value="455345"></div>'
)
);
$data = new DataIntoTable();
$data->insert($arr, false);
查询数据
unserialize解析serialize数据,转换为数组。
$data = new DataIntoTable();
$select = $data->select(array(44));
json_decode与serialize优劣
- 从上面的处理可以看出来,json_encode需要做一些特殊字符的转义。特殊字符包括转义字符、特殊符号、非utf8编码字符等等。出现数据丢失的可能性比较大。
- serialize序列化后的字符串比json_decode的要长。随着数组长度的增加,serialize 和json_decode 转换成的字符串长度差距会越来越大。
- 下面是一组 json_decode(上) 和serialize (下)处理相同数组后的长度对比。
135
158
370
426
605
694
…
- 如果要储存的数组只包含单纯的文本且内容不复杂,用json_decode无疑是较好的选择。如果数组内容复杂,包含很多标签符号,那么使用serialize是较好的选择,用字符串的长度增加来换取数据的稳定。