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是较好的选择,用字符串的长度增加来换取数据的稳定。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值