1

クエリから取得したデータがあり、ループ内の2次元配列にロードしています。

以下のコードがありますが、配列を出力するとインデックスがありません。

最初のインデックスが$id値で、2番目のインデックスが$ UserEmailである2次元の配列をロードするにはどうすればよいですか?次に、配列をループして各インデックス($ id、$ UserEmail)を引き出すにはどうすればよいですか?

//the query
$query = "select id, UserEmail from User";
$result = mysql_query($query);
while($row = mysql_fetch_array($result))
{
    $ue = $row['UserEmail'];
    $id = $row['id'];
    if (strpos($ue,','))
    {
        $UserArrayEmail = explode(',',$ue);
        foreach ($UserEmailArray as $u)
        {
            $ArrayTerm[$id][] = $u;
        }
    }
}

//looping through the array and getting value from $id and $UserEmail
foreach( $ArrayTerm as $ArrayT ) {
    print_r($ArrayT);
    foreach( $ArrayT as $value ) {
        echo $value . "<br/>";
    }
}

助けてください。

4

1 に答える 1

2

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 />'; 
于 2013-01-28T09:29:03.490 に答える