Helpex - Trao đổi & giúp đỡ Đăng nhập
10

Tôi có một cấu trúc phức tạp được lưu trong cơ sở dữ liệu MySQL bằng cách sử dụng hàm serialize () và sau đó được chuyển đổi lại bằng cách sử dụng unserialize (). Sau khi di chuyển hệ thống từ PHP 5.3 sang PHP 5.6 và hủy số liệu hóa trong 5.6 dữ liệu được tuần tự hóa trên 5.3, các cấu trúc bị hỏng. Thay vào đó, một số tham chiếu đến các đối tượng sẽ xuất hiện dưới dạng mảng.

Câu hỏi của tôi là:

  1. Có thông số kỹ thuật về mã hóa khác nhau được sử dụng bằng cách tuần tự hóa / không chuẩn hóa trong các phiên bản PHP khác nhau không? (Không thể tìm thấy bất kỳ điều gì đủ cụ thể trong các tìm kiếm trên Google của tôi hoặc trong tài liệu trên PHP.net)

  2. Làm cách nào để chuyển đổi dữ liệu tuần tự từ mã hóa PHP 5.3 sang mã hóa PHP 5.6?

10 hữu ích 2 bình luận 2.1k xem chia sẻ
4

Có, việc tuần tự hóa các đối tượng đã được thay đổi trong PHP5.6. Cụ thể, một số lĩnh vực liên quan đến tuần tự hóa các đối tượng đã được đánh dấu trong PHP5.6

Có một lưu ý mơ hồ đề cập đến điều này trong hướng dẫn sử dụng PHP unserialize :

5.6.0 Thao tác với dữ liệu được tuần tự hóa bằng cách thay thế C: bằng O: để buộc khởi tạo đối tượng mà không gọi hàm tạo sẽ thất bại.

Tuy nhiên, nhìn vào danh sách lỗi cho thấy nhiều lỗi hơn đã xảy ra trong báo cáo 68099 . Nó cũng nói rằng định dạng ban đầu không có tài liệu chính thức:

"hành vi ban đầu (mà chúng tôi cho phép định dạng tuần tự hóa cũ được sử dụng cho các lớp sử dụng định dạng mới) chưa bao giờ được ghi lại cũng như không được hỗ trợ chính thức"

Lưu ý rằng kết quả cuối cùng của cuộc thảo luận đó là "Sẽ không sửa chữa được" .

Vì vậy, về cơ bản, các tùy chọn của bạn là:

  • Hãy thử một trong các trình tuần tự khác như một cách xuất dữ liệu giữa các phiên bản PHP. Chẳng hạn như session_encode cũng có thể xử lý các đối tượng.

  • Một tập lệnh chuyển đổi. Có một phiên bản được tài liệu hóa rộng rãi của định dạng hiện tại trên nội bộ PHP , bạn có thể sử dụng phiên bản này với một trình lặp trên định dạng cũ để cập nhật cú pháp.

4 hữu ích 0 bình luận chia sẻ
1

Bạn có thể chuyển đổi dữ liệu được tuần tự hóa sang JSON (sử dụng bản cài đặt PHP 5.3), lưu dữ liệu đó vào cơ sở dữ liệu và sau đó thực hiện ngược lại (sử dụng bản cài đặt PHP 5.6).

Từ 5.3 đến JSON:

$data = unserialize($strSerializedData);
$jsonData = json_encode($data);

Từ JSON đến 5.6:

$data = json_decode($jsonData);
$strSerializedData= serialize($data );

Bạn có thể cần phải điều chỉnh các tùy chọn mà bạn gửi tới json_decode để khớp với dữ liệu gốc.

Tùy chọn này sẽ phụ thuộc vào dữ liệu nào đang được tuần tự hóa. Nếu dữ liệu của bạn là các lớp, điều này sẽ không hoạt động.

Ngoài ra, vấn đề của bạn có thể liên quan đến ghi chú này trong tài liệu ( tại đây ):

5.6.0 Thao tác với dữ liệu được tuần tự hóa bằng cách thay thế C: bằng O: để buộc khởi tạo đối tượng mà không gọi hàm tạo sẽ thất bại.

1 hữu ích 4 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ php serialization migration , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading