Хорошо, поэтому я пытаюсь создать пользовательскую функцию, которая будет эхом URL-адреса сайта внутри 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
он возвращает пустой массив.
Во-вторых, скрипт не пишет URL-адрес сайта в базу данных, потому что $urlToShow
– это массив, который не является единственным URL-адресом?
Я думаю, проблема в вашем коде в том месте, где вы создаете свои $ 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($row2 = mysqli_fetch_assoc($result2)) { $seenUrls[$index] = $row2; $index++; }
к
while($row2 = mysqli_fetch_assoc($result2)) { $seenUrls[$index] = $row2['site_url']; $index++;
} и попробовать
я не буду запускать два запроса и попытаюсь объединить массив результатов. вы можете использовать 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 с сайтов, которые не имеют записи в таблице представлений. LEFT JOIN
присоединяется к двум таблицам, и для каждой несогласованной строки в view.site_url будут значения NULL, поэтому я проверяю IS NULL
.
Ваша экономия $ urlToShow должна работать, если вы установите значение поля строки $ row, а не $ row, как было предложено, но если вы хотите проверить, что находится в переменной, не используйте echo
используйте это:
print_r($urlToShow);
Если переменная является массивом, тогда вы увидите ее содержимое.
@Azeez Kallayi – вам не нужно индексировать массив вручную.
$seenUrls[] = $row2['site_url'];
Кроме того, вы можете получить все результаты
$rows = mysqli_fetch_all($result2,MYSQLI_ASSOC); foreach($rows as $row){ echo $row['site_url']; }