phpmysqli_query函数好像是运行两次
php mysqli_query function seems to run twice
这是我网站的自定义功能,我需要在 iframe 中显示不同的 URL。我只想向用户显示每个 url 一次,所以我首先创建一个可用 url 的数组,然后是一个已经看到的 url 的数组,最后比较两者以创建要显示的 urls 的新数组。然后我需要将这个数组的第一个元素回显到 iframe 中。
问题似乎出在我执行数据库输入的 foreach 函数中 $entry = "INSERT INTO views VALUES ('', '$currentUsername', '$urlToShow')";
我尝试了许多不同的方法,但无论我做什么,我都从 $urlsToShow
数组中得到两个 url 添加到数据库中,并且只有其中一个在我的 iframe 中回显。结果是所有其他网站都被完全跳过,用户永远不会看到它们。
我已经 print_r 了 $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);
}
编辑
我采纳了建议 并缩小了函数的大小,但仍然出现同样的结果。两个 url 被添加到视图 table,但只有第一个在 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 以查看是否有所不同。不,它没有。
有人吗?
您可以访问 PHP 错误日志吗?我的调试路径有两个:
将static $calls = 0;
添加到函数的顶部,并在其正下方添加一行error_log('Called '.(++$called).' time(s).');
。这将告诉您它是否作为同一请求的一部分被多次调用。
如果您确定它在同一个请求中被多次调用,请尝试在 debug_backtrace.
中记录第一个条目
将以下内容放在函数的开头以记录调用函数的位置。
$trace = current(debug_backtrace());
error_log("Called by {$trace['file']}:{$trace['line']}");
结合起来,这两件事应该可以确定您的问题。
我花了两天时间终于弄清楚了真正的原因。显然在 Firefox 和 Chrome 中也有一个错误(因为我用两者都测试过以防万一)。
tldr;
如果您将 <link>
标签 href
留空,脚本将 运行 两次
示例(不要这样做):
<link rel="Shortcut Icon" href="" type="image/x-icon"/>
href
需要有值!
您可以在此处阅读更多相关信息:https://bugzilla.mozilla.org/show_bug.cgi?id=489115
这是我网站的自定义功能,我需要在 iframe 中显示不同的 URL。我只想向用户显示每个 url 一次,所以我首先创建一个可用 url 的数组,然后是一个已经看到的 url 的数组,最后比较两者以创建要显示的 urls 的新数组。然后我需要将这个数组的第一个元素回显到 iframe 中。
问题似乎出在我执行数据库输入的 foreach 函数中 $entry = "INSERT INTO views VALUES ('', '$currentUsername', '$urlToShow')";
我尝试了许多不同的方法,但无论我做什么,我都从 $urlsToShow
数组中得到两个 url 添加到数据库中,并且只有其中一个在我的 iframe 中回显。结果是所有其他网站都被完全跳过,用户永远不会看到它们。
我已经 print_r 了 $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);
}
编辑
我采纳了建议
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 以查看是否有所不同。不,它没有。
有人吗?
您可以访问 PHP 错误日志吗?我的调试路径有两个:
将
static $calls = 0;
添加到函数的顶部,并在其正下方添加一行error_log('Called '.(++$called).' time(s).');
。这将告诉您它是否作为同一请求的一部分被多次调用。如果您确定它在同一个请求中被多次调用,请尝试在 debug_backtrace.
中记录第一个条目
将以下内容放在函数的开头以记录调用函数的位置。
$trace = current(debug_backtrace());
error_log("Called by {$trace['file']}:{$trace['line']}");
结合起来,这两件事应该可以确定您的问题。
我花了两天时间终于弄清楚了真正的原因。显然在 Firefox 和 Chrome 中也有一个错误(因为我用两者都测试过以防万一)。
tldr;
如果您将 <link>
标签 href
留空,脚本将 运行 两次
示例(不要这样做):
<link rel="Shortcut Icon" href="" type="image/x-icon"/>
href
需要有值!
您可以在此处阅读更多相关信息:https://bugzilla.mozilla.org/show_bug.cgi?id=489115