Проблем със скрипт за Upload на .rar, zip файлове

ludasam

Registered
Има ли грешка кода или заради самата сесия за избора на файловете ми прави проблеми кода и ми дава само:
За съжеление се появи грешка!
Моля започнете от начало качването!
error:

При опит да проверя дали взима файла с променлива $fail , резултата е нулев, но не ми се връзва просто на localhost-а, да работи, а на платения хостинг да не работи!

Използвам и интеграция на phpBB3..

Ако махна на session_start(); "@" идва следния проблем:

[phpBB Debug] PHP Notice: in file /home/ludasam/public_html/add.php on line 10: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at /home/ludasam/public_html/themes/header.php:23)
[phpBB Debug] PHP Notice: in file /home/ludasam/public_html/add.php on line 10: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /home/ludasam/public_html/themes/header.php:23)

Код:
<?php
if ($user->data['user_id'] == ANONYMOUS){
	echo "<div class=\"gtitle\"><center>РЕКЛАМА</center></div>
	<div class=\"ginfo\"><br />  Трябва да си влезеш в профила, за да качваш <b>plugins</b>.><br /></div>
	<div class=\"gtitle-down\"> </div>";
}
else {
echo "<div class=\"gtitle\"><center>Добавяне на plugin</center></div>
	<div class=\"ginfo\"><br />";
@session_start();
// CONFIG START //

$max_razmer = 2024; //(2 mb) максималният размер на файл (в KB)
$max_razre6eni_failove = 5; // колко файла на веднъж да може да се качват!
$ext = array('zip','rar'); // кои разширения да са разрешени
$folder = "./files/plugins/"; // папката в, която ще се качват файловете
$fail_replace = 0; // да позволява ли заместването на новите файлове с еднакво име със старите (1 за ДА, 0 за НЕ)

if (isset($_POST['upload'])) {
if (isset($_SESSION['broi']) && $_SESSION['broi'] > 0 && $_SESSION['broi'] <= $max_razre6eni_failove) {
	for ($i=1;$i<=$_SESSION['broi'];$i++) {
if ($_FILES["fail_$i"]['name'] != NULL) {
	$extnafaila = end(explode('.',$_FILES["fail_$i"]['name']));
	$extnafaila = strtolower($extnafaila);
if(in_array($extnafaila,$ext)){
	$razmer_max_fail = $max_razmer * 1024;
if ($_FILES["fail_$i"]['size'] <= $razmer_max_fail) {
	$putq = $folder.basename($_FILES["fail_$i"]['name']);
if ($fail_replace == 0 && @file_exists($putq)) {
	$exit_message .= "<br>	  <font color=\"red\"><b>".$_FILES["fail_$i"]['name']."</b> не беше качен. Вече съществува такъв файл!</font>
<br /><br />";
} 
else {
if (copy($_FILES["fail_$i"]['tmp_name'], $putq)) {
	$exit_message .= "<br>	  <font color=\"green\"><b>".$_FILES["fail_$i"]['name']."</b> файлът беше качен успешно!</font>
<br /><br />";
$file = $_FILES["fail_$i"]['name'];
$fail = "$folder/$file";
$odobren = "ne";
$cat = "plugins";
$title = trim(strip_tags(addslashes($_POST['title'])));
$opisanie = trim(strip_tags(addslashes($_POST['opisanie'])));
mysql_query("INSERT INTO `cscms_plugins` (title, opisanie, fail, cat, author, odobren) VALUES ('$title', '$opisanie', '$fail', '$cat', '$username', '$odobren')")or die(mysql_error()."<br />Грешка: ".__LINE__);
}
else {
	$exit_message .= "<br>	  <font color=\"red\"><b>".$_FILES["fail_$i"]['name']."</b> не беше качен. Не е позволено upload-ването в дадената папка или не съществува папката за $folder!</font>
<br /><br />";
}}} 
else {
	$exit_message .= "<br>	  <font color=\"red\"><b>".$_FILES["fail_$i"]['name']."</b> не беше качен. Размера е по-голям от допустимият($max_razmer KB)!</font>
<br /><br />";
}}
else {
	$exit_message .= "<br>	  <font color=\"red\"><b>".$_FILES["fail_$i"]['name']."</b> не беше качен. Не разрешен тип файлове!</font>
<br /><br />";
}}}
echo $exit_message;
} 
else { 
	echo "	  За съжеление се появи грешка!<br>Моля започнете от начало качването!
<br />
error: $fail"; 
}
} 
else {
	if (isset($_POST['submit'])) {
	if ($_POST['broi'] > 0 && $_POST['broi'] <= $max_razre6eni_failove && is_numeric($_POST['broi'])) {
	$_SESSION['broi'] = $_POST['broi'];
?>
<br />
<form action="" enctype="multipart/form-data" method="post">
<?php
for ($i=1;$i<=$_POST['broi'];$i++) { ?>
<div align="left">
	    Име:<br />     <input type="text" name="title" size="15" value=""><br />
	    Файл:<br />     <input type="file" name="fail_<?=$i?>"> <br />
	    Oписание:<br />     <textarea name="opisanie" cols='45' rows='7' maxlength="250"></textarea>
<?php } ?><br />
	    <input type="submit" name="upload" value="Качи">
</div>
</form> 
<?php
}
else { 
	echo "	  Грешка!<br>
		  Трябва да изберете най-малко 1 файл и не повече от $max_razre6eni_failove файла за качване на веднъж!"; }
}
else {
?><br />
<form action="" method="post">
Колко plugins ще качваш на веднъж? <input type="text" name="broi" size="3" value=""> <input type="submit" name="submit" value="Продължи">
</form> 
<?php
}}
}
?></div>
	<div class="gtitle-down"> </div>
 
session_start(); Трябва да седи на първият ред след <?php а не някъде посредата, задължително след <?php, но задължително на Първият ред, или ам на втория в случая нещо такова

<?php
session_start();
?>

НА ПЪРВИЯТ РЕД !! Без @
 
Мисля, защото съм си прочел доста добре тъпите книжки, но където и да го сложа все същата работа!

Пробвах отново пак си е същата, работа. както казах може би защото се дублира сесията със форума, но защо по дяволите тогава на локал-а всичко е наред? И защо работеше, работеше и изведнъж издаде багажа?

Сменявах chmod-a сто пъти на какъв ли ти не, да не би да е от него, но резултата беше нулев! :lol:
 
Чове ако този файл го инклудваш и реално като се инклудне session_start(); пак остава под половината ти код, session_start(); трябва да седи на първият ред както казах, ако инклудваш файла това значи, че session_start(); трябва да седи на първият ред в файла в който го инклудваш..
 
Какво ли ти не пробвах и не става. Добре, да зарежем сесията, защо тогава няма проблем под локал хоста?
 
Проблема може да си го има, просто да не го извежда ?!? Замислял ли си се над това.. :idea:
 
Код:
<?php
@session_start();
include ("forum/config.php");
// CONFIG START //
if ($user->data['user_id'] == ANONYMOUS) {
	echo "<div class=\"gtitle\"><center>РЕКЛАМА</center></div>
	<div class=\"ginfo\"><br />  Трябва да си влезеш в профила, за да качваш <b>plugins</b>.><br /></div>
	<div class=\"gtitle-down\"> </div>";
}
else {
$max_razmer = 2024; //(2 mb) максималният размер на файл (в KB)
$max_razre6eni_failove = 5; // колко файла на веднъж да може да се качват!
$ext = array('zip','rar'); // кои разширения да са разрешени
$folder = "./files/plugins/"; // папката в, която ще се качват файловете
$fail_replace = 0; // да позволява ли заместването на новите файлове с еднакво име със старите (1 за ДА, 0 за НЕ)

// CONFIG END //
echo "<div class=\"gtitle\"><center>Добавяне на plugin</center></div>
	<div class=\"ginfo\"><br />";
if (isset($_POST['upload'])) {
if (isset($_SESSION['broi']) && $_SESSION['broi'] > 0 && $_SESSION['broi'] <= $max_razre6eni_failove) {
for ($i=1;$i<=$_SESSION['broi'];$i++) {
if ($_FILES["fail_$i"]['name'] != NULL) {
$extnafaila = end(explode('.',$_FILES["fail_$i"]['name']));
$extnafaila = strtolower($extnafaila);
if(in_array($extnafaila,$ext)){
$razmer_max_fail = $max_razmer * 1024;
if ($_FILES["fail_$i"]['size'] <= $razmer_max_fail) {
$putq = $folder.basename($_FILES["fail_$i"]['name']);
if ($fail_replace == 0 && @file_exists($putq)) {
$exit_message .= "<br><font color=\"red\"><b>".$_FILES["fail_$i"]['name']."</b> не беше качен. Вече съществува такъв файл!</font>";
} else {
if (@copy($_FILES["fail_$i"]['tmp_name'], $putq)) {
$exit_message .= "<br><font color=\"green\"><b>".$_FILES["fail_$i"]['name']."</b> файлът беше качен успешно!</font>";
$file = $_FILES["fail_$i"]['name'];
$fail = "$folder/$file";
$odobren = "ne";
$cat = "plugins";
$title = trim(strip_tags(addslashes($_POST['title'])));
$opisanie = trim(strip_tags(addslashes($_POST['opisanie'])));
mysql_query("INSERT INTO `cscms_plugins` (title, opisanie, fail, cat, author, odobren) VALUES ('$title', '$opisanie', '$fail', '$cat', '$username', '$odobren')")or die(mysql_error()."<br />Грешка: ".__LINE__);
}
else {
$exit_message .= "<br><font color=\"red\"><b>".$_FILES["fail_$i"]['name']."</b> не беше качен. Не е позволено Upload-ването в дадената папка или не съществува папката за Upload!</font>";
}
}
} else {
$exit_message .= "<br><font color=\"red\"><b>".$_FILES["fail_$i"]['name']."</b> не беше качен. Размера е по-голям от допустимият($max_razmer KB)!</font>";
}
}
else {
$exit_message .= "<br><font color=\"red\"><b>".$_FILES["fail_$i"]['name']."</b> не беше качен. Не разрешен тип файлове!</font>";
}
}
}
echo $exit_message;
} else { echo "За съжеление се появи грешка!<br>Моля започнете от начало качването!"; }
} else {
if (isset($_POST['submit'])) {
if ($_POST['broi'] > 0 && $_POST['broi'] <= $max_razre6eni_failove && is_numeric($_POST['broi'])) {
$_SESSION['broi'] = $_POST['broi'];
?>
<form action="" enctype="multipart/form-data" method="post">
<?php
for ($i=1;$i<=$_POST['broi'];$i++) { ?>
<div align="left">
	    Име:<br />     <input type="text" name="title" size="15" value=""><br />
	    Файл:<br />     <input type="file" name="fail_<?=$i?>"> <br />
	    Oписание:<br />     <textarea name="opisanie" cols='45' rows='7' maxlength="250"></textarea>
<?php } ?><br />
	    <input type="submit" name="upload" value="Качи">
</div>
</form> 
<?php
} else { echo "Грешка!<br>Трябва да изберете най-малко 1 файл и не повече от $max_razre6eni_failove файла за качване на веднъж!"; }
} else {
?>
<form action="" method="post">
Колко файла на веднъж: <input type="text" name="broi" size="3" value="">
<input type="submit" name="submit" value="Продължи">
</form>
<?php
}
}
}
?></div>
	<div class="gtitle-down"> </div>
 
nom3r1 каза:
Код:
<?php
@session_start();
include ("forum/config.php");
// CONFIG START //
if ($user->data['user_id'] == ANONYMOUS) {
	echo "<div class="gtitle"><center>РЕКЛАМА</center></div>
	<div class="ginfo"><br />  Трябва да си влезеш в профила, за да качваш <b>plugins</b>.><br /></div>
	<div class="gtitle-down"> </div>";
}
else {
$max_razmer = 2024; //(2 mb) максималният размер на файл (в KB)
$max_razre6eni_failove = 5; // колко файла на веднъж да може да се качват!
$ext = array('zip','rar'); // кои разширения да са разрешени
$folder = "./files/plugins/"; // папката в, която ще се качват файловете
$fail_replace = 0; // да позволява ли заместването на новите файлове с еднакво име със старите (1 за ДА, 0 за НЕ)

// CONFIG END //
echo "<div class="gtitle"><center>Добавяне на plugin</center></div>
	<div class="ginfo"><br />";
if (isset($_POST['upload'])) {
if (isset($_SESSION['broi']) && $_SESSION['broi'] > 0 && $_SESSION['broi'] <= $max_razre6eni_failove) {
for ($i=1;$i<=$_SESSION['broi'];$i++) {
if ($_FILES["fail_$i"]['name'] != NULL) {
$extnafaila = end(explode('.',$_FILES["fail_$i"]['name']));
$extnafaila = strtolower($extnafaila);
if(in_array($extnafaila,$ext)){
$razmer_max_fail = $max_razmer * 1024;
if ($_FILES["fail_$i"]['size'] <= $razmer_max_fail) {
$putq = $folder.basename($_FILES["fail_$i"]['name']);
if ($fail_replace == 0 && @file_exists($putq)) {
$exit_message .= "<br><font color="red"><b>".$_FILES["fail_$i"]['name']."</b> не беше качен. Вече съществува такъв файл!</font>";
} else {
if (@copy($_FILES["fail_$i"]['tmp_name'], $putq)) {
$exit_message .= "<br><font color="green"><b>".$_FILES["fail_$i"]['name']."</b> файлът беше качен успешно!</font>";
$file = $_FILES["fail_$i"]['name'];
$fail = "$folder/$file";
$odobren = "ne";
$cat = "plugins";
$title = trim(strip_tags(addslashes($_POST['title'])));
$opisanie = trim(strip_tags(addslashes($_POST['opisanie'])));
mysql_query("INSERT INTO `cscms_plugins` (title, opisanie, fail, cat, author, odobren) VALUES ('$title', '$opisanie', '$fail', '$cat', '$username', '$odobren')")or die(mysql_error()."<br />Грешка: ".__LINE__);
}
else {
$exit_message .= "<br><font color="red"><b>".$_FILES["fail_$i"]['name']."</b> не беше качен. Не е позволено Upload-ването в дадената папка или не съществува папката за Upload!</font>";
}
}
} else {
$exit_message .= "<br><font color="red"><b>".$_FILES["fail_$i"]['name']."</b> не беше качен. Размера е по-голям от допустимият($max_razmer KB)!</font>";
}
}
else {
$exit_message .= "<br><font color="red"><b>".$_FILES["fail_$i"]['name']."</b> не беше качен. Не разрешен тип файлове!</font>";
}
}
}
echo $exit_message;
} else { echo "За съжеление се появи грешка!<br>Моля започнете от начало качването!"; }
} else {
if (isset($_POST['submit'])) {
if ($_POST['broi'] > 0 && $_POST['broi'] <= $max_razre6eni_failove && is_numeric($_POST['broi'])) {
$_SESSION['broi'] = $_POST['broi'];
?>
<form action="" enctype="multipart/form-data" method="post">
<?php
for ($i=1;$i<=$_POST['broi'];$i++) { ?>
<div align="left">
	    Име:<br />     <input type="text" name="title" size="15" value=""><br />
	    Файл:<br />     <input type="file" name="fail_<?=$i?>"> <br />
	    Oписание:<br />     <textarea name="opisanie" cols='45' rows='7' maxlength="250"></textarea>
<?php } ?><br />
	    <input type="submit" name="upload" value="Качи">
</div>
</form> 
<?php
} else { echo "Грешка!<br>Трябва да изберете най-малко 1 файл и не повече от $max_razre6eni_failove файла за качване на веднъж!"; }
} else {
?>
<form action="" method="post">
Колко файла на веднъж: <input type="text" name="broi" size="3" value="">
<input type="submit" name="submit" value="Продължи">
</form>
<?php
}
}
}
?></div>
	<div class="gtitle-down"> </div>


Уникален си човек мерси
 
Това не е решението, трябва да е без @ така проблема пак си го има, но просто не ти извежда грешката, има си причина за да ти извежда тази грешка, когато ползваш @ в такива случаи значи си умацал нещо..
 
kulov каза:
Това не е решението, трябва да е без @ така проблема пак си го има, но просто не ти извежда грешката, има си причина за да ти извежда тази грешка, когато ползваш @ в такива случаи значи си умацал нещо..

Добре, напиши правилния скрипт, за да функционира и без сесията на форума, а с тази или обратното.
 
nom3r1 каза:
kulov каза:
Това не е решението, трябва да е без @ така проблема пак си го има, но просто не ти извежда грешката, има си причина за да ти извежда тази грешка, когато ползваш @ в такива случаи значи си умацал нещо..

Добре, напиши правилния скрипт, за да функционира и без сесията на форума, а с тази или обратното.

Щом сайта ползв сесията на форума какъв е смисала да има две сесии ?? От къде идва втората ? Не е ли една и съща сесия ? Начини има,това че вие прибягвате до такива решения изобщо незначи, че това е единственият начин да се направи, НЕ съвсем не. В момента точно не смятам да си блъскам главата да пиша, щом на момчето му отърва този начин добре, няма проблем, но това не е начина :!:
 
Едната сесия е за форума(тези, които са регистрирани), другата сесия е на файловете, понеже явно е ползвана за броя файловете. Сега предполагам схвана на къде бия, айде със здраве! :?:
 
Не разбрахте, че подтискането на грешките с @ е лоша практика. Много зависи от хостинга, енкодинга на самия файл и така... Най-добре файла да се прави винаги UTF-8 without BOM, с чарсет UTF-8. Ако във "forum/config.php" има зададена сесия, то не е нужно преди извикването на този файл да се стартира друга сесия, защото се сблъскват и естествено вади грешка.
Също обясни малко логиката на файловете. Защото грешката ти идва от файла header.php. Как го викаш, къде го викаш ?
Малко подробности за по-добри решения :wink:


Едната сесия е за форума(тези, които са регистрирани), другата сесия е на файловете, понеже явно е ползвана за броя файловете. Сега предполагам схвана на къде бия, айде със здраве! Question

Боже, смях и половина. Няма сесия на форума и сесия на сайта. Сесията е една, все се запазва като едно под различни имена. $_SESSION['asd'], $_SESSION['asd1'] ... за тези две сесии трябва да стартирам 2 сесии ли ?
Я се стегнете. Пуска се една сесия, тя вече си знае какво да прави. Или остава сесията на форума или само на сайта.
 
nom3r1 каза:
Едната сесия е за форума(тези, които са регистрирани), другата сесия е на файловете, понеже явно е ползвана за броя файловете. Сега предполагам схвана на къде бия, айде със здраве! :?:

Още по-зле.. какъв е смисала от session_start(); два-пъти ?

Това може да се избегне по различни начини, трябва да се пробва докато се премахне грешката, без @ -> Много лоша практика..

Един да речем файл, кръсен да речем session.php който садържа

<?php
session_start();
ob_start();
?>

Този файл ще се инклудва където ще ти трябва, или просто един header файл, в който един път ще се инклудне този файл и край.. Трябва да се тества, но определено може без @
 
Лошо е да се ползва @ и не го казвам за първи път. Щом му върши работа и работи нека го ползва, ако ли не някой друг да му го оправи. ;)
 
nom3r1 каза:
Лошо е да се ползва @ и не го казвам за първи път. Щом му върши работа и работи нека го ползва, ако ли не някой друг да му го оправи. ;)

Не, започнахме този разговор най-малкото защото се изказва едва ли не всякаш @ е единственото му решение, той не възразява, защото виждам, че не разбира за какво иде реч...
 
Въпроса не е в това сега дали му работи, а в самата оптимизация на кода. Тука всичките не искат да научат по-добрите методи на писане. За това си и получих предния бан.

Никога не трябва да се ползва @. Щом ползваш @ значи кода ти не е наред. Нужни са пълни дефиниции на променливи като например $_GET, ако не го дефинираш ще почне да вади грешка от тип E_NOTICE или E_WARNING.

Ако навсякъде има един и същи викан файл то е най-добре там да се вика сесията. Надолу кода после ще си му работи(стига да е написан като хората).

Не може примерно викаш сесия и след това извикваш файл, в който пак се стартира сесия.


+ това, сега ще му работи. По нататъка пак ще изпищи, че има проблем.
 

Back
Горе