php mysqli_query函数似乎运行了两次

时间:2015-04-01 10:09:12

标签: php arrays mysqli

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

问题似乎在foreach函数中,我执行数据库$entry = "INSERT INTO views VALUES ('', '$currentUsername', '$urlToShow')";

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

我打印了$urlsToShow以确保它是一个数组,我做了同样的事情以确保$urlToShow不是一个数组。

我甚至不确定这是否是一个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);
}

修改

我接受了建议from here并使功能更小,但仍然会发生相同的结果。两个网址会添加到视图表中,但只有两个网址中的第一个会在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();?>"/>

编辑3

我还尝试在函数中回显iframe html标签以及urlToShow,看看是否有所作为。不,它没有。

任何?

2 个答案:

答案 0 :(得分:1)

您是否可以访问PHP错误日志?我的调试之路有两个方面:

  1. static $calls = 0;添加到该函数的顶部,并在其下方添加一行error_log('Called '.(++$called).' time(s).');。这将告诉您作为同一请求的一部分是否被多次调用。

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

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

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

    结合起来,这两件事应该能够识别你的问题。

答案 1 :(得分:1)

我花了两天的时间才弄清楚这个的实际原因。显然,Firefox和Chrome中也存在一个错误(因为我以两种方式测试了它)。

<强> tldr;

如果您将<link>标记href留空,则脚本将运行两次

示例(不要这样做):

<link rel="Shortcut Icon" href="" type="image/x-icon"/>

href需要有一个值!

您可以在此处详细了解:https://bugzilla.mozilla.org/show_bug.cgi?id=489115