За последние 24 часа нас посетили 36830 программистов и 7893 робота. Сейчас ищут 1787 программистов ...

Не прикрепляется изображение

Тема в разделе "PHP для новичков", создана пользователем lamac0, 9 сен 2022.

  1. lamac0

    lamac0 Новичок

    С нами с:
    4 авг 2022
    Сообщения:
    42
    Симпатии:
    0
    Есть база с таблицами, записи в tickets падают, но в images нет и соответственно не загружается изображение в папку, куда копать?
    upload_2022-9-9_12-53-41.png
    Есть такой код,

    PHP:
    1. <?php
    2. $dsn = "mysql:host=localhost;dbname=new_db;charset=utf8";
    3. $options = [
    4.       PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    5.       PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
    6.     ];
    7. $pdo = new PDO($dsn, 'admin', 'pass', $options);
    8. $id_shops = $_POST['id_shop'];
    9. $contact = $_POST['contacts'];
    10. $problem = $_POST['problem'];
    11. $data = $_POST['data'];
    12. $stmt = $pdo->prepare("INSERT INTO tickets (id_shop, contacts, problem, data) VALUES (:id_shop, :contact, :problem, :data)");
    13. $stmt->bindParam(':id_shop', $id_shops);
    14. $stmt->bindParam(':contact', $contact);
    15. $stmt->bindParam(':problem', $problem);
    16. $stmt->bindParam(':data', $data);
    17. $falg = $stmt->execute();
    18.  
    19. if(isset($_POST['submit'])) {
    20. $countfiles = count($_FILES['files']['imgname']);
    21. $query = "INSERT INTO images (imgname,image) VALUES(?,?)";
    22. $statement = $pdo->prepare($query);
    23.  
    24. for($i = 0; $i < $countfiles; $i++) {
    25.  
    26.     $filename = $_FILES['files']['imgname'][$i];
    27.     $target_file = './uploads/'.$filename;
    28.     $file_extension = pathinfo(
    29.     $target_file, PATHINFO_EXTENSION);
    30.     $file_extension = strtolower($file_extension);
    31.  
    32.     $valid_extension = array("png","jpeg","jpg");
    33.  
    34.     if(in_array($file_extension, $valid_extension)) {
    35.  
    36.         if(move_uploaded_file(
    37.             $_FILES['files']['tmp_name'][$i],
    38.             $target_file)
    39.         ) {
    40.             $statement->execute(
    41.                 array($filename,$target_file));
    42.         }
    43.     }
    44. }
    45.  
    46. echo "Данные успешно отправлены";
    47. echo "<br>";
    48. }
    49. ?>
     
  2. sereginpro

    sereginpro Новичок

    С нами с:
    2 сен 2022
    Сообщения:
    5
    Симпатии:
    0
    Для начала можно сделать проверку на файл

    if (is_file($filename) {

    }

    Для $target_file установить абсолютный путь $_SERVER['DOCUMENT_ROOT']
     
  3. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    947
    Симпатии:
    147
    Хороша же тикетка с полем problem varchar(255) ;)
     
  4. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    183
    Покажи ещё форму и дамп images.
     
  5. lamac0

    lamac0 Новичок

    С нами с:
    4 авг 2022
    Сообщения:
    42
    Симпатии:
    0
    PHP:
    1. <html>
    2. <body>
    3.     <?php
    4.       $link=mysqli_connect('localhost', 'admin', 'pass', 'new_db') or die(mysqli_error() .$link);
    5.     $sql=('SELECT name, id_shop FROM shop ORDER BY name ASC');
    6.         $result=mysqli_query($link, $sql);
    7.         ?>
    8.     <form action="form.php" method="post" name="forma" enctype='multipart/form-data'>
    9.     <fieldset>
    10.     <select name="id_shop">
    11.   <?php while($name = mysqli_fetch_assoc($result)):?>
    12.   <option value="<?=$name['id_shop']?>"><?=$name['name']?></option>
    13.   <?php endwhile?>
    14. </select> </br>
    15.     <label for="contacts">Введите телефон для связи:</label><br/>
    16.     <input type="number" name="contacts" size="200"><br/>
    17.     <label for="problem">Описание проблемы:</label><br/>
    18.     <input type="text" name="problem" size="200"><br/>
    19.     <label for="data">Текущая дата:</label><br/>
    20.     <input name="data" type="datetime-local">
    21.     <input type='file' name='files[]' multiple /></br>
    22.   <input id="submit" type="submit" value="Отправить данные"><br/>
    23.     </fieldset>
    24.     <br/>
    25. </form>
    26. </body>
    27. </html>
    каким образом выполнить дамп? таблица по сути пустая, в ней данных нет
     
    #5 lamac0, 13 сен 2022
    Последнее редактирование: 13 сен 2022
  6. sereginpro

    sereginpro Новичок

    С нами с:
    2 сен 2022
    Сообщения:
    5
    Симпатии:
    0
    Попробовал у себя сделать.
    Поменял все $_FILES['files']['imgname'] на $_FILES['files']['name'], картинка загрузилась.
    --- Добавлено ---
    И здесь у вас пусто

    1. if(isset($_POST['submit'])) {
     
  7. lamac0

    lamac0 Новичок

    С нами с:
    4 авг 2022
    Сообщения:
    42
    Симпатии:
    0
    почему же? по задумке при нажатии на кнопку "отправить" выполняется условие отправки прописанное далее, или что-то неверно в логике?

    загружается в папку картинка? просто проблема, что даже в базе не появляется запись, не подскажите каким образом можно отследить косяк?
     
  8. sereginpro

    sereginpro Новичок

    С нами с:
    2 сен 2022
    Сообщения:
    5
    Симпатии:
    0
    В базе было пусто, потому что картинка не приходила вообще. Проблема решилась как раз заменой на $_FILES['files']['name'].

    Вместо if(isset($_POST['submit'])) { используйте проверку на заполненность полей и наличия файла картинки.
     
  9. lamac0

    lamac0 Новичок

    С нами с:
    4 авг 2022
    Сообщения:
    42
    Симпатии:
    0
    данная махинация не спасла ситуацию к сожалению, добавил в конце
    PHP:
    1. print_r($_FILES);
    и получил следующее
    Array ( [files] => Array ( [name] => Array ( [0] => 1.jpeg ) [type] => Array ( [0] => image/jpeg ) [tmp_name] => Array ( [0] => D:\OpenServer\userdata\temp\upload\php6A67.tmp ) [error] => Array ( [0] => 0 ) [size] => Array ( [0] => 165344 ) ) )
     
  10. lamac0

    lamac0 Новичок

    С нами с:
    4 авг 2022
    Сообщения:
    42
    Симпатии:
    0
    в общем, до этого он мне вообще сообщения не выдавал, что данные отправлены, словно где-то какая-то ошибка происходит, поменял некоторые параметры, теперь пишет, что данные отправлены, но они нихрена не отправлены :D

    PHP:
    1. if(isset($_FILES) && $_FILES['files']['error'] == 0) {
    2. $countfiles = count($_FILES['files']['name']);
    3. $query = "INSERT INTO images (imgname,image) VALUES(?,?)";
    4. $statement = $pdo->prepare($query);
    5.  
    6. for($i = 0; $i < $countfiles; $i++) {
    7.  
    8.     $filename = $_FILES['files']['name'][$i];
    9.     $target_file = dirname(__FILE__) .'/'.$_FILES['files']['name'];
    10.     $file_extension = pathinfo(
    11.     $target_file, PATHINFO_EXTENSION);
    12.     $file_extension = strtolower($file_extension);
    13.  
    14.     $valid_extension = array("png","jpeg","jpg");
    15.  
    16.     if(in_array($file_extension, $valid_extension)) {
    17.  
    18.         if(move_uploaded_file(
    19.             $_FILES['files']['name'][$i],
    20.             $target_file)
    21.         ) {
    22.             $statement->execute(
    23.                 array($filename,$target_file));
    24.         }
    25.     }
    26. }
    27.  
    28. echo "Данные успешно отправлены";
    29. echo "<br>";
    30.  
    31. }
     
  11. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    @lamac0, $target_file формируете из массива, а не имени файла.
     
  12. lamac0

    lamac0 Новичок

    С нами с:
    4 авг 2022
    Сообщения:
    42
    Симпатии:
    0
    можете ткнуть носом на пример? буду очень признателен, облазил множество сайтов с примерами по загрузке файлов, но как это сделать в виде массива так и не понял
     
  13. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    PHP: Загрузка файлов методом POST - Manual.
    Тут всё подробнейшим образом объяснено.
    Случай с массивом файлов - Пример #3 Загрузка массива файлов
    PS: найдите отличия:
    $_FILES['files']['name'][$i];
    $_FILES['files']['name'];
    (см. строки 8 и 9 кода из сообщения #10)
     
  14. lamac0

    lamac0 Новичок

    С нами с:
    4 авг 2022
    Сообщения:
    42
    Симпатии:
    0
    по правде говоря делал, что называется по образу и подобию, особого описания кода не было и вникал сам сидел, как мне кажется переменная [$I] выступает в роли счетчика загруженных файлов, поправьте, если ошибаюсь
     
  15. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    Ещё раз: $target_file. Что должно быть в этой переменной?
    @"А вы что написали? Хорошо, что хоть не нарисовали!"
     
  16. lamac0

    lamac0 Новичок

    С нами с:
    4 авг 2022
    Сообщения:
    42
    Симпатии:
    0
    ну судя по всему там путь, куда сохранится файл после всех проверок
     
  17. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    Ладно, зайдём с другой стороны: песочница.
    PS: посмотрите ещё раз на свой код из сообщения #10 (строки 8 и 9)
     
  18. lamac0

    lamac0 Новичок

    С нами с:
    4 авг 2022
    Сообщения:
    42
    Симпатии:
    0
    понял только, что создаем пустой пассив, заносим в него какое-то имя
    $arr = [];
    $arr['files']['name'][0] = 'filename.ext';

    сохраняем имя первого файла, больше не понял
    $filename = $arr['files']['name'][0];
    $target_file = $arr['files']['name'];
    var_dump($filename, $target_file);
     
    #18 lamac0, 20 сен 2022
    Последнее редактирование: 20 сен 2022
  19. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    Это был упрощённый пример того, как вы формируете $target_file.
    Сравните с тем, как формируете $filename
    Чего в первом случае не хватает?
    Зачем к переменной $target_file цепляете массив? Почему не строку, как это делаете для переменной $filename?
     
  20. lamac0

    lamac0 Новичок

    С нами с:
    4 авг 2022
    Сообщения:
    42
    Симпатии:
    0
    разве $_FILES['files']['name'] выдаст массив полностью? я почему-то был уверен, что только имя, параметр name же указан...

    ну как я понял $filename не объявляется как массив, а по сути просто в него вносится строка
     
  21. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    Кто в ответ на #13 ответил, что
    (с советом присмотреться к примеру 3, в котором описана передача нескольких файлов)?
    Кто в форме использует атрибут name='files[]'?
    Кто в одном цикле для $filename берёт i-й элемент массива по индексу 'name', я для $target_name - целиком массив 'name'? (те самые строчки кода 8 и 9 из сообщения #10)
    В данном случае в форме передаёте массив файлов.
    $_FILES['files']['name'] - массив имён
    $_FILES['userfile']['type'] - массив mime-типов
    $_FILES['userfile']['size'] - массив размеров
    переданных файлов.
    Передавали бы один файл (name='files') - были бы значения, а не массивы значений.
     
  22. lamac0

    lamac0 Новичок

    С нами с:
    4 авг 2022
    Сообщения:
    42
    Симпатии:
    0
    то есть $i выступает не как счетчик, а как указание элемента массива, вроде дошло

    как я понял квадратные скобки указываются при множественной загрузке
     
  23. lamac0

    lamac0 Новичок

    С нами с:
    4 авг 2022
    Сообщения:
    42
    Симпатии:
    0
    некоторое время не мог заниматься этим так сказать проектом, но все таки решил попробовать его добить, на мой взгляд все верно, но почему-то файл так и не появляется в папка "Uploads", может кто подсказать почему? про проверку имени файла знаю, потом допилю, когда файл будет корректно загружаться в папку

    PHP:
    1. if(isset($_POST['submit'])) {
    2.  
    3.  
    4.     $countfiles = count($_FILES['files']['name']);
    5.  
    6.  
    7.      for($i = 0; $i < $countfiles; $i++) {
    8.  
    9.  
    10.         $filename = $_FILES['files']['name'][$i];
    11.  
    12.  
    13.         $target_file = $_SERVER['DOCUMENT_ROOT'] . '/uploads/' . $filename;
    14.  
    15.  
    16.         $file_extension = pathinfo(
    17.           $target_file, PATHINFO_EXTENSION);
    18.  
    19.         $file_extension = strtolower($file_extension);
    20.  
    21.  
    22.         $valid_extension = array("png","jpeg","jpg");
    23.  
    24.         if(in_array($file_extension, $valid_extension)) {
    25.  
    26.  
    27.             if(move_uploaded_file(
    28.                 $_FILES['files']['tmp_name'][$i],
    29.                 $target_file)
    30.             ) {
    31.  
    32.  
    33.                 $statement->execute(
    34.                     array($filename,$target_file));
    35.             }
    36.         }
    37.     }
    38.  
    39.  
    40. }
     
  24. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    656
    См. права на запись и т.п.
    --- Добавлено ---
    Это иногда не спасает. Может быть и такой php-файл, который будет запускаться: file.php.jpg ;)
    --- Добавлено ---
    Apache грешит такой такой фигней.
     
  25. lamac0

    lamac0 Новичок

    С нами с:
    4 авг 2022
    Сообщения:
    42
    Симпатии:
    0
    первым делом для теста дал полные права группе "Все", не спасло. вся эта беда крутится на OpenServer пока что, может в этом дело?