Ссылки (модуль phpFOX 3)

8:33 20.06.2017
В phpFOX, как и во многих социальных сетях есть возможность добавить ссылку на страницу.

Инструмент для удаления лишних записей в таблице phpfox_link (ссылок)
Написал инструмент для удаления лишних записей в таблице phpfox_link. Сценарий выбирает все записи с таблицы phpfox_link, затем делает проверку по двум таблица phpfox_feed и phpfox_pages_feed, те записи, которые не найдены в этих двух таблицах, можно будет сразу удалить, нажав на ссылку Удалить.

И так, создаем файл: tool.php с таки содержимым:
<html> 
<head>
    <meta charset="utf-8">
    <title>Поиск лишних записей</title>
</head>
<body>

<?php
$dbhost    = '';
$dbuser    = '';
$dbpasswd  = '';
$dbname    = '';

$connect = mysqli_connect($dbhost, $dbuser, $dbpasswd, $dbname);
if (!$connect)
{
    echo 'Ошибка подключения MySQL: ' . mysqli_connect_error($connect);
    exit;
}

if (isset($_GET['del']))
{
    if (!$_GET['del'])
    {
        echo 'Ошибка GET.<br />';
    }
    else
    {
        $q = 'DELETE FROM phpfox_link WHERE link_id = ' . $_GET['del'];
        $r = mysqli_query($connect, $q);
        if (!$r)
        {
            echo 'Ошибка MySQL: ' . mysqli_error($connect) . '<br />';
        }
        else
        {
            echo 'Запись успешно удалена!<br />';            
        }
    }

    echo '<a href="tool.php">Продолжить проверку</a>.';
    exit;
}

$q = 'SELECT * FROM phpfox_link';
$r = mysqli_query($connect, $q);

$list = array();
while($row = mysqli_fetch_assoc($r))
{
    $list[] = $row;
}

echo '---------------<br />';
echo 'Проверка таблицы <strong>phpfox_feed</strong><br />';
echo '---------------<br />';

foreach ($list as $value)
{
    if ($value['module_id'] == null)
    {
        $q = 'SELECT * FROM phpfox_feed WHERE type_id = \'link\' AND item_id = ' . $value['link_id'];
        $r = mysqli_query($connect, $q);
        
        if (mysqli_num_rows($r) > 0)
        {
            echo $value['link_id'] . ' * Yes<br />';
        }
        else
        {
            echo $value['link_id'] . ' * No | <a href="tool.php?del=' . $value['link_id'] . '">Удалить</a><br />';
        }
    }
}

echo '---------------<br />';
echo 'Проверка таблицы <strong>phpfox_pages_feed</strong><br />';
echo '---------------<br />';

foreach ($list as $value)
{
    if ($value['module_id'] == 'pages')
    {
        $q = 'SELECT * FROM phpfox_pages_feed WHERE type_id = \'link\' AND item_id = ' . $value['link_id'];
        $r = mysqli_query($connect, $q);
        
        if (mysqli_num_rows($r) > 0)
        {
            echo $value['link_id'] . ' * Yes<br />';
        }
        else
        {
            echo $value['link_id'] . ' * No | <a href="tool.php?del=' . $value['link_id'] . '">Удалить</a><br />';
        }
    }
}
?>

</body>
</html>

Забить переменные своими данными доступа к Базе Данных:
$dbhost    = '';
$dbuser    = '';
$dbpasswd  = '';
$dbname    = '';

Залить файл tool.php в корень сайта и перейти по адресу: site.ru/tool.php. На экране появятся список таблицы phpfox_link, записи: id ссылки и Yes|No (есть или нету записи в таблицах лент новостей). Если запись о ссылке не будет найдена в таблицах лент новостей, то будет предложено удалить запись о ссылки в таблице phpfox_link, в виде ссылки Удалить рядом с информацией о записи. После нажатия на ссылку Удалить, сценарий выполнит действие по удалению записи и можно будет продолжить проверку ссылок.

По окончанию проверки, файл следует удалить с сервера, в целях безопасности.

Данным инструментом пользовался на живом сайте: https://danfa.net/, операция прошла без ошибок. Остается сделать обратную проверку записей о ссылки, то есть проверять наличие записи в таблице phpfox_link, которые есть в таблицах лент новостей. И наверно стоит сделать массовое удаление записей, что бы не "тыркаться" из-за каждой ссылки. Но это чуть позже.

Набросал ещё один инструмент для поиска "кривых" записях о ссылка, только мусор уже ищет в таблицах phpfox_feed и phpfox_pages_feed.
Для запуска проверки, создаем файл: tool.php с кодом внутри:
<html> 
<head>
    <meta charset="utf-8">
    <title>Поиск лишних записей</title>
</head>
<body>

<?php
$dbhost    = '';
$dbuser    = '';
$dbpasswd  = '';
$dbname    = '';

$connect = mysqli_connect($dbhost, $dbuser, $dbpasswd, $dbname);
if (!$connect)
{
    echo 'Ошибка подключения MySQL: ' . mysqli_connect_error($connect);
    exit;
}

$table = 'phpfox_feed';

if (isset($_GET['del']))
{
    if (!$_GET['del'])
    {
        echo 'Ошибка GET.<br />';
    }
    else
    {
        $q = 'DELETE FROM ' . $table . ' WHERE feed_id = ' . $_GET['del'];
        $r = mysqli_query($connect, $q);
        if (!$r)
        {
            echo 'Ошибка MySQL: ' . mysqli_error($connect) . '<br />';
        }
        else
        {
            echo 'Запись успешно удалена!<br />';            
        }
    }

    echo '<a href="tool.php">Продолжить проверку</a>.';
    exit;
}

$q = 'SELECT * FROM ' . $table . ' WHERE type_id = \'link\'';
$r = mysqli_query($connect, $q);

$list = array();
while($row = mysqli_fetch_assoc($r))
{
    $list[] = $row;
}

echo '---------------<br />';
echo 'Проверка таблицы <strong>' . $table . '</strong><br />';
echo '---------------<br />';

$num = 0;
$yes = 0;
$no  = 0;
foreach ($list as $value)
{
    $num++;
    $q = 'SELECT * FROM phpfox_link WHERE link_id = ' . $value['item_id'];
    $r = mysqli_query($connect, $q);    
    if (mysqli_num_rows($r) > 0)
    {
        $yes++;
        echo 'Номер: ' . $num . ' ID записи: ' . $value['feed_id'] . ' * Yes<br />';
    }
    else
    {
        $no++;
        echo 'Номер: ' . $num . ' ID записи: ' .  $value['feed_id'] . ' * No | <a href="tool.php?del=' . $value['feed_id'] . '">Удалить</a><br />';
    }
}

echo '---------------<br />';
echo 'Всего записей <strong>' . count($list) . '</strong> | Верные записи: <strong>' . $yes . '</strong> | Мусор: <strong>' . $no . '</strong><br />';
echo '---------------<br />';
?>

</body>
</html>

Заливаем в корень сайта и запускаем. Проверка будет выполнена по таблице phpfox_feed, после проверке меняем строку:
$table = 'phpfox_feed';

На:
$table = 'phpfox_pages_feed';

И запускаем сценарий ещё раз. Мусор так же можно сразу удалить по ссылке Удалить.
8:37 20.06.2017
При добавлении ссылки, как вложение, скажем в сообщение форума, без *http://, могут возникнуть проблемы при переходе по такой ссылки.
Ссылки (модуль phpFOX 3)
Чтобы *http:/ была у адреса в любом случаи, даже если ее не написали, я сделал так:
Открываю: module/link/include/service/process.class.php, нахожу:
                'link'            => $this->preParse()->clean($aVals['link']['url'], 255),

Меняю на:
                'link'            => $this->preParse()->clean((!preg_match('#(http|https):\/\/#i', $aVals['link']['url']) ? 'http://' . $aVals['link']['url'] : $aVals['link']['url']), 1024),

Готово.

Заметил, что при добавлении ссылки с протоколом HTTPS, логотип может сохраниться с протоколом HTTP.
				'image'           => ((isset($vals['link']['image_hide']) && $vals['link']['image_hide'] == '1') || !isset($vals['link']['image'])? null : $this->preParse()->clean($vals['link']['image'], 1024)),

И меняю на:
				'image'           => ((!empty($vals['link']['image_hide']) && $vals['link']['image_hide'] == '1') || empty($vals['link']['image']) ? null : $this->preParse()->clean((preg_match('|https:\/\/|i', $vals['link']['url']) ? str_replace('http://', 'https://', $vals['link']['image']) : $vals['link']['image']), 1024)),

Решение временное. Делалось на скорую руку.

Названия моих переменных отличается от стандартных переменных.