Функцията copy - много прост въпрос

mizarck

Registered
Здравейте,
изкам да копирам файл чрез php скрипт но винаги ми показва грешка
ето кода който използвам

Код:
<?php
....
$filecopy = "moqt_fail.php";
$neme = "direktoriqta_v_koqto_se_kopita_faila";
copy($filecopy, $neme/$filecopy);
....
?>

от този код ми изкарва тази грешка
Warning: Division by zero in C:\AppServ\www\installe107\3.php on line 15

Warning: copy(e107/user.php ) [function.copy]: failed to open stream: Invalid argument in C:\AppServ\www\installe107\3.php on line 15

ред 15 е
Код:
copy($filecopy, $neme/$filecopy);

Благодаря предварително на този който може да помогне
 

mizarck

Registered
bafitu каза:
<?php
....
$filecopy = "moqt_fail.php";
$neme = "direktoriqta_v_koqto_se_kopita_faila/";
copy($filecopy, $neme.$filecopy);
....
?>

таками показва тази грешка
Warning: copy(e107/user.php ) [function.copy]: failed to open stream: Invalid argument in C:\AppServ\www\installe107\3.php on line 15

явно проблемът идва от това че променливата name се предава от страница на страница

ето целият код
Код:
<?php
include ('installe107/allstep.php');
$step = 3;
$nextstep  = $step + 1;

$name=$HTTP_POST_VARS['name'];
$user=$HTTP_POST_VARS['user'];
$pass=$HTTP_POST_VARS['pass'];
$mail=$HTTP_POST_VARS['mail'];

$file= file("installe107/links.txt"); 
$file[$step];
$filecopy = $file[$step];
copy($filecopy, $neme/$filecopy);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<meta http-equiv="Refresh" content="10000000;URL=?step=<?php echo "$nextstep"; ?>" />
</head>
<body>
<style type="text/css">

</style>


<div align="center"><span class="style3">Моля Изчакайте<br>
  <?php echo "$step"; ?> от <?php echo "$allstep"; ?>
</span>
  <div align="center"><img src="bg.jpg" width="<?php echo "$step"; ?>" height="100" border="1" start="fileopen"></div>
</div>
  </body>
</html>
 

sizif

Registered
Здравей!

Малко трудно се ориентирам в кода ти, но оставам с усещането, че заради начина, по който структурираш записа, вместо файл копираш масив или по-точно елемент от масив, а не име на файл, извлечено от масив. Какво точно съдържа елемента, който вземаш? Защото съобщението, което ти дава - грешка в последния знак, т.е. затварящата скоба на скрипта обикновено означава логическа грешка.
Нещо, което ми хрумва на прима виста: опитвал ли си да дадеш пълния път до файла, който копираш и пълния път до копието?

Иначе синтаксиса на функцията е правилен:
copy ( $iztochnik, $nov_fajl );
Тук обаче ще си позволя едно уточнение, което може би ти е известно, но все пак: функцията не копира файла като обект, а копира съдържанието му (за копиране на файл като обект имаше друга функция и тя използваше клас от PEAR). Ако указаният във втората стойност файл е наличен, съдържанието ще се копира в него. Ако не съществува, парсерът ще го създаде със зададеното име (което може и да е различно от това на оригинала и ще запише в него съдържанието.

Последното, за което се сещам за функцията са правата. Когато създаваш директорията, какви права и указваш - 0777 или друго? И съществува ли такава директория преди да се опиташ да копираш файла в нея?

Едва ли съм ти много полезен, но ако дадеш съдържанието на файла, който включваш installe107/allstep.php и на този, от който вземаш въпросния 3-ти ред: installe107/links.txt, може би ще мога да помогна.
 

mizarck

Registered
Целта на всичките скриптове е да копират файловете на e107 в създадена директория и да създадат база данни и config файл за да проработи
променливите който предавам са само текст и нищо друго

права не задавам поради простата причина че сървърът е с WinXP

ето и въпросните файлове
1.php
Код:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<title>Step 1</title>
</head>
<body>
<div align="center">
  <form id="form1" name="form1" method="post" action="?step=2">
    <table width="100%" border="1">
      <tr>
        <td width="50%"><div align="right">Домейн</div></td>
        <td width="50%"><div align="left">
          <label>
          <input name="name" type="text" id="name" maxlength="10" />
          <strong>.          </strong></label>
        worldbg.org</div></td>
      </tr>
      <tr>
        <td><div align="right">Потребител</div></td>
        <td><div align="left">
          <label>
          <input name="user" type="text" id="user" value="" maxlength="20" />
          </label>
        </div></td>
      </tr>
      <tr>
        <td><div align="right">Парола</div></td>
        <td><div align="left">
          <input name="pass" type="password" id="pass" maxlength="20" />
        </div></td>
      </tr>
      <tr>
        <td><div align="right">Електронна поща </div></td>
        <td><div align="left">
          <input name="mail" type="text" id="mail" maxlength="50" />
        </div></td>
      </tr>
      <tr>
        <td colspan="2"><div align="center">
          <label>
          <input type="submit" name="Submit" value="Напред >>" />
          </label>
        </div>
        <div align="left"></div></td>
      </tr>
    </table>
  </form>
  </div>
  </body>
</html>

2.php
Код:
<?php
$name=$HTTP_POST_VARS['name'];
$user=$HTTP_POST_VARS['user'];
$pass=$HTTP_POST_VARS['pass'];
$mail=$HTTP_POST_VARS['mail'];

if (empty($name))
{
die ('<meta http-equiv="refresh" content="3;URL=?step=1"><div align="center"><font color="#FF0000" size="6"><b>Не сте въвели домейн<br>Моля въведете домейн</b></font></div>');
}
if (empty($user))
{
die ('<meta http-equiv="refresh" content="3;URL=?step=1"><div align="center"><font color="#FF0000" size="6"><b>Не сте въвели Потребителско име<br>Моля въведете Потребителско име</b></font></div>');
}
if (empty($pass))
{
die ('<meta http-equiv="refresh" content="3;URL=?step=1"><div align="center"><font color="#FF0000" size="6"><b>Не сте въвели парола<br>Моля въведете парола</b></font></div>');
}
if (empty($mail))
{
die ('<meta http-equiv="refresh" content="3;URL=?step=1"><div align="center"><font color="#FF0000" size="6"><b>Не сте въвели майл адреса си<br>Моля въведете майл адрес</b></font></div>');
}

mkdir("$name", 0700);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<meta http-equiv="Refresh" content="1;URL=?step=3" />

</head>
<body>
  </body>
</html>

3.php
Код:
<?php
include ('installe107/allstep.php');
$step = 3;
$nextstep  = $step + 1;

$name=$HTTP_POST_VARS['name'];
$user=$HTTP_POST_VARS['user'];
$pass=$HTTP_POST_VARS['pass'];
$mail=$HTTP_POST_VARS['mail'];

$file= file("installe107/links.txt"); 
$file[$step];
$filecopy = $file[$step];
copy($filecopy, $neme.$filecopy);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<meta http-equiv="Refresh" content="10000000;URL=?step=<?php echo "$nextstep"; ?>" />
</head>
<body>
<style type="text/css">

</style>


<div align="center"><span class="style3">Моля Изчакайте<br>
  <?php echo "$step"; ?> от <?php echo "$allstep"; ?>
</span>
  <div align="center"><img src="bg.jpg" width="<?php echo "$step"; ?>" height="100" border="1" start="fileopen"></div>
</div>
  </body>
</html>

останалите 300 файла трябва да имат същото съдържание като 3.php но то неработи и затова не съм го копирал

allstep.php
Код:
<?php
$allstep = "323";
?>
този файл ми е само за да не си губа времето в всеки файл да пиша променливата а директно да инклудвам (по нататък ще има и други числа за това инклудвам)

links.txt
Код:
e107/top.php
e107/user.php
e107/userposts.php

ако има значение файловете 1.php 2.php 3.php 4.php 5.php .... 319.php 320.php 321.php 322.php и 323.php се инкледват от install-e107.php който се намира в root директорията на сървъра

ето и неговият код
Код:
<?php
$step = $_GET['step'];
switch ($step)
{
case "1":
include('installe107/1.php');
break;
case "2":
include('installe107/2.php');
break;
case "3":
include('installe107/3.php');
break;
case "4":
include('installe107/4.php');
break;
case "5":
include('installe107/5.php');
break;
case "6":
include('installe107/6.php');
break;
case "7":
include('installe107/7.php');
break;
case "8":
include('installe107/8.php');
break;
case "9":
include('installe107/9.php');
break;
case "10":
include('installe107/10.php');
break;
.....
case "318":
include('installe107/318.php');
break;
case "319":
include('installe107/319.php');
break;
case "320":
include('installe107/320.php');
break;
case "321":
include('installe107/321.php');
break;
case "322":
include('installe107/322.php');
break;
case "323":
include('installe107/323.php');
break;
}
?>

а ето и замисалът на цялата работа
понеже някой браузари прекъсват зареждането ако то се бави повече от 1-2 мин и казват че страницата несъществува за това разделих e107 на 319 осномни части от трети файл до 322 файл се копира по една малка директория или файл и се слага в предварително създадената папка от 2.php с името което е въведено и така докато нестигне до края
ролята на allstep.php е да показва на клиента колко още остава до края на инсталацията

ето това се опитвам да направя но нестава
ако можеш да ми помогнеш да го оправя ще съм ти много благодарен

10х предварително
 

sizif

Registered
Здравей!

Сега ще вечерям, после ще се пробвам. Мисля, че имам идея, какво се случва. Мисля, че кода може и да се опрости (не много).
 

mizarck

Registered
sizif каза:
Здравей!

Сега ще вечерям, после ще се пробвам. Мисля, че имам идея, какво се случва. Мисля, че кода може и да се опрости (не много).

кода не е опростен поради причината че го преработвах няколко пъти и може да съм допуснал грешка
 

sizif

Registered
Здравей!

Не разбирам от сървърни програми, но както предполагах, правата, които си указал при създаване на директорията ти са непълни:

mkdir("$name", 0700); \\ 2.php

Промени този ред на:

mkdir("$name", 0777);

Така ще укажеш и права за писане и кодът би трябвало да тръгне. Опитай и кажи как се държи скрипта.

Конструкцията switch ($step); от installe107.php не ми се струва много удачна в този случай, защото нямаш различни действия (напр на едно място създаване, на друго изтриване, на трето включване), а само включване, но след като си написал всички редове може и да го запазиш.

Все пак по-олекотена ми се струва замяната на цикъла с този ред:

<?
include ("installe107/$step.php");
?>


Така много по-лесно можеш да правиш и проверка дали файла се е копирал преди да бъде включен:

<?
if (file_exists ("installe107/$step.php")) {
include("installe107/$step.php");
}
else {
някакво действие съобразно кода, може да е команда за копиране, може да е свързано с връщане на предишна стъпка
}
?>


Не успях да схвана смисъла на allstep.php. Ако извършваше някакви операции с него, ако беше брояч или друго... може би.

Чрез так нар. URL-кодиране (струва ми се, че май нямаш опит в това - ако греша извинявай) можеш да предаваш и повече от една променливи:

<A HREF="home/www/dir1/dir2/file.php?a=12&b=niz%niz5niz" >dryndryn</A>

Променливите, които прехвърляш са зад въпросителния знак, следващ името на файла, а отделянето на една променлива и нейната стойност от друга става със знак ъмперсанд (&). Ако в стойността на променливите има интервал, той трябва да бъде запълнен със знака за процент (%) или с плюс (+).
Ако променливите се вземат от форма или пък някакъв скрипт добавя стойността, сървърната програма сама ще ги кодира.

Това е засега. Помня, че докато разглеждах кода ми беше хрумнало и още нещо, но сега не мога да се сетя. На мен цялата конструкция с всички триста и няколко файла (писани на ръка!!!) ми се струва твърде троамва и изнурителна за създаване.
Ако съдържанието им е сходно с това на 3.php и разликата между всички е само в стойности или имена на файлове, или каквото и да е, което може да бъде разхвърляно в променливи, по-удачно е да се създаде един файл, в който стойностите да се актуализират след извършването на действията, предвидени във всяка стъпка. Така ще намалиш и трафика към сървъра си, ще спестиш време от писане на код, а и приложението, което правиш, ще бъде по-бързо.

Това е засега. Промени правата и кажи как се държи скрипта. Ако искаш, обясни какво правят останалите файлове, ще ти помогна да ги опростиш и да сместиш всичко в по-малко код.
Дано съм ти бил полезен. Успех!

ПП: и нещо със синтаксиса, което ми прави впечатление: единичните кавички, които използваш в скриптовете поне според мен са малко рискови, защото този ред напр би могъл и да не се държи по очаквания начин:

<?
opendir('/home/www/probna.awardspace.com/$p/$pic');
?>


Още веднъж: успех!
 

mizarck

Registered
sizif
Ще променя правата но това няма да е от значине защото съм на Windows и правата с който създавам папката и да са 000 се тая но проблемът не е в създаването на папката а в това че като използвам една променлива за папка а другата за сайла ги разделям с наклонена черта и от там издава целият проблем и нз как да ги резделя като хората

пп найстина не съм много в нещата с предаването на инфо чрез GET и използването на URL за преносване на инфо и това ме обърква още повече

edit:
правата са променени на 777 и нищо
 

sizif

Registered
Добре, значи продължаваме да го мъчим... :(

Промени този ред:
copy($filecopy, $neme/$filecopy);

На:
copy($filecopy, "$neme/$filecopy");

и нека кавичките да са двойни.

Ако не става, опитай с абсолютния път до файловете.

Ако пак не става, пробвай с още една променлива:

$file= file("installe107/links.txt");
$file[$step];
$filecopy = $file[$step];
$filedve="$neme/$filecopy";
copy($filecopy, $filedve);

За мен проблемът е логически - иначе няма да ти дава тази грешка в последния знак... :(

Ето ти и проблема. Направо не е за вярване!!! Правописна грешка :)

$name=$HTTP_POST_VARS['name'];
$user=$HTTP_POST_VARS['user'];
$pass=$HTTP_POST_VARS['pass'];
$mail=$HTTP_POST_VARS['mail'];

$file= file("installe107/links.txt");
$file[$step];
$filecopy = $file[$step];
copy($filecopy, $neme.$filecopy);


Сгрешено име на променлива... $nАme - извлечена от формата и $nЕme, поставена при копиране за име на директорията.

Дано това да е бил проблема. Цяла нощ висях над този код, а го забелязах едва сега.
 

mizarck

Registered
да вярно в променливата съм сбъркал буквата но уви и правилно написана пак дава същата грешка

$file= file("installe107/links.txt");
$file[$step];
$filecopy = $file[$step];
$filedve="$neme/$filecopy";
copy($filecopy, $filedve);
по този намин ми показва

Warning: copy(e107/user.php ) [function.copy]: failed to open stream: No such file or directory in C:\xampplite\htdocs\installe107\3.php on line 15

а с двоините кавички
Warning: copy(e107/user.php ) [function.copy]: failed to open stream: No such file or directory in C:\xampplite\htdocs\installe107\3.php on line 14

прочетох всичко из нета за променливите и функцията copy и така и не стигнах до правилен резултат

то се е видяло че няма да намеря правилният начин за това можете ли да ми кажете как да използвам следният код
Код:
<?php

$rar_file = rar_open('example.rar') or die("Can't open Rar archive");

$entries = rar_list($rar_file);

foreach ($entries as $entry) {
   echo 'Filename: ' . $entry->getName() . "\n";
   echo 'Packed size: ' . $entry->getPackedSize() . "\n";
   echo 'Unpacked size: ' . $entry->getUnpackedSize() . "\n";

   $entry->extract('/dir/extract/to/');
}

rar_close($rar_file);

?>

горният код е за разархивиране на рарове в дадена директория това ми върши работа но като стартирам кода ми показва че функцията rar_open не съществува и нищо не прави
инсталирах си последните версий на xampp wampp apache2triad и appserv все така ми показва че няма такава функция
сглобих си собствен апеич с последната версия на апеич и php но пак ми показва така
какво да правя

Благодаря на всички
 

mizarck

Registered
Здравейте отново,
Намерих си грешката
след като махна
copy($filecopy, $name.'/'.$filecopy); и на негово място сложа echo "$name"; разбрах че бообще не предавам променливите до страница 3
но неможах да си намеря грешката
можете ли да ми кажете как правлно да предам променливите от страница 1 до страница 3

Благодаря предварително
 

Admin

Registered
mizarck каза:
Здравейте отново,
Намерих си грешката
след като махна
copy($filecopy, $name.'/'.$filecopy); и на негово място сложа echo "$name"; разбрах че бообще не предавам променливите до страница 3
но неможах да си намеря грешката
можете ли да ми кажете как правлно да предам променливите от страница 1 до страница 3

Благодаря предварително

Не следя темата но не може ли всичко да е в една страница.
Или предавай променливата чрез сесия.
 

mizarck

Registered
admin каза:
mizarck каза:
Здравейте отново,
Намерих си грешката
след като махна
copy($filecopy, $name.'/'.$filecopy); и на негово място сложа echo "$name"; разбрах че бообще не предавам променливите до страница 3
но неможах да си намеря грешката
можете ли да ми кажете как правлно да предам променливите от страница 1 до страница 3

Благодаря предварително

Не следя темата но не може ли всичко да е в една страница.
Или предавай променливата чрез сесия.

Може ли примерче :)
 

Admin

Registered
НАправи го на една страница просто.
Остави тези разделяния на части.
Всичко се извършва за част от секундата.

Ако искаш да ползваш сесия трябва в първия файл да и дадеш стойност.

$promenliva=3;
$HTTP_SESSION_VARS['promenliva']= $promenliva;


после в другия файл взимаш стойноста и така:
$promenliva=$HTTP_SESSION_VARS['promenliva'];


и така във всеки следващ файл.
 

Горе