mysql_connect()は非推奨です。ソリューションでは、代わりにPDOを使用する必要があります。
これは、PDOで実行できる方法であり、インデックスを修正します。
//fetch array from query
try {
$dbh = new PDO("mysql:host=$host; dbname=$dbname", $user, $pass);
} catch (PDOException $e) {
// db error handling
}
$sth = $dbh->prepare("select id, UserEmail from user");
$sth->setFetchMode(PDO::FETCH_ASSOC);
$sth->execute();
while($row = $sth->fetch())) {
$emails = $row['UserEmail'];
$id = $row['id'];
if (strpos($emails,',')) {
$UserEmailArray = explode(',',$emails);
foreach ($UserEmailArray as $email) {
$ArrayT[$id][] = $email;
}
}
}
//repeat the same but with PDO data with other loops
}
さらに、データのリスト(この場合は電子メール)を単一のdb列に格納することは、dbの正規化には適していません。
型安全性(VARCHARには何でも含めることができます)、参照整合性、dbを使用してデータを実際に処理する方法(SELECT、JOINなど)はありません。データベースの場合、電子メールアドレスのリストは単なるランダムな文字の集まりです。
リレーショナルデータベースモデルには、1つの属性、1つの値という単純なルールがあります。したがって、複数の値がある場合は、複数の行があります。それが最初に修正する必要があるものです。「user_email_addresses」などの名前の別のテーブルが必要になります。
この新しいテーブルでは、次のようになります。
function html_escape($raw) {
return htmlentities($raw, ENT_COMPAT , 'utf-8');
}
function log_exceptions($exception) {
echo $exception->getMessage(), '<br />', $exception->getTraceAsString();
}
set_exception_handler('log_exceptions');
$database = new PDO( 'mysql:host=localhost;dbname=DB', 'USER', 'PASS', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION) );
$user_emails = array();
$emails = $database->query('
SELECT user_id , email
FROM user_email_addresses');
foreach ($emails as $email)
$user_emails[ $email['user_id'] ][] = $email['email_address'];
//address list
foreach ($user_emails as $user_id => $email_addresses) {
echo 'User: ' . html_escape($user_id) . '<br />';
foreach ($email_addresses as $email_address)
echo html_escape($email_address) . '<br />';
echo '<br />';