Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Неправильная работа скрипта
 
 автор: OLi   (11.12.2012 в 18:51)   письмо автору
 
 

Подскажите пожалуйста, почему скрипт обрабатывает только первые три записи в таблице и устанавливает для них статус 1


<?
function HaveFile($file){

$file fopen ($file"r");
if (!
$file) {
    return 
false;
}
return 
true;
}



function 
LoadIMage() {

$select_images mysql_query('SELECT image_tmp,id FROM cars_images WHERE status = 0 ORDER BY id DESC LIMIT 0,1');
if (
mysql_num_rows($select_images)>0){
    
$name mt_rand(01000);


    
$row mysql_fetch_array($select_images);
        
        if (
HaveFile($row['image_tmp'])) {
        if (
file_put_contents('images/'.$name.'_'.$row['id'].'.'.getExtension4($row['image_tmp']), file_get_contents($row['image_tmp']))) {

                
$db mysql_query('UPDATE cars_images set status=1, image = "'.$name.'_'.$row['id'].'.'.getExtension4($row['image_tmp']).'" WHERE id="'.$row['id'].'"');
    
                
LoadIMage();
        }
    } else {
        
$db mysql_query('UPDATE cars_images set status=3 WHERE id="'.$row['id'].'"');

        
LoadIMage();
        
sleep(1);

    }
    

}

}
?>


Вызов:
 LoadIMage();

  Ответить  
 
 автор: Mookapek   (11.12.2012 в 20:01)   письмо автору
 
   для: OLi   (11.12.2012 в 18:51)
 

Может потому что условие WHERE id="'.$row['id'].'" соответствует только первым трем записям таблицы?

  Ответить  
 
 автор: OLi   (12.12.2012 в 18:06)   письмо автору
 
   для: Mookapek   (11.12.2012 в 20:01)
 

Думаю, что не в этом дело, потому как запрос выше выполняется всегда, значит возвращает $row['id']

  Ответить  
 
 автор: Mookapek   (13.12.2012 в 21:13)   письмо автору
 
   для: OLi   (12.12.2012 в 18:06)
 

Может приведете часть таблицы, 5 первых записей?

  Ответить  
 
 автор: Igorek   (12.12.2012 в 19:35)   письмо автору
 
   для: OLi   (11.12.2012 в 18:51)
 

Как я понимаю выход из рекурсии случится в двух случаях:
1. В таблице не останется ни одной записи со статусом 0, т.е.
mysql_num_rows($select_images)>0

вернет FALSE.
2. Не удается записать файл функцией file_put_contents(), т.е.
file_put_contents('images/'.$name.'_'.$row['id'].'.'.getExtension4($row['image_tmp']), file_get_contents($row['image_tmp']))

вернет FALSE.

Видимо проблема во втором случае. Проверяйте почему не пишется файл.

Вообще, на мой взгляд вам стоит переделать этот скрипт:
1. Насколько я могу судить, вы хотите перебрать все записи со статусом 0 и с ними проделать всякие нужные штуки. Если да, то зачем здесь рекурсия? Зачем дергать из базы по одной записи? Выберете все сразу и в цикле обойдите их.
2. HaveFile() - проверяет существование файла? Если да, то для этого существует готовая функция file_exists(). Тем более, что открытый поток надо бы закрывать.
3. file_put_contents('images/'.$name.'_'.$row['id'].'.'.getExtension4($row['image_tmp']), file_get_contents($row['image_tmp'])) - это копирование файла с переименованием? воспользуйтесь функцией copy()

  Ответить  
 
 автор: Igorek   (13.12.2012 в 11:44)   письмо автору
 
   для: Igorek   (12.12.2012 в 19:35)
 

раз файлы удаленные, то последние 2 пункта надо вычеркнуть. не знал, погорячился.

  Ответить  
 
 автор: Lotanaen   (13.12.2012 в 10:27)   письмо автору
 
   для: OLi   (11.12.2012 в 18:51)
 

А действительно, зачем функция сама себя вызывает? Делайте запрос без лимита и обрабатывайте в цикле. По умолчанию время работы скрипта ограничено 30 секундами, для увеличения времени работы скрипта используйте set_time_limit( int second)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования