Что-то не так с моей пользовательской функцией php

Хорошо, поэтому я пытаюсь создать пользовательскую функцию, которая будет эхом 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-адресом?

Related of "Что-то не так с моей пользовательской функцией php"

Я думаю, проблема в вашем коде в том месте, где вы создаете свои $ 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']; }