2012-05-21 38 views
9

Tôi muốn lưu thêm thông tin trước khi gửi tổng số tiền đến Paypal. Đối với mỗi mục tôi đã tạo ra một cột trong cơ sở dữ liệu MySQL của tôi, nơi tôi muốn lưu trữ nó. Bây giờ tôi đã suy nghĩ để lưu nó như là một mảng mà tôi có thể đọc sau này để tạo một trang PHP. Các trường bổ sung được lấy từ các trường biểu mẫu đầu vào.Lưu mảng trong cơ sở dữ liệu mysql

Bằng cách sử dụng mảng, tôi có thể chắc chắn không được trộn thông tin không?

+0

"Tôi có một cột cho từng hạng mục" .. bạn có nghĩa là hàng hay không? –

+4

lưu trữ một mảng trong một trường mysql duy nhất đánh bại mục đích của một cơ sở dữ liệu. Mã hiện tại của bạn trông như thế nào? – Cfreak

+0

MySQL 5.7.8 trở lên hiện có hỗ trợ JSON nguyên gốc, có nghĩa là bạn có thể đặt chuỗi JSON trực tiếp vào trường bảng trong cơ sở dữ liệu. – Sliq

Trả lời

24

Bạn có thể lưu trữ mảng bằng cách sử dụng serialize/unserialize. Với giải pháp đó, chúng không thể dễ dàng được sử dụng từ các ngôn ngữ lập trình khác, vì vậy bạn có thể xem xét sử dụng json_encode/json_decode thay thế (cung cấp cho bạn định dạng được hỗ trợ rộng rãi). Tránh sử dụng implode/explode vì điều này vì bạn có thể sẽ bị lỗi hoặc lỗi bảo mật.

Lưu ý rằng điều này làm cho bảng của bạn không được chuẩn hóa, có thể là một ý tưởng tồi vì bạn không thể dễ dàng truy vấn dữ liệu. Do đó hãy cân nhắc kỹ trước khi tiến lên. Có thể bạn cần truy vấn dữ liệu để thống kê hay không? Có lý do nào khác để bình thường hóa dữ liệu không?

Ngoài ra, không lưu mảng thô $_POST. Ai đó có thể dễ dàng tạo biểu mẫu web của riêng họ và đăng dữ liệu lên trang web của bạn, do đó gửi một biểu mẫu thực sự lớn chiếm nhiều không gian. Lưu các trường bạn muốn và đảm bảo xác thực dữ liệu trước khi lưu nó (vì vậy bạn sẽ không nhận được các giá trị không hợp lệ).

+0

xin vui lòng bạn có thể xây dựng trên các lỗ hổng bảo mật xung quanh 'implode()' và 'explode()'. – verbumSapienti

+1

verbumSapienti, hãy xem xét đoạn mã này: 'implode (':', ['12', '34', '5: 6'])' mà kết quả trong chuỗi này: '12: 34: 5: 6'. Điều này không nên xảy ra ở vị trí đầu tiên nếu bạn có xác nhận hợp lệ đầu vào (để không có giá trị nào có thể là '5: 6'), nhưng nó luôn luôn tốt hơn để sử dụng các hàm được tham số hóa và/hoặc luôn xuất dữ liệu rõ ràng hợp lệ, chẳng hạn như json_encode. –

+0

Trước hết có lỗi chính tả trong câu trả lời của bạn (nên được sắp xếp theo thứ tự không phải là serialize). Thứ hai serialize/unserialize là cách tiêu chuẩn để lưu trữ toàn bộ cấu trúc như các chuỗi trong PHP. Bạn có thể tuần tự hóa các đối tượng bao gồm các thuộc tính của chúng, vv JSON là tốt nhất nếu bạn chỉ muốn lưu trữ các mảng vì nó là giải pháp tương thích nhất để sử dụng bên ngoài PHP. Bạn có thể dễ dàng đọc JSON bằng Javascript hoặc các ngôn ngữ khác. – barell

3

Sử dụng hàm PHP serialize() để chuyển đổi mảng thành chuỗi. Những chuỗi này có thể dễ dàng được lưu trữ trong cơ sở dữ liệu MySQL. Sử dụng unserialize() chúng có thể được chuyển đổi thành mảng một lần nữa nếu cần.

+2

trước khi lưu $ store = serizalize ($ someData); $ sql = "chèn vào giá trị PaypalLogs (' store', 'created') ('{$ store}', NOW())"; sau $ someData = unserizalize ($ row ['store']); – Sergey

8

Cách thực hiện những việc như thế là với nối tiếp mảng, có nghĩa là "tạo chuỗi ra khỏi chuỗi". Để hiểu rõ hơn về điều này, có một cái nhìn về vấn đề này:

$array = array("my", "litte", "array", 2); 

$serialized_array = serialize($array); 
$unserialized_array = unserialize($serialized_array); 

var_dump($serialized_array); // gives back a string, perfectly for db saving! 
var_dump($unserialized_array); // gives back the array again 
0
<?php 
$myArray = new array('1', '2'); 
$seralizedArray = serialize($myArray); 
?> 
3

để chuyển đổi bất kỳ mảng (hoặc bất kỳ đối tượng) vào một chuỗi sử dụng PHP, gọi hàm serialize:

$array = array(1, 2, 3); 
$string = serialize($array); 
echo $string; 

$ string bây giờ sẽ giữ một phiên bản chuỗi của mảng. Kết quả của đoạn mã trên như sau:

a:3:{i:0;i:1;i:1;i:2;i:2;i:3;} 

Để chuyển đổi trở lại từ chuỗi mảng, sử dụng unserialize:

// $array will contain (1, 2, 3) 
$array = unserialize($string); 
Các vấn đề liên quan