2015-04-01 106 views
0

这是我的网站的自定义函数,我需要在iframe中显示不同的URL。我只想向用户显示每个网址一次,因此我首先创建一个可用的URL的数组,然后是一个已经看到的URL的数组,然后最后比较这两个URL以创建一个用于显示URL的新数组。然后我需要将该数组的第一个元素回显到iframe中。php mysqli_query函数似乎运行两次

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

我有许多不同的方法试过了,但是不管我做什么,我得到两个URL从$urlsToShow阵列加入到数据库,并且只有其中一个会在我的iframe中回显。结果是每个其他站点完全跳过,用户从不会看到它们。

我有print_r'd $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

我也曾尝试echo'ing与urlToShow沿着函数中的iframe的html标签,看看是否有差别。不,它没有。

有人吗?

回答

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

+0

所以我们遇到了一个问题,我不知道如何解决(MODS,请参考)。我们针对实际遇到的问题提供了一种成功且可重复的解决方案,但最初的问题不包括实际的违规代码。仅仅将违规代码添加到OP中就足够了(可能使先前的评论/答案无效)?是否应该重新修改OP?应该删除主题答案(一旦添加了违规代码)?这应如何处理? (@ynef,不要做我说的任何话,先来看看反馈吧)。 – Mike 2015-04-13 18:02:11

1

您有权访问PHP错误日志吗?我调试的路径将是双重的:

  1. 添加static $calls = 0;到函数的顶部,只是在它之下error_log('Called '.(++$called).' time(s).');添加一行。这会告诉你它是否作为同一请求的一部分被调用了多次。

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

放置在函数的开始下列登录功能从调用的位置。

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

合起来,这两样东西应该可以识别你的问题。

+0

我尝试添加debug_print_backtrace();在mysqli_query之前,我认为它只运行一次,因为结果是#0 get_urls在...... – ynef 2015-04-02 12:05:46

+0

处调用这个关键是利用错误日志。我怀疑这是在输出发送后或另一个请求后被调用的。 – Mike 2015-04-03 17:11:42

+0

我设法自己找出问题所在。谢谢您的帮助。对此,我真的非常感激! – ynef 2015-04-06 17:46:56