我有来自查询的数据并将其加载到循环内的二维数组中。
我有以下代码但是当它打印出数组时索引丢失了。
如何加载二维aray,第一个索引是$ id值,第二个索引是$ UserEmail,然后我将如何遍历数组以拉出每个索引($ id,$ UserEmail)?< / p>
//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/>";
}
}
请帮忙。
答案 0 :(得分: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
}
此外,在单个数据库列中存储数据列表(在您的案例中是电子邮件)对于数据库规范化来说并不是很好。
您没有类型安全(VARCHAR可以包含任何内容),没有参照完整性,无法使用db实际处理数据(在SELECT,JOIN等中)。 对于db,电子邮件地址列表只是一堆随机字符。
关系数据库模型有一个简单的规则:一个属性,一个值。因此,如果您有多个值,则有多行。这就是你应该首先解决的问题。您需要另一个名为“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 />';