2015-09-28 21 views
6

Tôi có giải pháp lưu trữ phiên dựa trên cơ sở dữ liệu. Hoạt động tuyệt vời! Tuy nhiên tôi có một vấn đề với nó lưu trữ một loại dữ liệu cụ thể.Dữ liệu tuần tự hóa PHP được lưu trữ trong lỗi db mysql

Tôi có một ứng dụng sử dụng mã thông báo CSRF. Khi một biểu mẫu được tạo, nó sẽ tạo một mã thông báo cho biểu mẫu đó. Mã thông báo là giá trị băm (sha256) của các loại giá trị khác nhau. Một bản sao đi vào biểu mẫu và một bản sao khác được lưu trữ trong các phiên. Khi gửi biểu mẫu, nó so sánh các mã thông báo để đảm bảo chúng khớp nhau.

Dưới đây là một ví dụ của hàm hủy mà cập nhật db với các dữ liệu mới

UPDATE session_manager SET variables= :variables WHERE 1=1 AND id = :id 
array(2) { 
    [":variables"]=> 
     string(152) "a:1:{s:4:"CSRF";a:1:{s:8:"register";a:2:{s:5:"token";s:64:"e749603241dec1911ef3a40d98b2f5185d389434060483297394b504cc904ede";s:4:"time";i:1443456816;}}}" 
    [":id"]=> 
     string(2) "49" 
} 

Cập nhật tuyên bố là tốt và hoạt động tốt. Đây là vấn đề tôi có, dữ liệu được cập nhật tuy nhiên giá trị 'mã thông báo' mà bạn có thể thấy trong dữ liệu ở trên không giống với giá trị trong db bên dưới (Đây là bản tải xuống nhị phân của dữ liệu):

a:1:{s:4:"CSRF";a:1:{s:8:"register";a:2:{s:5:"token";s:64:"b48fc79fc2f51eff765c05476895238a42d9d45b2c1aeb7c6e4582d0381b7f4f";s:4:"time";i:1443456817;}}} 

Có vẻ như mysql đang thay đổi giá trị và tôi không thể cho cuộc sống của tôi tìm ra vấn đề. Giải pháp Tôi đã thử bao gồm:

  • serialize
  • json_encode
  • base64

bảng mã đang thay đổi của các db và những gì không. Đã thử các kiểu trường khác nhau trong db ví dụ TEXT, Longtext và BLOB. Mà dường như không làm việc cho tôi :(

Đây là sql cho db

CREATE TABLE session_manager(
    id BIGINT(11) PRIMARY KEY AUTO_INCREMENT NOT NULL, 
    session_id VARCHAR(200), 
    user_agent TINYTEXT NOT NULL, 
    variables BLOB NOT NULL, 
    initial_time DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, 
    regenerate_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL 
); 

Bất kỳ lý do mà bật trong tâm trí?

+1

Tôi không nghĩ rằng MySQL đang thay đổi giá trị của bạn.Bạn phải cho ăn cập nhật của bạn một chuỗi khác trong mã php của bạn ... bạn đang sử dụng câu lệnh chuẩn bị cho bản cập nhật của mình ... Hãy thử một 'echo $ tokenValue;' ngay trước câu lệnh cập nhật để xác minh giá trị –

+0

Mảng bạn thấy sau khi câu lệnh cập nhật là một kết xuất của các tham số ràng buộc trước khi thực hiện truy vấn db. – Tim

+0

Sử dụng 'Văn bản 'làm loại, nó có thể không giải quyết được vấn đề nhưng đó là một đề xuất giải quyết vấn đề. Tôi phải đối mặt với nó. –

Trả lời

1

Bạn đã nhìn time chỉ số của mảng của bạn? Nó Điều này làm cho tôi nghĩ rằng phương pháp để lưu phiên được thực thi (ít nhất) hai lần, lần thứ hai phiên được cập nhật và ghi đè lên giá trị cũ. hoặc in/ghi nhật ký theo dõi ngăn xếp ry thời gian chức năng của bạn được gọi là. Điều này sẽ cung cấp cho bạn một ý tưởng khá tốt khi giá trị được cập nhật một lần nữa.

PS: Truy vấn cập nhật có được gọi lại trên yêu cầu tiếp theo không, trước khi bạn có thể truy xuất giá trị?

+0

Vâng, tôi nhận thấy nó sau khi cố gắng tìm kiếm giải pháp. Tôi đã giải quyết được vấn đề của mình. Không, bản cập nhật nằm trong chức năng hủy. Chúc mừng – Tim

1

Ok. Vì vậy, sau khi điều tra thêm và tham gia vào đầu vào từ tất cả mọi người (Cheers by the way). Tôi đã giải quyết được vấn đề của mình.

Hóa ra nó không liên quan gì đến mysql cả. Nó thực sự đã làm với "favicon.ico". Tôi sử dụng url ưa thích như bạn làm và bởi vì tôi đang ở trong dev, tôi không bao giờ bận tâm với favicon. Theo mặc định, khi tải trang, nó cố gắng tìm một favicon (http://localhost/favicon.ico). Hệ thống giả định rằng người dùng đang cố gắng truy cập một bộ điều khiển (tôi sử dụng mvc) và bởi vì bộ điều khiển không tồn tại, nó chuyển hướng đến trang chủ. Trang chủ yêu cầu mã thông báo được tạo vì có biểu mẫu trên đó và kết quả là nó tạo mã thông báo lần thứ hai làm mất hiệu lực mã thông báo ban đầu. Đó là điều tôi nhận ra sau khi xem xét tất cả các kết nối mạng thông qua bảng điều khiển dành cho nhà phát triển.

Các vấn đề liên quan