Есть база с таблицами, записи в tickets падают, но в images нет и соответственно не загружается изображение в папку, куда копать? Есть такой код, PHP: <?php $dsn = "mysql:host=localhost;dbname=new_db;charset=utf8"; $options = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC ]; $pdo = new PDO($dsn, 'admin', 'pass', $options); $id_shops = $_POST['id_shop']; $contact = $_POST['contacts']; $problem = $_POST['problem']; $data = $_POST['data']; $stmt = $pdo->prepare("INSERT INTO tickets (id_shop, contacts, problem, data) VALUES (:id_shop, :contact, :problem, :data)"); $stmt->bindParam(':id_shop', $id_shops); $stmt->bindParam(':contact', $contact); $stmt->bindParam(':problem', $problem); $stmt->bindParam(':data', $data); $falg = $stmt->execute(); if(isset($_POST['submit'])) { $countfiles = count($_FILES['files']['imgname']); $query = "INSERT INTO images (imgname,image) VALUES(?,?)"; $statement = $pdo->prepare($query); for($i = 0; $i < $countfiles; $i++) { $filename = $_FILES['files']['imgname'][$i]; $target_file = './uploads/'.$filename; $file_extension = pathinfo( $target_file, PATHINFO_EXTENSION); $file_extension = strtolower($file_extension); $valid_extension = array("png","jpeg","jpg"); if(in_array($file_extension, $valid_extension)) { if(move_uploaded_file( $_FILES['files']['tmp_name'][$i], $target_file) ) { $statement->execute( array($filename,$target_file)); } } } echo "Данные успешно отправлены"; echo "<br>"; } ?>
Для начала можно сделать проверку на файл if (is_file($filename) { } Для $target_file установить абсолютный путь $_SERVER['DOCUMENT_ROOT']
PHP: <html> <body> <?php $link=mysqli_connect('localhost', 'admin', 'pass', 'new_db') or die(mysqli_error() .$link); $sql=('SELECT name, id_shop FROM shop ORDER BY name ASC'); $result=mysqli_query($link, $sql); ?> <form action="form.php" method="post" name="forma" enctype='multipart/form-data'> <fieldset> <select name="id_shop"> <?php while($name = mysqli_fetch_assoc($result)):?> <option value="<?=$name['id_shop']?>"><?=$name['name']?></option> <?php endwhile?> </select> </br> <label for="contacts">Введите телефон для связи:</label><br/> <input type="number" name="contacts" size="200"><br/> <label for="problem">Описание проблемы:</label><br/> <input type="text" name="problem" size="200"><br/> <label for="data">Текущая дата:</label><br/> <input name="data" type="datetime-local"> <input type='file' name='files[]' multiple /></br> <input id="submit" type="submit" value="Отправить данные"><br/> </fieldset> <br/> </form> </body> </html> каким образом выполнить дамп? таблица по сути пустая, в ней данных нет
Попробовал у себя сделать. Поменял все $_FILES['files']['imgname'] на $_FILES['files']['name'], картинка загрузилась. --- Добавлено --- И здесь у вас пусто if(isset($_POST['submit'])) {
почему же? по задумке при нажатии на кнопку "отправить" выполняется условие отправки прописанное далее, или что-то неверно в логике? загружается в папку картинка? просто проблема, что даже в базе не появляется запись, не подскажите каким образом можно отследить косяк?
В базе было пусто, потому что картинка не приходила вообще. Проблема решилась как раз заменой на $_FILES['files']['name']. Вместо if(isset($_POST['submit'])) { используйте проверку на заполненность полей и наличия файла картинки.
данная махинация не спасла ситуацию к сожалению, добавил в конце PHP: 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 ) ) )
в общем, до этого он мне вообще сообщения не выдавал, что данные отправлены, словно где-то какая-то ошибка происходит, поменял некоторые параметры, теперь пишет, что данные отправлены, но они нихрена не отправлены PHP: if(isset($_FILES) && $_FILES['files']['error'] == 0) { $countfiles = count($_FILES['files']['name']); $query = "INSERT INTO images (imgname,image) VALUES(?,?)"; $statement = $pdo->prepare($query); for($i = 0; $i < $countfiles; $i++) { $filename = $_FILES['files']['name'][$i]; $target_file = dirname(__FILE__) .'/'.$_FILES['files']['name']; $file_extension = pathinfo( $target_file, PATHINFO_EXTENSION); $file_extension = strtolower($file_extension); $valid_extension = array("png","jpeg","jpg"); if(in_array($file_extension, $valid_extension)) { if(move_uploaded_file( $_FILES['files']['name'][$i], $target_file) ) { $statement->execute( array($filename,$target_file)); } } } echo "Данные успешно отправлены"; echo "<br>"; }
можете ткнуть носом на пример? буду очень признателен, облазил множество сайтов с примерами по загрузке файлов, но как это сделать в виде массива так и не понял
PHP: Загрузка файлов методом POST - Manual. Тут всё подробнейшим образом объяснено. Случай с массивом файлов - Пример #3 Загрузка массива файлов PS: найдите отличия: $_FILES['files']['name'][$i]; $_FILES['files']['name']; (см. строки 8 и 9 кода из сообщения #10)
по правде говоря делал, что называется по образу и подобию, особого описания кода не было и вникал сам сидел, как мне кажется переменная [$I] выступает в роли счетчика загруженных файлов, поправьте, если ошибаюсь
Ещё раз: $target_file. Что должно быть в этой переменной? @"А вы что написали? Хорошо, что хоть не нарисовали!"
Ладно, зайдём с другой стороны: песочница. Спойлер PS: посмотрите ещё раз на свой код из сообщения #10 (строки 8 и 9)
понял только, что создаем пустой пассив, заносим в него какое-то имя $arr = []; $arr['files']['name'][0] = 'filename.ext'; сохраняем имя первого файла, больше не понял $filename = $arr['files']['name'][0]; $target_file = $arr['files']['name']; var_dump($filename, $target_file);
Это был упрощённый пример того, как вы формируете $target_file. Сравните с тем, как формируете $filename Чего в первом случае не хватает? Спойлер Зачем к переменной $target_file цепляете массив? Почему не строку, как это делаете для переменной $filename?
разве $_FILES['files']['name'] выдаст массив полностью? я почему-то был уверен, что только имя, параметр name же указан... ну как я понял $filename не объявляется как массив, а по сути просто в него вносится строка
Кто в ответ на #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') - были бы значения, а не массивы значений.
то есть $i выступает не как счетчик, а как указание элемента массива, вроде дошло как я понял квадратные скобки указываются при множественной загрузке
некоторое время не мог заниматься этим так сказать проектом, но все таки решил попробовать его добить, на мой взгляд все верно, но почему-то файл так и не появляется в папка "Uploads", может кто подсказать почему? про проверку имени файла знаю, потом допилю, когда файл будет корректно загружаться в папку PHP: if(isset($_POST['submit'])) { $countfiles = count($_FILES['files']['name']); for($i = 0; $i < $countfiles; $i++) { $filename = $_FILES['files']['name'][$i]; $target_file = $_SERVER['DOCUMENT_ROOT'] . '/uploads/' . $filename; $file_extension = pathinfo( $target_file, PATHINFO_EXTENSION); $file_extension = strtolower($file_extension); $valid_extension = array("png","jpeg","jpg"); if(in_array($file_extension, $valid_extension)) { if(move_uploaded_file( $_FILES['files']['tmp_name'][$i], $target_file) ) { $statement->execute( array($filename,$target_file)); } } } }
См. права на запись и т.п. --- Добавлено --- Это иногда не спасает. Может быть и такой php-файл, который будет запускаться: file.php.jpg --- Добавлено --- Apache грешит такой такой фигней.
первым делом для теста дал полные права группе "Все", не спасло. вся эта беда крутится на OpenServer пока что, может в этом дело?