Не получается написать скрипт, который cron'ом запускается, просматривает определённую директорию,записывает имена файлов в массив и далее элементы массива записывает в соответсвующую таблицу в БД под mysql Код (Text): <?php $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator('/image/'), RecursiveIteratorIterator::CHILD_FIRST); $db1=mysqli_connect("localhost","e18366_dbuser","password1","e18366_db"); $query1="INSERT INTO `e18366_db`.`mesto` (`contetnimg`, `opismesto`, `otziv`) VALUES ('/image/$iterator', 'картинка', 'отсутствует')"; $result=mysqli_query($db1,$query1); if (!$result){ echo "No INSERT NAMEJPG for BD_mesto"; } mysqli_close($db1); ?> отругивается вот на эту строчку Код (Text): $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator('/image/'), RecursiveIteratorIterator::CHILD_FIRST); пишет
как я понял он почему-то смотрит в /home/e18366/public_html/site.ru/index.php, хотя мне нужен список имён и расширений файлов в директории /home/e18366/public_html/site.ru/image/ и занести этот список в БД по строкам в соответствующее поле почитав функцию используемую RecursiveIteratorIterator, не могу понять почему смотрит в директорию /home/e18366/public_html/site.ru/ вместо /home/e18366/public_html/site.ru/image/ и как результат естественно не находит файлов -пишет No such file or directory'
нет, он там не смотрит он смотрит ты просто не знаешь про абсолютные и относительные пути то есть он вообще не смотрит в ту директорию в которую ты думаешь. понимаешь? вообще. он работает как ты указал. абсолютно. в корне сервера каталог имейдж.
подправил сл образом Код (Text): $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator('/home/e18366/public_html/site.ru/image/'), RecursiveIteratorIterator::CHILD_FIRST); выдал вот это теперь: т.е. объект класс RecursiveIteratorIterator не может преобразован быть в строку смотрю мануал на RecursiveIteratorIterator http://php.ru/manual/class.recursiveiteratoriterator.html не могу понять почему не преобразовывает-должен же вроде...запутался
а ты вообще понимаешь что ты делаешь когда применяешь подобные штуки? это называется классы но для тебя это всё темный лес поэтому я для твоего удобства буду называть это штуками.
Здравствуйте, СергейЧИТА, вообще то Ganzal прав, для начала Вам было бы не лишним почитать об объектно-ориентированном подходе и о средствах PHP для применения ООП. В $iterator Вы получаете объект, в котором содержатся файлы, пути к этим файлам, директории, для которых Ваша директория image является родительской, сама эта директория image, и этот объект нельзя использовать так как у Вас: Код (Text): $query1="INSERT INTO `e18366_db`.`mesto` (`contetnimg`, `opismesto`, `otziv`) VALUES ('/image/$iterator', 'картинка', 'отсутствует')"; Для понимания Вы можете пробежаться в цикле по объекту и вывести все его содержимое на экран. Для создания SQL запроса для записи в базу данных также можно организовать цикл, правда сначала из объекта необходимо удалить ненужные Вам элементы. Кроме того, непонятно как будет обновляться Ваша директория, если Вы к существующим там файлам будете добавлять новые, то каждый раз при запуске Ваш скрипт выберет все элементы и новые, и старые, которые уже, возможно, записаны в базу данных, получите целую 'кучу' повторяющихся записей.
Посидев немного подумав, почитал мануалы...вообщем вот такой скрипт слоял: Код (Text): <?php //Подключение к БД mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); $db=mysqli_connect("localhost","e18366_dbuser","passwd1","e18366_db"); //Определение директории для обхода $dirimg="/image/"; //Определение массива для имён файлов в директории $a=array(); //Условие, что выбрана именно директория, а не файл if (is_dir($dirimg)){ //если ссылка(указатель) на директoрию (проверка доступности)при её открытии-условие истина, то далее if ($ukdirimg = opendir($dirimg)){ //Выполняем дальнейшие действия до тех пор пока можем видеть элемент(файл) в указанной директории while (($file=readdir($ukdirimg))!==false){ // array_push($a, $dirimg.$file); //Заполняем массив для имён файлом непосредственно именами хранящихся файлов array_push($a, $file); var_dump($file); } //Закрываем директорию после чтения имён файлов в ней closedir($ukdirimg); } } //Перебираем все сохранённые имена файлов в массиве и вставляем их в поле в БД foreach ($a as $i => $filename){ $query="INSERT INTO `e18366_db`.`mesto` (`idmesto`, `contetnimg`, `opismesto`, `otziv`) VALUES (NULL, '". mysql_real_escape_string($filename)."', 'отличное место', 'отзыв положительный')"; echo mysql_error(); $result=mysqli_query($db,$query); } /* while ($date = mysql_fetch_assoc($result)){ //После предыдущей строчки пишет Warning: mysql_fetch_assoc() expects parameter 1 to be resource, null given in /home/e18366/public_html/site.ru/index.php on line 35 $query2="INSERT INTO `e1836_db`.`mesto` (`idmesto`, `contetnimg`, `opismesto`, `otziv`) VALUES (NULL, '".$date['contetnimg']."', 'fs', 'sdf')"; $result2=mysqli_query($db,$query3); //Пытаюсь вывести для отладки на экран, но не выводит echo 'Файл в БД добавлен- '.$date['contetnimg']; var_dump($date['contetnimg']); var_dump(mysql_error()); } */ //Проверяем корректность вставки имён файлов из директории в БД $query3="SELECT * FROM `mesto`"; echo mysql_error(); $result3=mysqli_query($db,$query3); //Выводит информацию о переменной var_dump($result3); //Закрываем сеанс работы с БД mysqli_close($db); ?> На экран в браузере выдаёт вот это: В директории /home/e18366/public_html/site.ru/image/ имеются файлы-изображения JPG. В менеджере (phpmyAdmin) я таблицу mesto вычистил до запуска скрипта. После запуска таблица не заполнилась(( как по коду видно, пытался несколько вариантов, но безуспешно...не могу понять где подправить и как(т.к. вариантов нет) я думал об этом, но пока это сл задача, сейчас же я просто хочу хотя бы один раз заполнить...далее думаю будет некое условие нужно вписывать о проверке кандидата вставляемой строчки и наличие аналогичной строчки уже в БД, если её нет-то insert, если имеется-то insert не нужно делать-значит уже сведения об этой картике имеются в БД.
эх, жалко ты бросил конкретную реализацию на итератерах ковырять. впрочем, "правильнее" - через самописный итератор сделать. почему "правильнее"? давай сначала про свои итераторы. чтоб рекурсивно обойти файловую систему нужно 1. взять некоторый каталог, 2. прочитать его, 3. для каждого элемента-файла - записать в память, 4. для каждого элемента-каталога - рекурсивно вызвать эту же последовательность начиная с пункта 1. ну и на каждой итарации 2 нужно будет отсеивать . и .. (сам знаешь зачем). то есть получается достаточно "длинная" функция. и по большей части интерфейс этой функции будет таким как удобно ее создателю. то есть никакой стандартизации. допустим список файлов есть, ок. но нам к примеру надо фильтровать по какому-то условию. значит либо переписывать саму функцию либо делать пост-фильтрацию её выходного значения. в любом случае это будет код уровня пользователя... типа медленный. и тогда они придумали итератор файловой системы. вот честно не знаю чего они с ним сделали но то что вроде как встроено в ядро пыха работает почему-то медленнее чем самописная функция. не отрицаю что руки могут быть мутированы у меня и тот бенчмарк который я когда-то проводил упирался именно в реализацию мною понятой работы с итератором. но результаты были плачевные. а потом я пошел по интернету и нашел что много у кого ровно такой же неожиданный результат. глубже копать не стал. болт забил и дальше живу... суть итератора в том что он позволяет тебе не писать лишней рекурсивной функции а взять готовый инструмент языка. на странице мана (только не той которую ты привел а на настоящем сайте) есть два примера работы с итератором: Код (Text): $objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST); foreach($objects as $name => $object){ echo "$name\n"; } понимаешь как надо было делать? тогда бы и не словил ошибку Catchable fatal error: Object of class RecursiveIteratorIterator could not be converted to string второй вариант: Код (Text): $Directory = new RecursiveDirectoryIterator('path/to/project/'); $Iterator = new RecursiveIteratorIterator($Directory); $Regex = new RegexIterator($Iterator, '/^.+\.php$/i', RecursiveRegexIterator::GET_MATCH); ищет все дот-пи-эйч-пи внутри указанного пути. далее потом итерируешь итератор как в примере 1 - там уже только файлы пхп гарантированны. очень просто парой строк получить список файлов. ок. есть фильтрация по имени. ок. если надо дополнительную фильтрацию - по датам, размеру, владельцам, этцетера - в цикле итерации итератора соответствующие проверки делать. просто, красиво. но почему-то дико медленно... поэтому своя рекурсивная функция - "правильнее". по крайней мере быстрее.
Это я где-то читал на каком-то сайте...обсуждения...поэтому я вот и решил реализовать самостоятельно, так как там было написано, что если даже брать уже изобретённый велосипед с функцией из-под коробки пыха и будет всё работать, но в действительности по непонятным причинам рабоать будет медленно...вот.. поэтому я вроде всё старался логично реализовать, но скрипт после запуска вроде отрабатывает без ошибок, однако если посмотреть через менеджер PhpMyAdmin а строки не добавились(кол-во строк = кол-ву файлов jpg в директории /image/)...пробовал различные варианты, но так и не могу исправить вот здесь что-то не до конца дописал или не могу понять почему здесь не отрабатывает-по логике (как я думаю) в этом месте должны быть вставка в БД-в том числе должна создаться соотв. кол-во строк с данными о картинке(id_img (счётчик на уровне БД), имя файла(напримр 1.jpg-который именно в папке /image/1.jpg лежит), описание текстовое(пока для всех одинаковое), отзыв(тоже пока одинаковый для всех)....но после выполнения скрипта-результата не вижу в БД(( Код (Text): //Перебираем все сохранённые имена файлов в массиве и вставляем их в поле в БД foreach ($a as $i => $filename){ $query="INSERT INTO `e18366_db`.`mesto` (`idmesto`, `contetnimg`, `opismesto`, `otziv`) VALUES (NULL, '". mysql_real_escape_string($filename)."', 'отличное место', 'отзыв положительный')"; echo mysql_error(); $result=mysqli_query($db,$query); } а по коду видно ранее, что $a-это массив с именами_файлов.расширение Код (Text): ... array_push($a, $file); ... вот в трёх соснах заблудился(((
просто отлаживай свой код! ты должен понимать каждую строку своего накопи-пасченого текста используй сообщения об ошибках как подсказки доброго учителя. читай доки по используемым функциям и классам. проверяй промежуточные результаты. те, кто подсказывают, уже умеют такие задачки решать как 2*2, а ты как научишся если не будешь сам пытаться?!
Вообщем добился полшага вперёд))подумал, почитал, исправил вот код который у меня получился (написал с комментами в него) Код (Text): <?php //Подключение к БД mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); $db=mysqli_connect("localhost","e18366_dbuser","passwd1","e18366_db"); //Определение директории для обхода $dirimg="/home/e18366/public_html/site.ru/image/"; echo 'Вывод директории для обхода '.$dirimg."<br />"; //Определение обычного (не ассоциативного) массива для имён файлов в директории $a=array(); //Условие определён ли массив(существует ли) реально или нет if(isset($a)) echo "Массив определён <br />"; else echo "Массив не определён <br />"; //Условие, что выбрана именно директория, а не файл if (is_dir($dirimg)){ echo "Условие прошло что объект работы является директория <br />"; //если ссылка(указатель) на директрию при её открытии-условие истина, то далее if ($ukdirimg = opendir($dirimg)){ //Выполняем дальнейшие действия пока можем видеть элемент(файл) в указанной директории while (($file=readdir($ukdirimg))!==false){ // array_push($a, $dirimg.$file); //Заполняем массив для имён файлом непосредственно именами хранящихся файлов //Условие, что выбран именно файл, а не директория // if (is_file($file)){ array_push($a, $file); var_dump($file); // } } //Закрываем директорию после чтения имён файлов в ней closedir($ukdirimg); } } else echo "Условие не прошло что объект работы является директория <br />"; //Количество элементов в массиве $kol=count($a); echo 'Кол-во элементов в массиве '.$kol."<br />"; //Попытка вывести все элементы массива for ($i = 1; $i <= count($a) ; $i++) { echo 'Элемент № '.$i.' значение- '.$a[$i]."<br />"; } //Перебираем все сохранённые имена файлов в массиве и вставляем их в поле в БД foreach ($a as $i => $filename){ echo '<br /> 1 вариант Вывод имя_файла.расширение в виде переменной $filename: '.$filename.""; echo '<br /> 2 вариант Вывод имя_файла.расширение в виде переменной $a[$i]: '.$a[$i]."<br />"; $query="INSERT INTO `e18346_db`.`mesto` (`idmesto`, `contetnimg`, `opismesto`, `otziv`) VALUES (NULL, '".$filename."', 'отличное место', 'отзыв положительный')"; echo mysql_error(); $result=mysqli_query($db,$query); } //Проверяем корректность втсавки имён файлов из директории в БД $query3="SELECT * FROM `e18366_db`.`mesto`"; echo mysql_error(); $result3=mysqli_query($db,$query3); //Выводит информацию о переменной $f=1; while ($date3=mysqli_fetch_assoc($result3)){ echo '<br / Из базы получен элемент №> '.$f.'значение= '.$date3['contetnimg']; $f++; } //Закрываем сеасн работы с БД mysqli_close($db); ?> вот что выдаёт в браузер Т.е. у меня в директории /image ещё есть две директории...но мне нужно только список файлов в директории /image...т.е. мне нужно ещё дополнительное условие-проверить кандидат в элемент массива-является ли файлом или нет...если является-то в массив..если нет-переход к слежующему кандидату... пробовал различные функции и условия...что-то не получается(( просьба подсказать какую функцию можно использовать, если кандидат-является указатель(как видно по коду пробовал функцию is_file(), но как и понятно не получилось и пока думаю как избежать повторных строк(ранее говорилось в комментах)....думал через update...но думаю ещё нужно условие по этому моменту вписать в код...пока паузу возьму по этому моменту...поэтапно
всё работает вот так реализовал(с учётом закомментированных строк, которыми я отлаживал скрипт): корявенько конечно написано, но работаетв принципе готов закрыть тс) Код (PHP): <?php //Подключение к БД mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); $db=mysqli_connect("localhost","e18366_dbuser","passwd1","e18366_db"); //Определение директории для обхода $dirimg="/home/e18366/public_html/site.ru/image/"; //echo 'Вывод директории для обхода '.$dirimg."<br />"; //Определение обычного (не ассоциативного) массива для имён файлов в директории $a=array(); //Условие определён ли массив(существует ли) реально или нет /* if(isset($a)) echo "Массив определён <br />"; else echo "Массив не определён <br />"; */ //Условие, что выбрана именно директория, а не файл if (is_dir($dirimg)){ // echo "Условие прошло что объект работы является директория <br />"; //если ссылка(указатель) на директрию при её открытии-условие истина, то далее if ($ukdirimg = opendir($dirimg)){ //Выполняем дальнейшие действия пока можем видеть элемент(файл) в указанной директории while (($file=readdir($ukdirimg))!==false){ // array_push($a, $dirimg.$file); //Заполняем массив для имён файлом непосредственно именами хранящихся файлов //Условие, что выбран именно файл, а не директория $kandidat='/home/e18366/public_html/site.ru/image/'.$file; if (is_file($kandidat)){ array_push($a, $file); // var_dump($file); } } //Закрываем директорию после чтения имён файлов в ней closedir($ukdirimg); } } // else echo "Условие не прошло что объект работы является директория <br />"; //echo 'Вывод массива $a: '.$a;//Выводит следующее:"Вывод массива $a: Array" //Количество элементов в массиве $kol=count($a); //echo 'Кол-во элементов в массиве '.$kol."<br />"; /* //Попытка вывести все элементы массива for ($i = 1; $i <= count($a) ; $i++) { echo 'Элемент № '.$i.' значение- '.$a[$i]."<br />"; } */ //Перебираем все сохранённые имена файлов в массиве и вставляем их в поле в БД foreach ($a as $i => $filename){ // echo '<br /> 1 вариант Вывод имя_файла.расширение в виде переменной $filename: '.$filename.""; // echo '<br /> 2 вариант Вывод имя_файла.расширение в виде переменной $a[$i]: '.$a[$i]."<br />"; $query4="SELECT count(*) as CCC FROM `e18366_db`.`mesto` where (`contetnimg`='".$filename."')"; $result4=mysqli_query($db,$query4); $date5=mysqli_fetch_assoc($result4); // var_dump($date5); if ($date5["CCC"] == 0){ $query="INSERT INTO `e18366_db`.`mesto` (`idmesto`, `contetnimg`) VALUES (NULL, '".$filename."')"; echo mysql_error(); $result=mysqli_query($db,$query); // echo 'Есть вставка <br />'; } // else echo "Вставки нет <br />"; } //Проверяем корректность вставки имён файлов из директории в БД $query3="SELECT * FROM `e18366_db`.`mesto`"; echo mysql_error(); $result3=mysqli_query($db,$query3); //Выводит информацию о переменной $f=1; /* while ($date3=mysqli_fetch_assoc($result3)){ echo '<br / Из базы получен элемент №> '.$f.'значение= '.$date3['contetnimg']; $f++; } */ //Закрываем сеасн работы с БД mysqli_close($db); ?>