Вы не зашли.
Главная » PHP » ЗЦ
#41. Gemorroj Off (107)
Administrator
2013.01.30 21:09
tipsun, в данном случае (InnoDB) можно вообще, на каждый файл делать отдельный инсерт и просто обернуть цикл в транзакцию. И еще использовать PDO с подготовленным вне цикла запросом.
#42. tipsun Off (19)
Moderator
2013.01.30 21:09
Короче, я не на правильном пути...
#43. tipsun Off (19)
Moderator
2013.01.31 00:12
Заглянул в sea_downloads2, там попроще, без id. Все на путях.
#44. tipsun Off (19)
Moderator
2013.01.31 00:12
ПонЭл принцип, как у меня это все будет.
Сканировать и сверять так же буду, как в sea, а насчет добавления, там будет принцип лесенки.
Самое главное, чтоб получилась эта лесенка, чтоб плавная была.
Остальное за pdo->lastinsertid(). Дальше мысля пока не пошла.
Добавлено спустя   3 минуты  58 секунд:
Еще понял, что надо бы полный путь сразу указывать, чтоб потом не мучаться. Отдавать все-равно буду через одну точку, значит локального пути хватит вполне.
Добавлено спустя   9 минут  59 секунд:
Можно даже без pdo->lastinsertid, ибо по принципу лесенки, эта папка уже будет в базе.
#45. tipsun Off (19)
Moderator
2013.01.31 01:01
Значит я могу запросом вытащить id который будет parent_id для следующих элементов.
#46. Gemorroj Off (107)
Administrator
2013.01.31 11:11
tipsun, в sea далеко не идеальная архитектура. Принимать ее как эталонную не стоит.
#47. tipsun Off (19)
Moderator
2013.01.31 14:02
Можно было бы одной функцией попробовать, типа: сравнить два массива и выдать только недостающие ключи. А там перебор идет.
#48. tipsun Off (19)
Moderator
2013.02.01 10:10
Можно 1 циклом обойтись, в функцию подготовленный prepare запихать и вперед.
- - - -
Надо еще с путями разобраться и parent_id
Показать скрытый текст

Код:
<?php
 
function dread($parent) {
    $array = array();
    if (false !== ($resource opendir($parent))) {
        while (false !== ($name readdir($resource))) {
            if ('.' != $name && '..' != $name) {
                $child $parent DIRECTORY_SEPARATOR $name;
                $array[] = $child;
                if (is_dir($child)) {
                    $array array_merge($arraydread($child));
                }
            }
        }
        closedir($resource);
    }
    return $array;
}
 
// Get physical pathes
$root realpath('folders');
$physical dread($root);
 
// Get virtual pathes
$virtual = array();
 
$pdo = new Pdo('mysql:dbname=downloads;host=127.0.0.1;''root''');
$qt 'SELECT `path` FROM `downloads`;';
if (false !== ($q $pdo->query($qt))) {
    if ($q->rowCount()) {
        $virtual $q->fetchAll(PDO::FETCH_COLUMN);
    }
}
 
// Search new and invalid pathes
$new array_diff($physical$virtual);
// $invalid = array_diff($virtual, $physical);
 
// Add new pathes in virtual
$qt 'INSERT INTO `downloads` (`path`, `name`, `type`, `parent_id`, `size`) '
    'VALUES (:path, :name, :type, :parent_id, :size)';
 
$pdo->beginTransaction();
$q $pdo->prepare($qt);
foreach ((array) dread($root) as $path) {
    $q->execute(array(
        ':path' => $path,
        ':name' => basename($path),
        ':type' => ($type filetype($path)),
        ':parent_id' => 0,
        ':size' => ('file' == $type filesize($path) : 0)
    ));
}
$pdo->commit();
Отредактировано tipsun (2013.02.01 12:12)
#49. Gemorroj Off (107)
Administrator
2013.02.01 11:11
tipsun, да, мне видится такой более чистым и правильным. Единственное что, нужно бы еще проверку на false делать более жесткой. Т.е. !==
#50. tipsun Off (19)
Moderator
2013.02.01 11:11
Спасибо, что посмотрел. smile
Я вот еще не пойму пока, мне полный путь нужен в базе или нет.
Еще вот никак не представлю как parent_id узнавать.
Страниц: 13 4 5 6 7 8 Все
Главная
WEB
PunBB Mod v0.6.2
0.015 s