PHP循环遍历数据异常:仅首个邮箱数据展示正常
问题:仅首个邮箱能正常生成带参数的YouTube频道链接,其余邮箱异常
现有PHP代码从数据库获取邮箱,为每个邮箱遍历指定YouTube频道数据并生成带邮箱参数的链接,但仅首个邮箱的数据能正常展示,其余邮箱均异常。需求是为每个收集到的链接添加对应用户邮箱参数,并为每个邮箱重复执行该操作。
原代码
<?php $id = array( "UC4MubF2asPHQbXN44DVNeXg", "UCXuDgoo_oiZf8UkIXs3Y_kw", "UCMnDuOzzJrWzr5tfemDcqlQ", "UC9FH1mkHLFQuPPEPu9CfR1A", "UCfyEAw41i7PRetP2erYf9dg", ); // Getting Emails from DB and Looping with Channel Title and Video Title $conn = mysqli_connect("localhost","username","password","dbname"); $query = "SELECT * FROM prospects ORDER BY email"; $rows = mysqli_query($conn, $query); while($row = mysqli_fetch_array($rows)) { $to[] = $row['email']; } $size = sizeof($id); //echo "<br>Number of channel Ids: ".$size."<br><br>"; // Looping each Url for Each Email to get Data foreach($to as $t){ echo $t."<br>"; for ($i = 0; $i < $size; $i++) { $url = "https://www.youtube.com/channel/$id[$i]"; // echo $url."<br>"; $channel = trim(explode('https://www.youtube.com/channel/', $url)[1]); // echo $channel."<br>"; $rss = "https://www.youtube.com/feeds/videos.xml?channel_id=$channel"; // echo $rss."<br>"; $xml = simplexml_load_file($rss); $title = $xml->title; // echo $title."<br>"; $videoTitle = $xml->entry[0]->title; // echo $videoTitle."<br>"; $id[$i] = $xml->id; // echo $id[$i]."<br>"; // $idOnly = substr($id[$i] , strpos($id[$i] , "yt:channel:") + 11); // echo $idOnly."<br>"; $pub[$i] = $xml->entry[0]->published; // echo $pub[$i]."<br>"; $realDate_ = new DateTime($pub[$i]); // var_dump($realDate_); $realDate2_ = $realDate_->format("D, d M Y")."<br>"; //echo $realDate2_; $today_ = new DateTime(); // $today2_ = $today_->format("D, d M Y")."<br>"; // echo $today2_; // if ($today2_ == $realDate2_) { // echo "true"; // This is the Result with Every Email echo $content = "• <a href='https://bladingflix.com/render.php?email=$t&channel=$idOnly'>".$title." - ".$videoTitle."</a><br>"; // } } } ?>
问题分析
- 频道ID数组被覆盖:循环中执行
$id[$i] = $xml->id;,直接修改了初始定义的频道ID数组,后续邮箱循环时,$id[$i]已不是原始频道ID,无法生成正确的RSS链接。 $idOnly变量未启用:代码中注释掉了$idOnly的定义,生成链接时使用未定义的变量,导致channel参数错误。- 缺少错误处理:数据库连接、XML加载未做错误判断,遇到异常会直接中断执行。
修复后的代码
<?php // 原始频道ID数组,改名避免被覆盖 $channelIds = array( "UC4MubF2asPHQbXN44DVNeXg", "UCXuDgoo_oiZf8UkIXs3Y_kw", "UCMnDuOzzJrWzr5tfemDcqlQ", "UC9FH1mkHLFQuPPEPu9CfR1A", "UCfyEAw41i7PRetP2erYf9dg", ); // 数据库连接并添加错误处理 $conn = mysqli_connect("localhost", "username", "password", "dbname"); if (!$conn) { die("数据库连接失败: " . mysqli_connect_error()); } $query = "SELECT email FROM prospects ORDER BY email"; $rows = mysqli_query($conn, $query); if (!$rows) { die("查询失败: " . mysqli_error($conn)); } $to = []; while ($row = mysqli_fetch_assoc($rows)) { $to[] = $row['email']; } mysqli_close($conn); // 用完数据库连接及时关闭 $channelCount = count($channelIds); // 遍历每个邮箱 foreach ($to as $email) { echo htmlspecialchars($email) . "<br>"; // 遍历每个频道 foreach ($channelIds as $channelId) { $rssUrl = "https://www.youtube.com/feeds/videos.xml?channel_id=$channelId"; $xml = simplexml_load_file($rssUrl); // 检查XML加载是否成功 if (!$xml) { echo "• 无法加载频道数据: $channelId<br>"; continue; } $channelTitle = (string)$xml->title; $latestVideoTitle = isset($xml->entry[0]->title) ? (string)$xml->entry[0]->title : "无最新视频"; // 提取频道ID(从XML的id字段) $xmlChannelId = (string)$xml->id; $idOnly = substr($xmlChannelId, strpos($xmlChannelId, "yt:channel:") + 11); // 生成带参数的链接,转义特殊字符避免XSS $linkUrl = sprintf( "https://bladingflix.com/render.php?email=%s&channel=%s", urlencode($email), urlencode($idOnly) ); echo "• <a href='$linkUrl'>" . htmlspecialchars($channelTitle . " - " . $latestVideoTitle) . "</a><br>"; } echo "<br>"; // 邮箱间添加分隔 } ?>
修复说明
- 避免数组覆盖:将原始频道ID数组改名为
$channelIds,不再在循环中修改它。 - 启用并正确生成
$idOnly:从XML的id字段中提取正确的频道ID,确保链接参数正确。 - 添加错误处理:数据库连接、查询、XML加载都增加了异常判断,避免程序直接崩溃。
- 安全优化:使用
htmlspecialchars转义输出内容,urlencode处理URL参数,避免XSS和URL编码问题。 - 代码优化:改用
foreach遍历频道ID,代码更简洁;及时关闭数据库连接;使用isset判断最新视频是否存在。
内容的提问来源于stack exchange,提问作者Faisal Khan
相关产品推荐
相关产品推荐

