好的,所以我正在尝试创建一个自定义函数,它将回显最终用户在iframe中的网站网址。
脚本必须检查用户是否已经看过该网站,以及他们是否已经看到它不再显示它,而是从数据库中取出另一个网站URL等。
这是我到目前为止所提出的:
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;
$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;
$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) {
echo $urlToShow;
$query = "INSERT INTO views VALUES ('', '$currentUsername', '$urlToShow')";
mysqli_query($con, $query);
break;
}
}
// Show the allSeen file when all the ads are seen
else {echo 'includes/allSeen.php';}
mysqli_free_result($result);
mysqli_close($con);
}
我目前发现了两个错误。首先$ siteUrls和$ seenUrls都没关系,但是当我使用array_diff
比较两者时,它会返回一个空数组。
其次,脚本不会将网站网址写入数据库,因为$urlToShow
是一个数组而不是一个网址?
答案 0 :(得分:1)
我认为问题在于您的代码位于您创建$ siteUrls,$ seenUrls数组的位置。 mysqli_fetch_assoc()函数会将结果行作为关联数组。因此,如果您想在while循环中更改一些代码。 请点击这个
while($row = mysqli_fetch_assoc($result)) {
$siteUrls[$index] = $row;
$index++;
}
要
while($row = mysqli_fetch_assoc($result)) {
$siteUrls[$index] = $row['site_url'];
$index++;
}
并且在第二个while循环中也是如此。改变这个
while($row2 = mysqli_fetch_assoc($result2)) {
$seenUrls[$index] = $row2;
$index++;
}
要
while($row2 = mysqli_fetch_assoc($result2)) {
$seenUrls[$index] = $row2['site_url'];
$index++;
} 并尝试
答案 1 :(得分:1)
我不会运行两个查询并尝试合并结果数组。您可以使用mysql本身返回尚未看到的网站:
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
这将仅返回来自站点的site_urls,这些站点在views表中没有条目。 LEFT JOIN
将连接两个表,对于每个不匹配的行,views.site_url中将有NULL值,这就是我检查IS NULL
的原因。
保存$ urlToShow应该有效,如果你按照建议设置为$ row字段内容而不是$ row本身,但是如果要检查变量中的内容,请不要使用echo
使用此功能:
print_r($urlToShow);
如果变量是一个数组,那么你会看到它的内容。
答案 2 :(得分:0)
@Azeez Kallayi - 您不需要手动索引数组。
$seenUrls[] = $row2['site_url'];
此外,您可以获取所有结果
$rows = mysqli_fetch_all($result2,MYSQLI_ASSOC);
foreach($rows as $row){
echo $row['site_url'];
}