запись данных в базу

aleksey_d

Новичок
Задача. Нужно прочитать содержимое каталога и названия файлов имеющихся в нем занести в базу и в случай добавления файла в каталог он тоже писался в базу без перезаписи всего содержимого.
Пробую делать так:
PHP:
<?php  
error_reporting(E_ALL);
require 'inc/connect.php';
$dt = date('Y-m-d');
$dir="dir/"; //берем директорию 


$ar=array(); 
$dh = opendir($dir); 
while ($file_d = readdir($dh)) : 
if ($file_d[0] != ".") //не выводим вложенные папки 
{ 
array_push($ar, $file_d); //читаем все файлы в директории 
} 
endwhile; 
closedir($dh);
print "<br>";

sort($ar); //сортируем файлы по имени

for($i=0;$i<count($ar);$i++) { 
print "<br><a href='".$dir.$ar[$i]."' targer='_blank'>.$ar[$i].</a> "; //выводим на экран 
}

while(each($ar))
{
$result = mysql_query("insert into `downloads` (`file_name`, `name`, `dir`, `date_add`) 
     												values 
     												('".$ar[$i]."',
     												 '".$ar[$i]."',
     												 '".$dir.$ar[$i]."',
       												 '".$dt."');") or die(mysql_error());
 }    												
  

?>
в базу все пишется, но при попытке добавить новые файлы и запуске скрипта он ко всем записям в базе дописывает новые файлы и дублирует старые.
То что код вставки не правильный для моего случая я понял, подскажите как он должен выглядеть
 

Absinthe

жожо
while ($file_d = readdir($dh)) :
Если имя одного из файлов будет "0", что делать будешь?

подскажите как он должен выглядеть
Тут не принято давать готовые решения. Поэтому либо тебе помогают бесплатно (помогать - это не делать за тебя), либо делают за сумму, которую ты предлагаешь.
 

aleksey_d

Новичок
а я и не прошу писать код за меня, я прошу подсказать как правильно должна выглядеть запись в базу
 

Absinthe

жожо
он ко всем записям в базе дописывает новые файлы и дублирует старые.
Потому что ты пишешь все в базу.
Есть несколько вариантов.
1. Проверять перед добавлением на наличие такой записи в базе.
2. Поставить индексы.

Кстати у тебя потенциальных SQL-injection еще до кучи.
И код плохо отформатирован.
И переменные названы плохо.
 

aleksey_d

Новичок
с инъекциями разбираться буду потом, сейчас все локально. А проверку на наличие делать так
PHP:
insert into table (поле, поле) values(значение, значение) where not exists (select id from table where поле="значение");
 

WMix

герр M:)ller
Партнер клуба
я извеняюсь что влазию, а зачем все так странно?

если ты уже все одно пишешь в базу, почему ты не читаешь из базы в отсортированном виде?
если ты записываешь в базу в цикле, то почему не сразу когда читаешь папку?

и почему различный синтаксис написания while в одном файле?
PHP:
if ($file_d[0] != ".") //не выводим вложенные папки
надеюсь понимаешь! и скрытые файлы тоже...
PHP:
while(each($ar))
{
$result = mysql_query("insert into `downloads` (`file_name`, `name`, `dir`, `date_add`) 
                                                     values 
                                                     ('".$ar[$i]."',
                                                      '".$ar[$i]."',
                                                      '".$dir.$ar[$i]."',
                                                        '".$dt."');") or die(mysql_error());
 }
и последний вопрос, чему равен $i ? что храниться в $dir.$ar[$i] точно папка?
 

SiZE

Новичок
1. Добавь уникальный ключ ( unique key ) на два поля dir и file_name.
2. Добавить к инсерту ON DUPLICATE KEY UPDATE
3. Значение поля date_add не обязательно генерировать в РНР и даже вовсе не нужно. Достаточно использовать встроенную функцию now()
4. В мануале по РНР есть готовый пример обхода директории и получения файлов, используй его.
5. Записывать запрос в виде $result = mysql_query(/**/) or die(); абсолютно бессмысленно. Переменная $result нигде не используется, так не надо ее присваивать. А лучше делать тогда так:
PHP:
$result = mysql_query(/**/);
if ( !$result ) {
  echo mysql_error();
} else {
  echo 'all is ok';
}
6. "array_push($ar, $file_d); //читаем все файлы в директории" - камент убойный :) в этой строке мы ничего не читаем. Читабельней на мой взгляд такая строка: $ar[] = $file_d;
7. И самое важное. Судя по вашему коду, файлы можно сохранять и выводить на экран прямо во время обхода папки.
 

WMix

герр M:)ller
Партнер клуба
незнаю зачем дата когда мы записали файл в базу, интереснее иметь дату создания и дату последнего изменения файла...
Beavis
всеже совершенно неважно NOW или время на сервере в php при записи... даже наоборот нужно NOW()

при чтении же об этом нужно думать. и если ты в другом регионе то добавлять разность во времени
 

Beavis

Banned
всеже совершенно неважно NOW или время на сервере в php при записи
как это неважно, если эти 2 времени могут отличаться?

при чтении же об этом нужно думать. и если ты в другом регионе то добавлять разность во времени
вот именно.. а я говорю как сделать, чтоб об этом не надо было думать, и не надо было ничего добавлять.
да и вообще, разница во времени бывает не только из-за разных часовых поясов, но и просто из-за неправильно настроенного времени
 

WMix

герр M:)ller
Партнер клуба
разница во времени бывает из-за неправильно настроенного времени
я никак не хочу думать об этом, это задача других людей

итак 2 Веб сервера москва + берлин и 1 База данных пусть будет в берлине
москва пишет свое время в базу, берлин ее читает и получает дату в будущем разве это не проблема?
 

флоппик

promotor fidei
Команда форума
Партнер клуба
москва пишет свое время в базу, берлин ее читает и получает дату в будущем разве это не проблема?
Это неправильное время. Они все должны писать в UTC, а считать часовой пояс на клиенте, потому что клиент может быть вообще из Бангладеша, и для него оба времени будут неправильными.
 

WMix

герр M:)ller
Партнер клуба
Beavis
я согласен, мне приходиться опираться на админа, но боюсь тебе тоже.. вне зависимости от написанного времени
 

Beavis

Banned
Можно размазать работу со временем хоть на 1000 серверов, и потом следить чтобы оно везде было одинаково и не сбилось.
Только в этом просто нет смысла. Добавлять самому себе потенциальную причину неправильной работы приложения? Зачем?
 

WMix

герр M:)ller
Партнер клуба
Beavis я понимаю преимущество твоего способа, и возможно когда буду писать чтонить подобное где каждая секунда будет на счету, вспомню твои слова.
 

aleksey_d

Новичок
и последний вопрос, чему равен $i ? что храниться в $dir.$ar[$i] точно папка?
Я в php только недавно начал разбираться и если я правильно понимаю, то $i это элемен массива, а в $dir.$ar[$i] хранится путь и имя файла(по крайней мере в базу пишет так)
 
Сверху