Проверка файла на уникальность

627
.
Посоветуйте какие лучше параметры в таблице выбрать?
Прикрепленные файлы:
.
kantry
# Chifty (10.09.2018 / 10:23)
ну так накидайте набросок кода для 7го джона, пожалуйста
Зачем тебе еще таблица? Добавь поле для хеша, и достаточно, я те вроде выше понятный пример привел))
Для john 7 (+/-)

Длинна поля для md5 32 символа, sha1 40 символов.
.
Добавлено: 10.09.2018 / 22:47
kantry, читал varchar не оптимальный вариант для хэшей. рекомендовали BINARY с конкретной длиной

Добавлено: 11.09.2018 / 00:23
Сделал по своему. Но за код спасибо
Теперь при выгрузке файла выдаёт аларм что такой файл уже есть и ссылку на страницу файла.
Теперь бы ещё кусок кода чтоб просто выводил список совпадающих загрузок по словам (или некоторому количеству символов.
Например если пользователь назвал загрузку Gangstar: Miami , то ему выдало предупреждение с списком игр Gangstar - Rio и MiamiVice.
Если конечно есть такой динамический фильтр. Например 5 символов подряд или слово целиком.
//но это уже хотелки
.
Добавлено: 11.09.2018 / 00:25
# kantry (08.09.2018 / 19:59)
Хеш существующих файлов можно записать в таблицу как то так
select `name` /* или ай-ди в зависимости как у тебя файлы на диске названы */ from tbl
while () {
// тут пройти по файлам с $hash = md5_f
И вот с этим бы не помешала помощь

Добавлено: 11.09.2018 / 01:02
Пробовал так:
$dir_files2 = $db->query("SELECT * FROM `download__files`");
while ($res_down2 = $dir_files2->fetch()) {
		$jar_file = $res_down2['name'];
		$javadir = $res_down2['dir'];
		$javadir = preg_replace('/\..\//', '/', $javadir);
		$md5_hash2 = md5_file($config['homeurl'] . $javadir . '/' . $jar_file, $raw_output = true);
		$db->exec("UPDATE `download__files` SET `md5` = '$md5_hash2' WHERE `id` = '" . $res_down2['id'] . "'");
}

Но уже на ID=4 получил ошибку SQL
.
Chifty, А ошибка то какая? Их тысячи существует
Путь к файлу у тебя не верный, нужен или полный url(что не желательно, жрать ресурсов много будет), или нормальный человеческий, понятный для файловой системы
$dir_files2 = $db->query("SELECT `id`, `dir`, `name` FROM `download__files` WHERE `md5` IS NULL");
    $stmt = $db->prepare('UPDATE `download__files` SET `md5` = ? WHERE id = ?');
    while ($res_down2 = $dir_files2->fetch()) {
    		$jar_file = $res_down2['name'];
    		$javadir = $res_down2['dir'];
    		$javadir = preg_replace('/\..\//', '/', $javadir);
    		$md5_hash2 = md5_file(__dir__ . '/..' . $javadir . '/' . $jar_file, $raw_output = true);
            $stmt->execute([$md5_hash2, $res_down2['id']]);

    }
.
kantry, почему-то все хэши 0х000000000000000000
Наверное ошибка в пути файла
А ещё бы для дополнительных файлов надо
.
kantry
# Chifty (11.09.2018 / 08:03)
kantry, почему-то все хэши 0х000000000000000000
А как ты их увидеть умудрился? Они же бинарные
Надо было тип колонки делать varchar, или типа того, тогда хеш символами запишется.
Путь проверить легко
if (is_file('path')) { // тут обновление колонки. }
Если хочешь на хеш поглядеть
SELECT md5(`md5`) FROM download__files; // Кстати, имя колонки поменять желательно
.
Chifty
Добавлено: 11.09.2018 / 09:00
kantry, дык в phpMyadmin всё отображается

Проблему решил.
Первая была: __dir__ указывает на расположение файла, а я лепил код в downloads/includes. В итоге получался неверный путьк файлу.
Перенес код в файл в корне - всё заработало
Для дополнительных файлов сделал костыль (Не знаю насколько оптимально, но результат получил ) за 103 секунды.

Вот код:
$dir_files2 = $db->query("SELECT * FROM `download__files` ");
    $stmt = $db->prepare('UPDATE `download__files` SET `md5` = ? WHERE id = ?');
    $stmt2 = $db->prepare('UPDATE `download__more` SET `md5` = ? WHERE refid = ?');
    while ($res_down2 = $dir_files2->fetch()) {
    	$jar_file = $res_down2['name'];
    	$javadir = $res_down2['dir'];
    	$javadir = preg_replace('/\..\//', '/', $javadir);
	$test = __dir__ . $javadir . '/' . $jar_file;
    	$md5_hash2 = md5_file(__dir__ . $javadir . '/' . $jar_file, $raw_output = true);
        $stmt->execute([$md5_hash2, $res_down2['id']]);
	$dir_files3 = $db->query("SELECT * FROM `download__more` WHERE `refid` = '" . 
        $res_down2['id'] . "'");
           while ($res_down3 = $dir_files3->fetch()) {
	   $jar_file2 = $res_down3['name'];
	   $md5_hash3 = md5_file(__dir__ . $javadir . '/' . $jar_file2, $raw_output = true);
	   $stmt2->execute([$md5_hash3, $res_down2['id']]);
	   }
echo $test;

Закинул, допустим, в login.php. echo там просто чтобы видеть что скрипт работал.

Добавлено: 11.09.2018 / 09:41
Подскажите, поиск дублей по целых словах в имени лучше делать через РНР или через запрос MySQL?
Типа
$name = explode(" ", $fname);
SELECT * FROM `download__files` WHERE `rus_name` = '" . $name[] . "' //не знаю как сделать перебор слов из массива прямо в запросе SQL.


Но тут два момента:
- Надо как-то отсечь слова менее 4 букв
- Длина массива не фиксированная. как сделать перебор по существующим элементам массива?

//кстати, хинт как редактировать свой пост, если время закончилось, и он последний:
пишешь новый пост
он лепится к предыдущему
вуаля кнопка Изменить снова на месте.
Удаляешь - и всё выглядит как и было

[timestamp]11.09.2018 08:15
Блин, тут еще обнаружилось что при импорте файла тоже надо md5 генерировать.
Но я что-то затрудняюсь как указать на файл, который тянется через
if (copy('http://' . $url, "$load_cat/$fname")) {
Прикрепленные файлы:
.
Chifty, Не оптимально, но тебе какая разница, это один раз надо сделать.
При импорте там еще проще в общем то,
if (isset($_POST['submit'])) {var_dump(md5_file($_POST['fail'])); это хеш, дальше уже проверка в таблице и т д. Правда неплохо бы сам url сначала проверить, а то любители все что угодно могут в $_POST передать.
С дубликатами непонятно, если как у тебя написано, то where `name` in($array) можно использовать.
.
# kantry (11.09.2018 / 11:47)
Chifty, Не оптимально, но тебе какая разница, это один раз надо сделать.
При импорте там еще проще в общем то,
if (isset($_POST['submit'])) {var_dump(md5_file($_POST['fail'])); это хеш, дальше уж
Один. Но хочу научиться как правильно.

С импортом разобрался,спасибо.

where `name` in($array) можно использовать. - это как? Можешь полный код написать?
Всего: 56