2011-12-31 47 views
6

Câu hỏi của tôi là cách tốt nhất và hiệu quả nhất để lưu một mảng php lớn vào bảng mysql là gì. Tôi biết có rất nhiều phương pháp để thực hiện điều này và tôi đã thử một vài trong số đó nhưng tôi vẫn không tìm thấy phương pháp mà tôi thực sự cảm thấy thoải mái khi sử dụng. Phương pháp chính mà hầu hết mọi người đề nghị là các hàm php serialize() và unserialize(). Đối với một số lý do này không phải là làm việc cho tôi và tôi dường như đã cố gắng mọi cách để sửa lỗi này nhưng idk.Cách tốt nhất để lưu dữ liệu mảng PHP vào bảng mysql

Đây là mã của tôi:

// unserialize songs, add new song to end of array, and then re-serialize to add to db 
    $cereal = unserialize($dbsongs); 
    $pushed = array_push($cereal, $_GET['song']); 
    $songs = serialize($pushed); 

    //update playlists table 
    $stmt = $dbh->prepare("UPDATE playlists SET songs=:songs WHERE title=:title AND user=:user"); 
    $stmt->bindParam(':user', $_SESSION['username'], PDO::PARAM_STR); 
    $stmt->bindParam(':title', $_GET['title'], PDO::PARAM_STR); 
    $stmt->bindParam(':songs', $songs, PDO::PARAM_STR); 
    $stmt->execute(); 

Vì vậy, đầu tiên tôi unserialize $ dbsongs đó là danh sách trống dữ liệu tuần tự từ một bảng mysql. Sau đó, tôi đẩy $ _GET ['bài hát'] vào mảng với mảng_push(). Sau đó, tôi serialize đó và lưu nó vào db. Vì một số lý do, điều này không có tác dụng, nhưng tôi cũng muốn biết nếu có cách nào tốt hơn.

Tôi có nên thử phá mảng php và lưu từng mục vào bảng và tách các mục bằng dấu phẩy và chúng phá vỡ chuỗi đó khi tôi truy xuất từ ​​db?

Hoặc tôi có nên khắc phục phương pháp này mà tôi đang sử dụng không? Hoặc thậm chí thêm base64_decode() base64_encode()? Những phương pháp này dường như kinda cũ từ một số trong những điều tôi đã đọc ... http://www.evolt.org/node/60222

Tôi đã thấy một phương pháp sử dụng .implode nhưng tôi không thể tìm ra cách để sử dụng nó ... Link 1Link 2. Điều này trông giống như cách tiếp cận hiện đại nhất mà tôi đã thấy. Đây có phải là những gì tôi nên xem xét thêm?

Không chắc chắn phương pháp này là gì nhưng nó đề cập đến CakePHP mà tôi cho là thư viện php. Đây có phải là phương pháp tốt không? Link 1

Tôi sẽ lưu trữ nhiều mục trong các danh sách này (như hơn 1k mục thường xuyên), vì vậy tôi thậm chí không chắc chắn nếu lưu các mục này vào một trường bảng sẽ phù hợp. Đơn giản chỉ cần tạo một bảng cho các mục này là phương pháp tốt nhất vì danh sách sẽ là bài hát lớn (tạo một mục nhập db mới cho mỗi mục mới được thêm vào và tạo trường "tiêu đề" để liên kết chúng với nhau)? Tôi chưa bao giờ thử nghiệm với một cái gì đó như thế này bởi vì tôi không bao giờ có thể tìm thấy đủ thông tin về bao nhiêu dữ liệu mysql thực sự có thể giữ mà không có vấn đề phát sinh.

Tôi biết có rất nhiều câu hỏi ở đây nhưng mọi câu trả lời sẽ được đánh giá cao! Cảm ơn trước!

-BAH

+1

Bạn có phản đối lưu trữ * bài hát * trong bảng khác và tạo cầu nối không bảng (* playlist_songs *) để xử lý mối quan hệ? Đây là cách truyền thống để làm như vậy với một cơ sở dữ liệu quan hệ như MySQL. –

Trả lời

12

Đầu tiên, hãy để tôi nói rằng serialize() là con đường để đi nếu bạn muốn lưu trữ mảng PHP trong một DB.

Vấn đề của bạn là bạn đã lạm dụng array_push(). Nếu bạn sử dụng nó một cách chính xác, phương thức serialize() sẽ hoạt động. Tôi sẽ giải quyết cách khắc phục mã của bạn cho mục đích này trong giây lát.

Sử dụng tuần tự hóa và lưu trữ tên bài hát được tuần tự hóa trong một trường TEXT thực sự lý tưởng ở đây vì nó làm cho chỉ mục FULLTEXT tìm kiếm thực sự đơn giản (tôi giả định là MySQL). Bạn có thể dễ dàng tìm thấy, ví dụ, tất cả các danh sách có tiêu đề bài hát có chứa từ "tuyệt vời" khi bạn lưu trữ mảng được tuần tự hóa trong một trường đơn lẻ.

Cách khác là tạo ba bảng: một bảng cho danh sách, một cho các bài hát và một cho liên kết giữa các bài hát và danh sách. Sau đó, bạn có thể sử dụng truy vấn LEFT JOIN để khớp các bài hát với danh sách. Trong trường hợp của bạn, tôi muốn lựa chọn cho các tùy chọn cũ, mặc dù.

Phương pháp lưu trữ thực sự phụ thuộc vào cách bạn định truy cập dữ liệu. Nếu bạn cần để có thể phù hợp với tiêu đề bài hát cụ thể một cách nhanh chóng và thường trong một danh sách, các hình thức cơ sở dữ liệu chuẩn hóa được đề cập thứ hai có thể là tốt hơn.

TẠI SAO serialize KHÔNG HOẠT ĐỘNG CHO BẠN NGAY BÂY GIỜ ...

array_push() trả về một số nguyên và các tham số đầu tiên nó nhận được thông qua tham khảo. Điều này có nghĩa rằng dòng:

$pushed = array_push($cereal, $_GET['song']);

là thực sự thiết lập $pushed bằng số phần tử trong mảng $cereal cộng thêm một.

Bạn có thể sửa vấn đề của bạn như sau:

$serial = unserialize($dbsongs); 
$song_count_in_pushed_array = array_push($serial, $_GET['song']); 
$songs = serialize($serial); 

CẬP NHẬT

Đáp lại bình luận của bạn về base64 mã hóa các dữ liệu tuần tự, dưới đây là cách bạn sẽ thực hiện điều này để ngăn chặn tham nhũng dữ liệu với dữ liệu không sạch 8-bit:

// For safe serializing 
$encoded_and_serialized = base64_encode(serialize($array)); 

// For unserializing 
$restored = unserialize(base64_decode($encoded_and_serialized)); 
+0

Tuyệt vời, cảm ơn bạn đã khắc phục! Vì vậy, bạn sẽ giới thiệu phương thức unserialize() và serialize() để lưu danh sách? Điều gì về các hàm base64_decode() và base64_encode(), tôi có cần chúng không (tôi cho rằng điều này phụ thuộc vào dữ liệu nào được lưu, các biến được lưu int vào danh sách bình thường)? Cảm ơn bạn một lần nữa vì đã giúp bạn! – bahudso

+1

Có, tuần tự hóa/unserialize được tạo ra đặc biệt để vận chuyển các cấu trúc dữ liệu (như mảng). Hàm base64 ngăn ngừa sự cố với dữ liệu không phải là [8-bit clean] (http://en.wikipedia.org/wiki/8-bit_clean). Ví dụ: giả sử bạn tuần tự hóa và lưu trữ các mảng chứa chuỗi UTF-16 nhưng collation cơ sở dữ liệu của bạn không hỗ trợ các ký tự đó. Nếu bạn không base64_encode dữ liệu serialized bạn sẽ kết thúc với dữ liệu tham nhũng. Tôi đã thêm một ghi chú vào cuối câu trả lời của tôi để chứng minh điều này. Tuy nhiên, nếu bạn chỉ lưu trữ dữ liệu số, các hàm base64 sẽ không cần thiết. – rdlowrey

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