php mysqli_查询函数似乎运行了两次

php mysqli_查询函数似乎运行了两次,php,arrays,mysqli,Php,Arrays,Mysqli,这是我的网站的一个自定义函数,我需要在iframe中显示不同的URL。我只想向用户显示每个url一次,所以我首先创建一个可用url数组,然后创建一个已经看到的url数组,最后比较这两个url,为要显示的url创建一个新数组。然后我需要将这个数组的第一个元素回送到iframe中 function get_urls() { require 'config.php'; global $con; global $currentUsername; $con = mysqli

这是我的网站的一个自定义函数,我需要在iframe中显示不同的URL。我只想向用户显示每个url一次,所以我首先创建一个可用url数组,然后创建一个已经看到的url数组,最后比较这两个url,为要显示的url创建一个新数组。然后我需要将这个数组的第一个元素回送到iframe中

function get_urls() {
    require 'config.php';
    global $con;
    global $currentUsername;
    $con = mysqli_connect($hostname, $dbusername, $dbpassword, $dbname);
    $query = "SELECT sites.site_url FROM sites LEFT JOIN views ON views.site_url=sites.site_url AND views.user='$currentUsername' WHERE sites.site_url IS NOT NULL AND views.site_url IS NULL";
    $result = mysqli_query($con,$query);
    $urlsToShow = mysqli_fetch_assoc($result);
    if (!empty($urlsToShow)) {
        $urlToShow = $urlsToShow['site_url'];
        echo $urlToShow;
        $entry = "INSERT INTO views VALUES ('', '$currentUsername', '$urlToShow')";
        mysqli_query($con,$entry);
    }
    else {echo 'includes/allSeen.php';}
    mysqli_free_result($result);
    mysqli_close($con);
}
问题似乎出在foreach函数中,我在该函数中执行数据库的条目
$entry=“INSERT-into-views-VALUES(“”,$currentUsername’,$urlToShow’)”

我尝试了许多不同的方法,但无论我做什么,我都会从
$urlsToShow
数组中获得两个URL添加到数据库中,其中只有一个在我的iframe中得到响应。结果是,所有其他站点都被完全跳过,用户永远看不到它们

我已经打印了
$urlsToShow
以确保它是一个数组,并且我也打印了
$urlsToShow
以确保它不是数组

我甚至不确定这是否是一个php问题了

代码如下:

function get_urls() {
    require 'config.php';
    global $con;
    global $currentUsername;
    $con = mysqli_connect($hostname, $dbusername, $dbpassword, $dbname);
    $query = "SELECT site_url FROM sites WHERE site_url IS NOT NULL";
    $result = mysqli_query($con, $query);
    // Get all the site urls into one array
        $siteUrls = array();
        $index = 0;
        while($row = mysqli_fetch_assoc($result)) {
            $siteUrls[$index] = $row['site_url'];
            $index++;
        }
    $query2 = "SELECT site_url FROM views WHERE user = '$currentUsername' AND site_url IS NOT NULL";
    $result2 = mysqli_query($con, $query2);
    // Get urls the user has already seen into another array
        $seenUrls = array();
        $index = 0;
        while($row2 = mysqli_fetch_assoc($result2)) {
            $seenUrls[$index] = $row2['site_url'];
            $index++;
        }
    // Compare the two arrays and create yet another array of urls to actually show
    $urlsToShow = array_diff($siteUrls, $seenUrls);
    if (!empty($urlsToShow)) {
        // Echo the url to show for the iframe within browse.php and add an entry to the database that the user has seen this site
        foreach ($urlsToShow as $urlToShow) {
            $entry = "INSERT INTO views VALUES ('', '$currentUsername', '$urlToShow')";
            mysqli_query($con,$entry);
            echo $urlToShow;
            break;
        }
    }
    // Show the allSeen file when all the ads are seen
    else {echo 'includes/allSeen.php';}
    mysqli_free_result($result);
    mysqli_close($con);
}
编辑

我采纳了建议,将函数变小了,但同样的结果仍在发生。两个URL被添加到视图表中,但只有两个URL中的第一个在iframe中得到响应

function get_urls() {
    require 'config.php';
    global $con;
    global $currentUsername;
    $con = mysqli_connect($hostname, $dbusername, $dbpassword, $dbname);
    $query = "SELECT sites.site_url FROM sites LEFT JOIN views ON views.site_url=sites.site_url AND views.user='$currentUsername' WHERE sites.site_url IS NOT NULL AND views.site_url IS NULL";
    $result = mysqli_query($con,$query);
    $urlsToShow = mysqli_fetch_assoc($result);
    if (!empty($urlsToShow)) {
        $urlToShow = $urlsToShow['site_url'];
        echo $urlToShow;
        $entry = "INSERT INTO views VALUES ('', '$currentUsername', '$urlToShow')";
        mysqli_query($con,$entry);
    }
    else {echo 'includes/allSeen.php';}
    mysqli_free_result($result);
    mysqli_close($con);
}
编辑2

我也尝试过使用php readfile();函数,因为我想可能是iframe导致了这个。但是没有,结果是一样的。也许我把函数调用错了

<iframe src="<?php get_urls();?>"/>

您有权访问PHP错误日志吗?我的调试路径有两种:

  • 添加
    静态$calls=0添加到函数顶部,并在其下方添加一行
    error_log('Called'(++$Called)。'time(s.)。这将告诉您是否在同一请求中多次调用它

  • 如果确定它在同一请求中被多次调用,请尝试在debug_backtrace中记录第一个条目

  • 将以下内容放在函数开头,以记录调用函数的位置

    $trace = current(debug_backtrace());
    error_log("Called by {$trace['file']}:{$trace['line']}");
    

    这两件事结合起来应该能找出你的问题。

    我花了两天的时间才最终找出问题的真正原因。很明显,Firefox和Chrome中也存在一个bug(因为我用这两个工具进行了测试,以防万一)

    tldr

    如果将
    标记
    href
    保留为空,脚本将运行两次

    示例(不要这样做):

    href
    需要有一个值


    您可以在这里了解更多信息:

    我尝试添加了debug\u print\u backtrace();就在mysqli_查询之前,我认为它只运行了一次,因为结果是#0 get_URL被调用…关键是利用错误日志。我怀疑这是在发送输出后调用的,或者是在另一个请求中调用的。我自己设法找到了问题所在。谢谢你的帮助。我真的很感激!因此,我们在这里遇到了一个问题,我不知道如何解决(MODS,请插话)。对于实际遇到的问题,我们有一个成功且可重复的解决方案,但最初的问题不包括实际的违规代码。只需在OP中添加有问题的代码(可能会使以前的注释/答案无效)就足够了吗?是否应该重新编写OP以适应?是否应删除离题答案(一旦添加了违规代码)?这应该如何处理?(@ynef,别照我说的做,我们先来听听反馈)。