Помощник
|
Нужен совет или решение по сокращению кода |
pjotr
|
Сообщение
#1
|
||
|
|
||
|
|||
Den1xxx |
30.1.2013, 11:29;
Ответить: Den1xxx
Сообщение
#2
|
|
[PHP]<input type='file' name='screen1' class='addproduct'>[/PHP]
Лучше имя сделать массивом: [PHP]<input type='file' name='screen[]' class='addproduct'>[/PHP] А поле добавлять по желанию пользователя, при клике на кнопку "Добавить файлы". Полученное попадет в массив $_FILES['screen'] для обработчика. И тогда откроете волшебную функцию foreach для обработки массивов. [PHP]foreach ($_FILES['screen'] as $file)[/PHP] |
|
|
pjotr
|
Сообщение
#3
|
|
Спасибо за идею, но что-то все равно не так.
Видимо криво написан обработчик [PHP]<?php require_once 'login.php'; if (isset($_POST['category']) && isset($_POST['title']) && isset($_POST['descr']) && isset($_POST['date'])) { $category = $_POST['category']; $title = $_POST['title']; $descr = $_POST['descr']; $date = $_POST['date']; } if ((empty($category)) || (empty($title)) || (empty($descr)) || (empty($date))) { echo "<script language=javascript>alert('Заполните все поля');</script>"; echo "<script>history.go(-1)</script>"; exit; } $imgDir = "../folio/img"; @mkdir($imgDir, 0777); if ($_FILES) { $_FILES['preview']['tmp_name']; $_FILES['screen']['tmp_name']; foreach ($_FILES['screen'] as $file){ $filetmp = $file['tmp_name']; $filename = $file['name']; } array ( screen => ++$screen, ); switch($_FILES['preview']['type']) { case 'image/pjpeg': case 'image/jpeg': $type0 = 'jpg'; break; case 'image/png': $type0 = 'png'; break; case 'image/gif': $type0 = 'gif'; break; case 'image/tiff': $type0 = 'tif'; break; default: $type0 = ''; break; } switch($file['type']) { case 'image/pjpeg': case 'image/jpeg': $type = 'jpg'; break; case 'image/png': $type = 'png'; break; case 'image/gif': $type = 'gif'; break; case 'image/tiff': $type = 'tif'; break; default: $type = ''; break; } if ($type0) { $preview = "$imgDir/".time()."-0.".$type0; move_uploaded_file($_FILES['preview']['tmp_name'], $preview); } else echo "Нет превью<br>"; if ($type) { $screen = "$imgDir/".time()."-1.".$type; move_uploaded_file($filetmp, $screen); } else echo "Нет скрина<br>"; } $connect = mysql_connect($db_hostname, $db_username, $db_password) or die("Ошибка соединения с сервером"); $result = mysql_query ("CREATE DATABASE IF NOT EXISTS $db_database") or die ("Ошибка соединения с БД"); $db = mysql_select_db($db_database, $connect) or die ("База данных не выбрана"); $result; mysql_query ("CREATE TABLE IF NOT EXISTS folio ( id INT NOT NULL AUTO_INCREMENT, category VARCHAR(160), title VARCHAR(160), descr VARCHAR(300), preview TEXT, screens TEXT, date VARCHAR(160), PRIMARY KEY (id) )") or die (mysql_error()); mysql_query ("INSERT INTO folio (category, title, descr, preview, screens, date) VALUES ('$category', '$title', '$descr', '$preview', '$file', '$date')") or die (mysql_error()); mysql_close ($connect); exit; ?>[/PHP] В БД в столбце screens записывается слово Array в каждой строке |
|
|
Den1xxx |
31.1.2013, 17:40;
Ответить: Den1xxx
Сообщение
#4
|
|
Сравните, Ваш код (1.) и ниже (2.) делают то же самое:
1. [PHP] if (isset($_POST['category']) && isset($_POST['title']) && isset($_POST['descr']) && isset($_POST['date'])) { $category = $_POST['category']; $title = $_POST['title']; $descr = $_POST['descr']; $date = $_POST['date']; } if ((empty($category)) || (empty($title)) || (empty($descr)) || (empty($date))) {echo "<script language=javascript>alert('Заполните все поля');</script>";echo "<script>history.go(-1)</script>";exit;}[/PHP] 2. [PHP]if (!isset($_POST['category'],$_POST['title'],$_POST['descr'],$_POST['date'])) echo "<script>history.go(-1)</script>";[/PHP] Кури http://www.php.su/functions/?isset Не так: [PHP]if ($_FILES)[/PHP] Правильно [PHP]if (isset($_FILES)) [/PHP] или [PHP]if (!empty($_FILES))[/PHP] А вот это что? [PHP] foreach ($_FILES['screen'] as $file){ $filetmp = $file['tmp_name']; $filename = $file['name']; }[/PHP] Там же должен быть просто перебор по индексу, т.е. [PHP] foreach ($_FILES['screen'] as $key=>$file){ $filetmp = $file['tmp_name'][$key]; $filename = $file['name'][$key]; }[/PHP] В БД в столбце screens записывается слово Array в каждой строке Чтобы разобраться почему так происходит, нужно сделать вывод переменной перед записью в базу, как-то так: [PHP]var_dump($file);[/PHP] |
|
|
Nitrex |
31.1.2013, 17:45;
Ответить: Nitrex
Сообщение
#5
|
|
|
|
|
pjotr
|
Сообщение
#6
|
|
Если
[PHP]if (isset($_FILES)) { foreach ($_FILES['screen']['tmp_name']['type'] as $key=>$file){ $filetmp = $file[$key]; } var_dump($file);[/PHP] Warning: Invalid argument supplied for foreach() in Z:/home/testy.ru/www/admin/addproduct.php on line 26 NULL Нет скрина А если так [PHP]if (isset($_FILES)) { foreach ($_FILES['screen'] as $key=>$file){ $filetmp = $file['tmp_name']['type'][$key]; } var_dump($file);[/PHP] array(4) { [0]=> int(19722) [1]=> int(9179) [2]=> int(158069) [3]=> int(6267) } Нет скрина А вот это тоже показывает []=> int() [PHP]var_dump($filetmp)[/PHP] Что не так? |
|
|
Den1xxx |
31.1.2013, 22:34;
Ответить: Den1xxx
Сообщение
#7
|
|
|
|
|
pjotr
|
Сообщение
#8
|
|
Попробовал.
array(2) { ["preview"]=> array(5) { ["name"]=> string(36) "e10760d340378b2c471e9ea4536010ad.jpg" ["type"]=> string(10) "image/jpeg" ["tmp_name"]=> string(14) "/tmp/phpCZVU3I" ["error"]=> int(0) ["size"]=> int(19722) } ["screen"]=> array(5) { ["name"]=> array(4) { [0]=> string(36) "f17ead11f4a4f3ec436a1324785c6e6f.jpg" [1]=> string(12) "adsense2.png" [2]=> string(60) "digital-deviantart-webdesign-site-inspirational-showcase.jpg" [3]=> string(5) "1.jpg" } ["type"]=> array(4) { [0]=> string(10) "image/jpeg" [1]=> string(9) "image/png" [2]=> string(10) "image/jpeg" [3]=> string(10) "image/jpeg" } ["tmp_name"]=> array(4) { [0]=> string(14) "/tmp/phpsfjbkT" [1]=> string(14) "/tmp/phpASIsA3" [2]=> string(14) "/tmp/phpSKYTQd" [3]=> string(14) "/tmp/phpqzyp7n" } ["error"]=> array(4) { [0]=> int(0) [1]=> int(0) [2]=> int(0) [3]=> int(0) } ["size"]=> array(4) { [0]=> int(9179) [1]=> int(158069) [2]=> int(89418) [3]=> int(45189) } } } Нет скрина Я так понял, в $_FILES записывается абсолютно всё, что получено с формы. ОК Но как с этим работать? Спасибо вам за ваше терпение))) |
|
|
pjotr
|
Сообщение
#9
|
|
Еще так попробовал, но файлы не переносятся в директорию
[PHP]if (isset($_FILES)) { var_dump($_FILES); foreach ($_FILES['screen'] as $i=>$screen) { switch($screen['type'][$i]) { case 'image/pjpeg': case 'image/jpeg': $type = 'jpg'; break; case 'image/png': $type = 'png'; break; case 'image/gif': $type = 'gif'; break; case 'image/tiff': $type = 'tif'; break; default: $type = ''; break; } if ($type) { $screen[$i] = "$imgDir/".time()."-[$i].".$type; move_uploaded_file($screen['tmp_name'][$i], $screen); } else echo "Нет скрина<br>"; } var_dump($screen); }[/PHP] |
|
|
pjotr
|
Сообщение
#10
|
|
Все-таки, методом проб и ошибок, научился перебирать массив, загружать несколько файлов на сервер, давая им имена "время_в_секундах-[номер]", и выводить их на экран:
[PHP]<?php require_once 'login.php'; $imgDir = "../portfolio/img"; @mkdir($imgDir, 0777); if (isset($_FILES)) { $screen = $_FILES['screen']; foreach($screen['name'] as $i => $file) { switch($screen['type'][$i]) { case 'image/pjpeg': case 'image/jpeg': $type = 'jpg'; break; case 'image/png': $type = 'png'; break; case 'image/gif': $type = 'gif'; break; case 'image/tiff': $type = 'tif'; break; default: $type = ''; break; } $tmpname = $screen['tmp_name'][$i]; $path = "$imgDir/".time()."-[$i].".$type; move_uploaded_file($tmpname, $path); echo "<img src='$path'>"; } }[/PHP] Но осталась проблема с БД: В файле-обработчике вместо строки [PHP]echo "<img src='$path'>";[/PHP] пишу строку [PHP]$pathfile = "<img src='$path'>";[/PHP] Далее следует подключение и запрос к БД: [PHP]$connect = mysql_connect($db_hostname, $db_username, $db_password) or die("Ошибка соединения с сервером"); mysql_select_db($db_database, $connect) or die ("База данных не выбрана"); mysql_query ("CREATE DATABASE IF NOT EXISTS $db_database") or die ("Ошибка соединения с БД"); mysql_query ("CREATE TABLE IF NOT EXISTS portfolio ( id INT NOT NULL AUTO_INCREMENT, category VARCHAR(160), title VARCHAR(160), descr TEXT, date VARCHAR(160), screens TEXT, PRIMARY KEY (id) )") or die (mysql_error()); mysql_query ("INSERT INTO portfolio (category, title, descr, date, screens) VALUES ('$category', '$title', '$descr', '$preview', '$date', '$pathfile')") or die (mysql_error()); mysql_close ($connect); exit; ?>[/PHP] Файлы загружаются на сервер, создается таблица, но в нее не попадает ни одного файла, а обработчик выдает ошибку: [PHP]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '../portfolio/img/1359678500-[3].jpg'>')' at line 2[/PHP] Пробовал еще категорию, название, описание и дату добавлять через формы, но даже так таблица остается пустой. Подскажите, пожалуйста, как решается эта проблема. В чем я ошибся? П.С. А вообще возможно записать в одну ячейку screens все значения переменной pathfile(их всего 4) в виде строки <img ...><img ...><img ...><img ...> ?Или это угловые скобки мешают, и mysql их не принимает? Просто я хочу, чтобы каждому id соответствовали несколько картинок, добавленных через форму. |
|
|
|
Похожие темы
Тема | Ответов | Автор | Просмотров | Последний ответ | |
---|---|---|---|---|---|
Восстановление сайтов из Вебархива в HTML или на Wordpress. | 47 | freeax | 35847 | 12.9.2024, 16:19 автор: SpaceEx |
|
Нужен исполнитель на постоянную основу для набора небольших текстов | 21 | Думающий | 10400 | 11.9.2024, 15:54 автор: Думающий |
|
Нужен обмен вебмоней на карту | 9 | sasiza1 | 1467 | 7.9.2024, 12:32 автор: SpaceEx |
|
Создать видеоканал лучше в ютуб или телеграм? | 28 | uahomka | 7498 | 3.9.2024, 6:37 автор: Skyworker |
|
Выполню качественную верстку макетов или разработка собственного, быстро и не дорого от 45$ |
126 | webche | 122762 | 17.8.2024, 8:37 автор: webche |
Текстовая версия | Сейчас: 18.9.2024, 21:52 |