我有一个包含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;
}
}
答案 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