X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

3 страниц V   1 2 3 >
Открыть тему
Тема закрыта
> Нужен совет или решение по сокращению кода
pjotr
pjotr
Topic Starter сообщение 30.1.2013, 10:57; Ответить: pjotr
Сообщение #1


Форма для добавления записей и файлов в базу. Код слишком длинный и много повторяющихся эл-тов. Ума не приложу, как сделать код меньше
Как можно сократить эту форму?
[PHP]<?php
echo <<<_END
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Добавить продукт</title>
<link rel='stylesheet' href='../layouts/css/reset.css'>
<link rel='stylesheet' href='../layouts/css/style.css'>
</head>
<body>
<div class='admin-center'>
<form action='addproduct.php' method='POST' enctype='multipart/form-data'>
Категория:&nbsp;<input type='text' name='category' size='30' class='addproduct'><br>
Название:&nbsp;<input type='text' name='title' size='30' class='addproduct'><br>
Описание:&nbsp;<textarea name='descr' class='addproduct' rows=5></textarea><br>
Дата:&nbsp;<input type='text' name='date' size='30' class='addproduct'><br>
Превью:&nbsp;<input type='file' name='preview' class='addproduct'><br>
Скрин1:&nbsp;<input type='file' name='screen1' class='addproduct'><br>
Скрин2:&nbsp;<input type='file' name='screen2' class='addproduct'><br>
Скрин3:&nbsp;<input type='file' name='screen3' class='addproduct'><br>
Скрин4:&nbsp;<input type='file' name='screen4' class='addproduct'><br>
Скрин5:&nbsp;<input type='file' name='screen5' class='addproduct'><br>
<input type='submit' name='doUpload' value='Отправить' class='addproduct-btn'>
</form>
</div>
</body>
</html>
_END;
?>[/PHP]


Как можно сократить обработчик?
[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['screen1']['tmp_name'];
$_FILES['screen2']['tmp_name'];
$_FILES['screen3']['tmp_name'];
$_FILES['screen4']['tmp_name'];
$_FILES['screen5']['tmp_name'];
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($_FILES['screen1']['type'])
{
case 'image/pjpeg':
case 'image/jpeg': $type1 = 'jpg'; break;
case 'image/png': $type1 = 'png'; break;
case 'image/gif': $type1 = 'gif'; break;
case 'image/tiff': $type1 = 'tif'; break;
default: $type1 = ''; break;
}
switch($_FILES['screen2']['type'])
{
case 'image/pjpeg':
case 'image/jpeg': $type2 = 'jpg'; break;
case 'image/png': $type2 = 'png'; break;
case 'image/gif': $type2 = 'gif'; break;
case 'image/tiff': $type2 = 'tif'; break;
default: $type2 = ''; break;
}
switch($_FILES['screen3']['type'])
{
case 'image/pjpeg':
case 'image/jpeg': $type3 = 'jpg'; break;
case 'image/png': $type3 = 'png'; break;
case 'image/gif': $type3 = 'gif'; break;
case 'image/tiff': $type3 = 'tif'; break;
default: $type3 = ''; break;
}
switch($_FILES['screen4']['type'])
{
case 'image/pjpeg':
case 'image/jpeg': $type4 = 'jpg'; break;
case 'image/png': $type4 = 'png'; break;
case 'image/gif': $type4 = 'gif'; break;
case 'image/tiff': $type4 = 'tif'; break;
default: $type4 = ''; break;
}
switch($_FILES['screen5']['type'])
{
case 'image/pjpeg':
case 'image/jpeg': $type5 = 'jpg'; break;
case 'image/png': $type5 = 'png'; break;
case 'image/gif': $type5 = 'gif'; break;
case 'image/tiff': $type5 = 'tif'; break;
default: $type5 = ''; break;
}
if ($type0)
{
$preview = "$imgDir/".time()."-0.".$type0;
move_uploaded_file($_FILES['preview']['tmp_name'], $preview);
}
else echo "Нет превью<br>";
if ($type1)
{
$screen1 = "$imgDir/".time()."-1.".$type1;
move_uploaded_file($_FILES['screen1']['tmp_name'], $screen1);
}
else echo "Нет скрина1<br>";
if ($type2)
{
$screen2 = "$imgDir/".time()."-2.".$type2;
move_uploaded_file($_FILES['screen2']['tmp_name'], $screen2);
}
else echo "Нет скрина2<br>";
if ($type3)
{
$screen3 = "$imgDir/".time()."-3.".$type3;
move_uploaded_file($_FILES['screen3']['tmp_name'], $screen3);
}
else echo "Нет скрина3<br>";
if ($type4)
{
$screen4 = "$imgDir/".time()."-4.".$type4;
move_uploaded_file($_FILES['screen4']['tmp_name'], $screen4);
}
else echo "Нет скрина4<br>";
if ($type5)
{
$screen5 = "$imgDir/".time()."-5.".$type5;
move_uploaded_file($_FILES['screen5']['tmp_name'], $screen5);
}
else echo "Нет скрина5<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,
screen1 TEXT,
screen2 TEXT,
screen3 TEXT,
screen4 TEXT,
screen5 TEXT,
date VARCHAR(160),
PRIMARY KEY (id)
)") or die (mysql_error());
mysql_query ("INSERT INTO folio (category, title, descr, preview, screen1, screen2, screen3, screen4, screen5, date)
VALUES ('$category', '$title', '$descr', '$preview', '$screen1', '$screen2', '$screen3', '$screen4', '$screen5', '$date')")
or die (mysql_error());
mysql_close ($connect);
exit;
?>[/PHP]
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Den1xxx
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
pjotr
Topic Starter сообщение 31.1.2013, 14:32; Ответить: 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
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]

(pjotr @ 31.1.2013, 17:32) *
В БД в столбце screens записывается слово Array в каждой строке

Чтобы разобраться почему так происходит, нужно сделать вывод переменной перед записью в базу, как-то так:
[PHP]var_dump($file);[/PHP]
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Nitrex
Nitrex
сообщение 31.1.2013, 17:45; Ответить: Nitrex
Сообщение #5


(Den1xxx @ 31.1.2013, 20:40) *
Чтобы разобраться почему так происходит, нужно сделать вывод переменной перед записью в базу, как-то так:
[PHP]var-dump($file);[/PHP]

[PHP]var_dump($file)[/PHP]
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
pjotr
pjotr
Topic Starter сообщение 31.1.2013, 21:17; Ответить: 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
Den1xxx
сообщение 31.1.2013, 22:34; Ответить: Den1xxx
Сообщение #7


(pjotr @ 1.2.2013, 00:17) *
Что не так?

Попробуйте
[PHP]if (isset($_FILES)){ var_dump($_FILES)


...[/PHP]
и думаю догадаетесь что не так.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
pjotr
pjotr
Topic Starter сообщение 31.1.2013, 22:50; Ответить: 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
pjotr
Topic Starter сообщение 31.1.2013, 23:32; Ответить: 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
pjotr
Topic Starter сообщение 1.2.2013, 4:39; Ответить: 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 соответствовали несколько картинок, добавленных через форму.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
3 страниц V   1 2 3 >
Открыть тему
Тема закрыта
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Создать видеоканал лучше в ютуб или телеграм?
10 uahomka 1782 24.3.2024, 4:21
автор: Alexand3r
Открытая тема (нет новых ответов) Если статья не в индексе Google - она уникальна или нет?
2 uahomka 799 20.3.2024, 11:17
автор: Vmir
Открытая тема (нет новых ответов) Где больше пробив на кликандер или попандер или попап трафике?
1 Boymaster 613 20.3.2024, 9:50
автор: Skyworker
Горячая тема (нет новых ответов) Выполню качественную верстку макетов или разработка собственного, быстро и не дорого
от 45$
123 webche 116749 17.3.2024, 7:09
автор: webche
Открытая тема (нет новых ответов) От какого экрана будут меньше уставать глаза OLED или IPS?
3 metvekot 981 12.3.2024, 16:25
автор: MisterBit


 



RSS Текстовая версия Сейчас: 29.3.2024, 1:06
Дизайн