php mysqli_查询函数似乎运行了两次
这是我的网站的一个自定义函数,我需要在iframe中显示不同的URL。我只想向用户显示每个url一次,所以我首先创建一个可用url数组,然后创建一个已经看到的url数组,最后比较这两个url,为要显示的url创建一个新数组。然后我需要将这个数组的第一个元素回送到iframe中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
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将code>添加到函数顶部,并在其下方添加一行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,别照我说的做,我们先来听听反馈)。