You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>"; // 邮箱间添加分隔
}
?>

修复说明

  1. 避免数组覆盖:将原始频道ID数组改名为$channelIds,不再在循环中修改它。
  2. 启用并正确生成$idOnly:从XML的id字段中提取正确的频道ID,确保链接参数正确。
  3. 添加错误处理:数据库连接、查询、XML加载都增加了异常判断,避免程序直接崩溃。
  4. 安全优化:使用htmlspecialchars转义输出内容,urlencode处理URL参数,避免XSS和URL编码问题。
  5. 代码优化:改用foreach遍历频道ID,代码更简洁;及时关闭数据库连接;使用isset判断最新视频是否存在。

内容的提问来源于stack exchange,提问作者Faisal Khan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 22:01:27