在阵列中存储大量数据的最佳方法是什么?

时间:2015-09-30 13:05:56

标签: php mysql arrays database

我有一个包含100,000个联系人的数据库。

我有一个多选框,我想用它来选择要添加到特定邮件列表的联系人。

我的问题是我目前正在MySQL中以序列化数组格式(PHP)存储邮件列表的数据。

当我选择超过一定数量的联系人时,某些内容似乎会中断(我假设内存不足)并且不会更新数组。

有没有一种在MySQL中存储大型数组的最佳方法,是否有最佳方法可以将内存使用量保持在PHP array()的低位?

代码示例

if(isset($_POST['add'])) {
    $name = $core->EscapeString($_POST['name']);
    $desc = $core->EscapeString($_POST['desc']);
    foreach($_POST['addSelect'] as $null => $id) {
        if(!in_array($id, $recipientArray)) {
            $recipientArray[] = $id;
        }
    }
    $contacts->updateML($lid, $name, $desc, serialize($recipientArray));
}
else if(isset($_POST['rm'])) {
    $name = $core->EscapeString($_POST['name']);
    $desc = $core->EscapeString($_POST['desc']);
    foreach($recipientArray as $null => $id) {
        foreach($_POST['rmSelect'] as $null1 => $id1) {
            if($id == $id1) {
                unset($recipientArray[$null]);
            }
        }
    }
    $contacts->updateML($lid, $name, $desc, serialize($recipientArray));
}

UpdateML功能

//Class 3, Function 16
function updateML($lid = '', $name = '', $desc = '', $recip = '') {
    global $MySQLi;
    $query = "UPDATE `mailing_lists` SET `name` = '".$name."', `desc` = '".$desc."', `recipients` = '".$recip."' WHERE `list_id` = '".$lid."' LIMIT 1";
    $commit = $MySQLi->query($query);
    if($commit == false) {
        die("Issues with the database were detected. Please email peter@domain.com quoting error code: <strong>CLASS3/16.1</strong>.");
    }
    else
    {
        return true;
    }
}

1 个答案:

答案 0 :(得分:3)

你需要2张桌子。一个用于邮件列表定义,一个用于收件人。在收件人表中,您需要有一个将记录与相应邮件列表相关联的外键。

所以mailing_lists表看起来像这样:

ml_id
name
desc

和收件人看起来像这样:

r_id
email
ml_id

首先将邮件列表添加到数据库中:

INSERT INTO mailing_lists SET name = 'my first list', desc = 'mailsareus'

添加新收件人时,只需向收件人表添加新行:

INSERT INTO recipients SET email = 'xxx@mail.com', ml_id = 1

如果您需要从邮件列表中获取所有收件人和定义,只需使用联接

SELECT * FROM mailing_lists JOIN recipients ON recipients.ml_id = mailing_lists.ml_id