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

Форум PHP

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

 

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

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

тема: загрузка изображений
 
 автор: Василий   (05.01.2012 в 17:27)   письмо автору
 
 

В форме предлагается пользователю ввести новые данные в т.ч. и логотип.
Пользователь может проигнорировать пункт загрузки логотипа.
И при нажатии кнопки выходит ошибка "Не был выбран файл для загрузки"

<form name="add" method='post' action='pu_add.php' enctype="multipart/form-data">
Загрузка логотипа:<input type='file' name='userfile'>
<input  type="submit" value="Сохранить" name="upload_submit" id="submit">

<?php 
    
function uploadHandle($max_file_size 100$valid_extensions = array(), $upload_dir '.')  
    {  
      
        
$error null;  
        
$info  null;  
        
$max_file_size *= 1024;  

        if (
$_FILES['userfile']['error'] === UPLOAD_ERR_OK)  
        {  
            
// проверяем расширение файла  
            
$file_extension pathinfo($_FILES['userfile']['name'], PATHINFO_EXTENSION);  
            if (
in_array($file_extension$valid_extensions))  
            {  
                
// проверяем размер файла  
                
if ($_FILES['userfile']['size'] < $max_file_size)  
                {  
                
$destination ="img/logo_pu/" $_FILES['userfile']['name']; 
      
                    if (
move_uploaded_file($_FILES['userfile']['tmp_name'], $destination))  
                        
$info 'Файл успешно загружен';  
                    else  
                        
$error 'Не удалось загрузить файл';  
                }   
                else  
                    
$error 'Размер файла больше допустимого';  
            }   
            else  
                
$error 'У файла недопустимое расширение';  
        }   
        else  
        {  
            
// массив ошибок  
            
$error_values = array( 

                
UPLOAD_ERR_INI_SIZE   =>
 
'Размер файла больше разрешенного директивой upload_max_filesize в php.ini',  
                
UPLOAD_ERR_FORM_SIZE  =>
 
'Размер файла превышает указанное значение в MAX_FILE_SIZE',                            
                
UPLOAD_ERR_PARTIAL    => 'Файл был загружен только частично',   
                
UPLOAD_ERR_NO_FILE    => 'Не был выбран файл для загрузки',   
                
UPLOAD_ERR_NO_TMP_DIR => 'Не найдена папка для временных файлов',   
                
UPLOAD_ERR_CANT_WRITE => 'Ошибка записи файла на диск' 

                                  
);  
      
            
$error_code $_FILES['userfile']['error'];  
      
            if (!empty(
$error_values[$error_code]))  
                
$error $error_values[$error_code];  
            else  
                
$error 'Случилось что-то непонятное';  
        }  
      
        return array(
'info' => $info'error' => $error);  
    }  
      
/////////////////////////////////////////////////////////////////////      
    
$extensions = array('jpg''jpeg''png''gif');  
    
$upload_dir 'images';  
      
    
// Запускаем функцию  
    
if(!empty($_POST['upload_submit'])) 
    {      
        
$message uploadHandle(200$extensions$upload_dir);  
    
        
// Выводим сообщение  
        
echo $message['error'] ? "<p class='mistake'>".$message['error']."</p>" :
 
"<p class='nomistake'>".$message['info']."</p>";  
    } 
?> 


пробую удалить строчку
                UPLOAD_ERR_NO_FILE    => 'Не был выбран файл для загрузки',   

но дает ошибку
               $error = 'Случилось что-то непонятное';  

  Ответить  
 
 автор: Василий   (05.01.2012 в 19:14)   письмо автору
 
   для: Василий   (05.01.2012 в 17:27)
 

так как же исправить?

  Ответить  
 
 автор: Slo_Nik   (05.01.2012 в 19:57)   письмо автору
 
   для: Василий   (05.01.2012 в 19:14)
 

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

  Ответить  
 
 автор: Василий   (05.01.2012 в 20:17)   письмо автору
 
   для: Slo_Nik   (05.01.2012 в 19:57)
 

а форум для чего тогда?

  Ответить  
 
 автор: Slo_Nik   (05.01.2012 в 20:24)   письмо автору
 
   для: Василий   (05.01.2012 в 20:17)
 

ключевая константа в Вашем вопросе UPLOAD_ERR_NO_FILE

  Ответить  
 
 автор: Василий   (05.01.2012 в 20:27)   письмо автору
 
   для: Slo_Nik   (05.01.2012 в 20:24)
 

это да. я же не могу ее удалить

  Ответить  
 
 автор: Slo_Nik   (05.01.2012 в 20:31)   письмо автору
 
   для: Василий   (05.01.2012 в 20:27)
 

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

<?php 
if($_FILES['filename']['error'] === UPLOAD_ERR_NO_FILE){
 
// означает , что файл не был загружен
}
// то можно сделать так
if(!($_FILES['filename']['error'] === UPLOAD_ERR_NO_FILE)){
 
// означает , что $_FILES['filename']['error']  не возвращает этой ошибки и пользователь
// грузит файл
}

вот Вам две подсказки, а куда это воткнуть в Вашей функции - подумайте и покажите решение

p.s. Вы ознакомились со списком ошибок по ссылке?

  Ответить  
 
 автор: cheops   (05.01.2012 в 20:28)   письмо автору
 
   для: Василий   (05.01.2012 в 17:27)
 

Лучше не использовать готовых функций, которые вам сложно исправить для решения других задач. Попробуйте для решения новой задачи создать новую функцию. Потом, если вы увидите много схожих моментов, можно попробовать их объединить в одну. Однако и в двух отдельных функциях ничего страшного не будет.

  Ответить  
 
 автор: Василий   (05.01.2012 в 23:29)   письмо автору
 
   для: cheops   (05.01.2012 в 20:28)
 

куда воткнуть это
<?php 
if($_FILES['filename']['error'] === UPLOAD_ERR_NO_FILE){
 
// означает , что файл не был загружен

сюда вместо $error = 'Не удалось загрузить файл';
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $destination))  
 $info = 'Файл успешно загружен';  
else  
$error = 'Не удалось загрузить файл';  


а вот
// то можно сделать так
if(!($_FILES['filename']['error'] === UPLOAD_ERR_NO_FILE)){
 // означает , что $_FILES['filename']['error']  не возвращает этой ошибки и пользователь
// грузит файл

не понимаю куда можно

  Ответить  
 
 автор: cheops   (05.01.2012 в 23:38)   письмо автору
 
   для: Василий   (05.01.2012 в 23:29)
 

>куда воткнуть это?
А куда вам надо? Какого поведения хотите добиться?

  Ответить  
 
 автор: Василий   (06.01.2012 в 00:27)   письмо автору
 
   для: cheops   (05.01.2012 в 23:38)
 

<?php   
$path 
"img/logo_pu/"
$image $_GET['logo'];  
if (!empty(
$image)) { 
  
// Логотип ранее загружался - показываем его и выводим
  // флажок, позволяющий его удалить
  
echo "<tr><td width='300' valign='top'><strong>У вас уже есть логотип:</strong></td><td><img src='".$path.$image."'  alt=''></td></tr>";
  echo 
"<tr><td width='300' valign='top'><strong>Хотите удалить логотип?</strong></td><td><input type='checkbox' name='checkme'> Удалить логотип</td></tr>";
    echo 
"<tr><td width='300' valign='top'><strong>Заменить логотип:</strong></td><td><input type='file' name='userfile'></td></tr>";

else {
echo 
"<tr><td width='300' valign='top'><strong>Загрузка логотипа:</strong></td><td><input type='file' name='userfile'></td></tr>";
}
?> 


а чтобы когда пользователь нажимает "Удалить логотип" не выходила ошибка : "Не был выбран файл для загрузки"

И когда пользователь оставляет старый логотип, чтобы не выходило: "Не был выбран файл для загрузки "

  Ответить  
 
 автор: Slo_Nik   (06.01.2012 в 00:28)   письмо автору
 
   для: cheops   (05.01.2012 в 23:38)
 

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

  Ответить  
 
 автор: cheops   (06.01.2012 в 00:51)   письмо автору
 
   для: Slo_Nik   (06.01.2012 в 00:28)
 

Так просто уберите эту проверку, которая вам мешает...

  Ответить  
 
 автор: Slo_Nik   (06.01.2012 в 00:32)   письмо автору
 
   для: Василий   (05.01.2012 в 23:29)
 

нет, совершенно не хотите думать.
Вы хоть посмотрите по своему коду, где происходят подобные проверки?
Разберитесь/прочитайте, что означают эти константы

<?php 
// то можно сделать так 
if(!($_FILES['filename']['error'] === UPLOAD_ERR_NO_FILE)){ 
 
// означает , что $_FILES['filename']['error']  не возвращает этой ошибки и пользователь 
// грузит файл 
}

Это означает, что пользователь собирается загрузить файл, то есть выбран файл для загрузки
и вот после этого можно выполнять остальные действия над файлом(проверка/переименовывание/загрузка)
Далее... Мне помнится, что Вам уже говорили, что надо проверять checkbox, например "удалить логотип" и если он выбран, то запускать функцию обработки изображений, если нет, то не запускать. Вот тогда и не будет вылазить мешающее Вам сообщение.
не ленитесь делать то , что Вам говорят/советуют.....

  Ответить  
 
 автор: Василий   (06.01.2012 в 00:53)   письмо автору
 
   для: Slo_Nik   (06.01.2012 в 00:32)
 

так где же надо проверять checkbox? в той самой функции?

  Ответить  
 
 автор: Василий   (06.01.2012 в 00:55)   письмо автору
 
   для: Василий   (06.01.2012 в 00:53)
 

насчет проверки - верно - надо еще уменьшать загруженный логотип до 150x150px

  Ответить  
 
 автор: Slo_Nik   (06.01.2012 в 00:59)   письмо автору
 
   для: Василий   (06.01.2012 в 00:55)
 

для этого Вам нужна будет отдельная функция, поищите на этом сайте, по моему где-то было готовое решение....
и про google не забывайте.

  Ответить  
 
 автор: Slo_Nik   (06.01.2012 в 00:58)   письмо автору
 
   для: Василий   (06.01.2012 в 00:53)
 

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

  Ответить  
 
 автор: Василий   (06.01.2012 в 01:15)   письмо автору
 
   для: Slo_Nik   (06.01.2012 в 00:58)
 

Тогда вот так:
  echo "<tr><td width='300' valign='top'><strong>Хотите удалить логотип?</strong></td><td><input type='checkbox' name='checkme'> Удалить логотип</td></tr>";


if (!isset($_POST['checkme']) == 'yes') 
{
тут будет функция
}
else

{

<?php 
$logo 
mysql_escape_string($_FILES['userfile']['name']); 

if (isset(
$title) )
{

  Ответить  
 
 автор: Slo_Nik   (06.01.2012 в 01:19)   письмо автору
 
   для: Василий   (06.01.2012 в 01:15)
 

if (!isset($_POST['checkme']) == 'yes')
а Вы уверены, что будет равно "yes"?

$logo = mysql_escape_string($_FILES['userfile']['name']);
это делать перед записью в базу, я же Вам уже писал, читайте внимательней

  Ответить  
 
 автор: Василий   (06.01.2012 в 01:25)   письмо автору
 
   для: Slo_Nik   (06.01.2012 в 01:19)
 

Если не нажата клавиша, то будет выполняться функция, если нет - то программа дальше пойдет
if (!isset($_POST['checkme']) == 'Удалить логотип') 
{
тут будет функция
}

  Ответить  
 
 автор: Slo_Nik   (06.01.2012 в 01:27)   письмо автору
 
   для: Василий   (06.01.2012 в 01:25)
 

извините, но Вы бредите....
отметьте в форме чекбокс, отправьте форму , выведите дам массива POST и посмотрите на значение чекбокса
повторю, прекращайте гадать на кофейной гуще

  Ответить  
 
 автор: Василий   (06.01.2012 в 01:50)   письмо автору
 
   для: Slo_Nik   (06.01.2012 в 01:27)
 

<form name="add" method='post' action='pu_add.php' enctype="multipart/form-data">

 <tr>

<?php   
$path 
"img/logo_pu/"
$image $_GET['logo'];  
if (!empty(
$image)) { 
  
// Логотип ранее загружался - показываем его и выводим
  // флажок, позволяющий его удалить
  
echo "<tr><td width='300' valign='top'><strong>У вас уже есть логотип:</strong></td><td><img src='".$path.$image."'  alt=''></td></tr>";
  echo 
"<tr><td width='300' valign='top'><strong>Хотите удалить логотип?</strong></td><td><input type='checkbox' name='checkme'> Удалить логотип</td></tr>";
    echo 
"<tr><td width='300' valign='top'><strong>Заменить логотип:</strong></td><td><input type='file' name='userfile'></td></tr>";

else {
echo 
"<tr><td width='300' valign='top'><strong>Загрузка логотипа:</strong></td><td><input type='file' name='userfile'></td></tr>";
}
?> 
</form>


В обработчике
<?php
ini_set
("display_errors","1");
if (
version_compare(phpversion(), "5.0.0"">")==1) {
    
ini_set("error_reporting"E_ALL E_STRICT);
} else {
    
ini_set("error_reporting"E_ALL);
};
?>


    <?php     echo '<pre>'
    
print_r($_POST); 
    echo 
'</pre>';?>


И ни ошибок, и массива нет

  Ответить  
 
 автор: Slo_Nik   (06.01.2012 в 01:54)   письмо автору
 
   для: Василий   (06.01.2012 в 01:50)
 

а нажать на кнопку отправки формы Вы не забыли, отметили чекбокс?

  Ответить  
 
 автор: Василий   (06.01.2012 в 01:58)   письмо автору
 
   для: Slo_Nik   (06.01.2012 в 01:54)
 

"галку" поставил
выходит : Не был выбран файл для загрузки

ни массива, ни ошибок

  Ответить  
 
 автор: ......   (06.01.2012 в 01:58)
 
   для: Василий   (06.01.2012 в 01:25)
 

обычно для проверки перед строкой if ($_FILES['userfile']['error'] === UPLOAD_ERR_OK)
вставляктся что-то типа
echo "<pre>\n";
var_dump($_FILES);
echo  "</pre>\n";

или var_dump($_POST); или var_dump(isset($_POST['checkme'])); .........

  Ответить  
 
 автор: Василий   (06.01.2012 в 02:11)   письмо автору
 
   для: ......   (06.01.2012 в 01:58)
 

поставил еще
echo "<pre>\n";
var_dump($_FILES);
echo  "</pre>\n";

выделяю чебокс - и ничего нет все равно

  Ответить  
 
 автор: Василий   (06.01.2012 в 09:17)   письмо автору
 
   для: Василий   (06.01.2012 в 02:11)
 

так что посоветуете?

  Ответить  
 
 автор: Slo_Nik   (06.01.2012 в 14:49)   письмо автору
 
   для: Василий   (06.01.2012 в 09:17)
 

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

  Ответить  
 
 автор: .....   (06.01.2012 в 12:13)
 
   для: Василий   (06.01.2012 в 02:11)
 

> и ничего нет все равно


если так, если перед if ($_FILES['userfile']['error'] === UPLOAD_ERR_OK)

то значит нигде не присходит вызов uploadHandle()
 if(!empty($_POST['upload_submit'])) 
    {       
        $message = uploadHandle(200, $extensions, $upload_dir);


ибо var_dump($_FILES) должен показать хотя-бы просто "array()"
..только иногда ещё надо заглядывать в исходный код страницы выдаваемый браузером

  Ответить  
 
 автор: Василий   (06.01.2012 в 15:35)   письмо автору
 
   для: .....   (06.01.2012 в 12:13)
 

картинки с англ буквами грузятся, удалюятся - но сообщений никаких

  Ответить  
 
 автор: Slo_Nik   (06.01.2012 в 15:42)   письмо автору
 
   для: Василий   (06.01.2012 в 15:35)
 

Исходный код страницы смотрите?
в любом случае, даже если массив POST пустой, Вы должны видето Array()
Выводите дамп сразу после выставления уровня ошибок, в обработчике

  Ответить  
 
 автор: Василий   (06.01.2012 в 15:54)   письмо автору
 
   для: Slo_Nik   (06.01.2012 в 15:42)
 

array(1) { ["userfile"]=> array(5) { ["name"]=> string(0) "" ["type"]=> string(0) "" ["tmp_name"]=> 
string(0) "" ["error"]=> int(4) ["size"]=> int(0) } }


array(1) {
  ["userfile"]=>
  array(5) {
    ["name"]=>
    string(0) ""
    ["type"]=>
    string(0) ""
    ["tmp_name"]=>
    string(0) ""
    ["error"]=>
    int(4)
    ["size"]=>
    int(0)

И что с этим делать?
  }
}

  Ответить  
 
 автор: Slo_Nik   (06.01.2012 в 16:00)   письмо автору
 
   для: Василий   (06.01.2012 в 15:54)
 

а что Вам говорит вот это ["error"]=> int(4)?
Вы читали о сообщениях об ошибках? ссылку, насколько я помню, я давал, но скорей всего Вы так и не заглядывали туда и продолжаете гадать на кофейной гуще или ждёте пока Вам дадут готовое решение
получилось же вывести дамп FILES , а где дамп POST?

  Ответить  
 
 автор: Василий   (06.01.2012 в 16:04)   письмо автору
 
   для: Slo_Nik   (06.01.2012 в 16:00)
 

ссылку вы давали про страничную навигацию и защиту сайта только

  Ответить  
 
 автор: Slo_Nik   (06.01.2012 в 16:25)   письмо автору
 
   для: Василий   (06.01.2012 в 16:04)
 

помню, что точно давал, вот только уже не помню в какой теме, Вы просто завалили форум однотипными темами.
В таком случае потрудитесь самостоятельно узнать, какие значения и что они означают есть в $_FILES['filename']['error']

И где же всё-таки дам POST?

  Ответить  
 
 автор: Василий   (06.01.2012 в 16:38)   письмо автору
 
   для: Slo_Nik   (06.01.2012 в 16:25)
 

[checkme] => on
[upload_submit] => Сохранить

какие данные еще нужны?

  Ответить  
 
 автор: Slo_Nik   (06.01.2012 в 17:15)   письмо автору
 
   для: Василий   (06.01.2012 в 16:38)
 

А вот теперь сравните $_POST['checkme']) == 'Удалить логотип' с [checkme] => on и из этого исходите, когда будете делать проверку

  Ответить  
 
 автор: Василий   (06.01.2012 в 17:22)   письмо автору
 
   для: Slo_Nik   (06.01.2012 в 17:15)
 

а как сравнить?

  Ответить  
 
 автор: Slo_Nik   (06.01.2012 в 17:25)   письмо автору
 
   для: Василий   (06.01.2012 в 17:22)
 

Вы издеваетесь?....
В данном случае яблоко с грушей....

  Ответить  
 
 автор: Василий   (06.01.2012 в 17:29)   письмо автору
 
   для: Slo_Nik   (06.01.2012 в 17:25)
 

да ничего подобного.
вы изъясняетесь профессиональным языком.
на уровень любителя спуститесь, пожалуйста. Попробуйте объяснить простыми словами

  Ответить  
 
 автор: Slo_Nik   (06.01.2012 в 17:57)   письмо автору
 
   для: Василий   (06.01.2012 в 17:29)
 

Ну если Вам тяжело к пониманию вот это
А вот теперь сравните $_POST['checkme']) == 'Удалить логотип' с [checkme] => on и из этого исходите, когда будете делать проверку

ТО О ЧЁМ С ВАМИ МОЖНО ДАЛЬШЕ ГОВОРИТЬ?!
Вы с чем сравниваете $_POST['checkme']?!!
Что у Вас на самом деле находится в $_POST['checkme']?
В соседней теме я дал Вам ссылку на официальный сайт языка программирования php
Начинайте изучать основы.
На этом я прекращаю свою помощь_
Удачи!!!

  Ответить  
 
 автор: Василий   (06.01.2012 в 18:16)   письмо автору
 
   для: Slo_Nik   (06.01.2012 в 17:57)
 

[checkme] => on
галочка есть

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

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