Avatar billede syngredk Nybegynder
02. april 2006 - 17:43 Der er 25 kommentarer og
1 løsning

PHP opret ny mappe på server (mkdir)

Via en formular skal der kunne oprettes en ny mappe, med et vilkårligt nummer der ligeledes gemmes i databasefeltet "folder", sammen med de øvrige indtastninger.

Mappen skal oprettes på en distanitation som: gallery/DEN NYE MAPPE (altså i mappen gallery).

Der er point til den, som kan hjælpe med kildekoden, mht. hvordan det skal laves og få det til at virke.

Scriptet ser således ud, indtil videre:

photo.add.php -->

<?php

require('../access/access_config.php');

    // Creating option tags with year data
    $Res = mysql_query("SELECT id, year FROM photo_year ORDER BY year");
    $CategoryOptions = "";
    while (list($CategoryId,$CategoryTitle) = mysql_fetch_row($Res))
    {
        $CategoryOptions .= "<option value=\"$CategoryId\">".stripslashes($CategoryTitle)."</option>\n";
    }
?>


<html>

<head>
    <title></title>
</head>

<body>

<?php include ('../includes/menu.php'); ?>

<form action="photo.config.php" method="post" enctype="multipart/form-data">
<input type="hidden" name="referer" value="photo.add">

  <table border="0" width="100%" height="204">
    <tr>
      <td width="11%" height="25">Overskrift</td>
      <td width="1%" height="25">:</td>
      <td width="88%" height="25"><input type="text" name="title" size="42"></td>
    </tr>
    <tr>
      <td width="11%" height="81">Beskrivelse</td>
      <td width="1%" height="81">:</td>
      <td width="88%" height="81"><textarea rows="3" name="description" cols="35"></textarea></td>
    </tr>
    <tr>
      <td width="11%" height="21">&nbsp;</td>
      <td width="1%" height="21"></td>
      <td width="88%" height="21"></td>
    </tr>
    <tr>
      <td width="11%" height="25">Årstal</td>
      <td width="1%" height="25">:</td>
      <td width="88%" height="25"><select name="year"><?php echo $CategoryOptions; ?></select></td>
    </tr>
    <tr>
      <td width="11%" height="21">&nbsp;</td>
      <td width="1%" height="21"></td>
      <td width="88%" height="21"></td>
    </tr>
    <tr>
      <td width="11%" height="25">Fotograf/oprettet af</td>
      <td width="1%" height="25">:</td>
      <td width="88%" height="25"><input type="text" name="author" size="42"></td>
    </tr>
    <tr>
      <td width="11%" height="21">&nbsp;</td>
      <td width="1%" height="21"></td>
      <td width="88%" height="21"></td>
    </tr>
    <tr>
      <td width="11%" height="1"></td>
      <td width="1%" height="1"></td>
      <td width="88%" height="1"><input type="submit" value="Opret fotoalbum" name="B1">&nbsp;
        <input type="reset" value="Slet alt" name="B2">
        <input type="hidden" name="ip" value="<?php print $_SERVER['REMOTE_ADDR']; ?>"></td>
    </tr>
  </table>
</form>

</body>

</html>

photo.config.php -->

<?php
include('../access/access_config.php');

if ($_POST['referer'] == 'photo.add') {

mysql_query("INSERT INTO photo_album (ip, year, date, title, description, author, folder) VALUES ('".$_POST['ip']."','".$_POST['year']."',NOW(),'".$_POST['title']."','".$_POST['description']."','".$_POST['author']."','".$_POST['folder']."')") or die(mysql_error());
header("Location: photo.add.php");

}

?>
Avatar billede fixxxer Nybegynder
02. april 2006 - 18:45 #1
Jeg kan ikke lige se for mig, hvor vi skal få navnet til mappen fra? Jeg kan i hvertfald ikke se hvor du har en input med navnet "folder"..

Teorien er jo blot:


<?php
include('../access/access_config.php');

if ($_POST['referer'] == 'photo.add') {

$root = $_SERVER['DOCUMENT_ROOT'];
$mappe_navn = $_POST['folder'];
mkdir($root.'/gallery/'.$mappe_navn);

mysql_query("INSERT INTO photo_album (ip, year, date, title, description, author, folder) VALUES ('".$_POST['ip']."','".$_POST['year']."',NOW(),'".$_POST['title']."','".$_POST['description']."','".$_POST['author']."','".$_POST['folder']."')") or die(mysql_error());
header("Location: photo.add.php");

}

?>


For at det skal virke, bliver du nødt til at give world-write rettigheder på mappen. Hvis du ikke ved hvad det går ud på, så tager vi den derfra..

I øvrigt er mit eksempel ikke komplet, da det ville være yderst fornuftigt at tjekke indholdet af $_POST['folder'], for at det ikke indholder en suspekt indtastning.
Avatar billede syngredk Nybegynder
02. april 2006 - 18:53 #2
Mappens navn skal blot være vilkårligt, bare havde et nummer som kan relateres til et album i databasen. Mere derfor, jeg ikke har lavet noget input dertil i formularen.
Avatar billede fixxxer Nybegynder
02. april 2006 - 19:29 #3
Kunne du bruge ovenstående?
Avatar billede olebole Juniormester
02. april 2006 - 19:35 #4
<ole>

Ifølge Ekspertens regler bør du vist lukke dette spørgsmål:
    http://www.eksperten.dk/regler.phtml -> §2.1.11

- du spørger om det samme her:
    http://www.eksperten.dk/spm/698197

/mvh
</bole>
Avatar billede syngredk Nybegynder
02. april 2006 - 19:42 #5
olebole --> Jeg vil benytte samme regel til at oprette dette spørgsmål: "Er der ikke indløbet TILFREDSSTILLENDE svar på et spørgsmål efter 7 dage, er det dog tilladt at lukke det oprindelige spørgsmål, og oprette et nyt identisk"

Jeg lukker spørgsmålet og starter forfra, som der står i reglerne. Og tak for en masse unødvendig post i dette indlæg.
Avatar billede olebole Juniormester
02. april 2006 - 19:45 #6
Nu ved jeg ikke, hvem du takker ... jeg har i hvertfald ikke bidraget med 'en masse unødvendig post i dette indlæg'  :)

Kniber det mon ikke med at tælle til syv?  ;o)
Avatar billede syngredk Nybegynder
02. april 2006 - 19:48 #7
olebole --> Det andet indlæg er oprettet: 26/03 2006, Tidspunkt    12:50:53 (altså 7 dage siden, da jeg har gjort det EFTER kl. 12:50).
Avatar billede syngredk Nybegynder
02. april 2006 - 20:03 #8
fixxxer --> 02/04-2006 18:45:25 kræver vel, at jeg laver et felt mere i formularen?
Avatar billede fixxxer Nybegynder
02. april 2006 - 20:18 #9
Ja du skal bruge et input felt mere med navnet "folder", for at angive et navn på mappen du ønsker at oprette.
Avatar billede syngredk Nybegynder
07. april 2006 - 17:26 #10
fixxxer --> Beklager det sene svar, har fået afprøvet din idé lidt.

Det kommer fint nok ind i databasen osv, men den nye mappe der skal laves bliver ikke oprettet. Ved jeg har PHP4, og modul GDlib 2.0.1 er tilknyttet.
Avatar billede fixxxer Nybegynder
08. april 2006 - 16:52 #11
Får du en warning eller lignende?

For at du kan oprette mappen, skal du have world-skrive rettigheder i den mappe hvori du vil oprette en mappe.

I øvrigt så vis dit nuværende script med mappe oprettelse i.
Avatar billede syngredk Nybegynder
08. april 2006 - 17:03 #12
fixxxer --> Der kommer ingen warning eller lign. frem. Den går automatisk videre til header("Location: photo.add.php"); jvf. ovenstående script. Mener jeg har world-skrive rettigheder, men ikke sikker. Via ftp, og mappens egenskaber kan jeg se, at alle felter er hakket af som skriverettigheder til alle.

photo.add.php har jeg tilføjet et felt, der hedder input:
  <tr>
      <td width="11%" height="21">Mappens navn</td>
      <td width="1%" height="21">:</td>
      <td width="88%" height="21"><input type="text" name="folder" size="42"></td>
    </tr>

photo.config.php ser filen nu således ud:

<?php
include('../access/access_config.php');

if ($_POST['referer'] == 'photo.add') {

$root = $_SERVER['DOCUMENT_ROOT'];
$mappe_navn = $_POST['folder'];
mkdir($root.'../../photoalbum/'.$mappe_navn);

mysql_query("INSERT INTO photo_album (ip, year, date, title, description, author, folder) VALUES ('".$_POST['ip']."','".$_POST['year']."',NOW(),'".$_POST['title']."','".$_POST['description']."','".$_POST['author']."','".$_POST['folder']."')") or die(mysql_error());
header("Location: photo.add.php");

}

?>
Avatar billede fixxxer Nybegynder
08. april 2006 - 17:26 #13
Umiddelbart ser det ud som du ikke får fat i den rigtige mappe.

Prøv følgende:

$root = $_SERVER['DOCUMENT_ROOT'];
$mappe_navn = $_POST['folder'];
$mappen = $root.'../../photoalbum/'.$mappe_navn;
echo 'Rel path: '.$mappen;
echo 'Abs path: '.realpath($mappen);
mkdir($mappen);

Mit gæt er, at du mangler en slash på efter $root, da PHP returere DOCUMENT_ROOT uden trailing slash. Desuden virker det underligt at du skal to niveauer under DOCUMENT_ROOT, i stedet for et.
Avatar billede syngredk Nybegynder
08. april 2006 - 17:36 #14
De 2 niveauer skyldes domæne.dk/administration/photo/photo.add.php
- mappen skal oprettet helt i første niveauer, under mappen photoalbum

Har lige forsøgt med ovenstående; får fortsat ingen fejl - og der kommer ingen mappe på pgl. destination.
Avatar billede fixxxer Nybegynder
08. april 2006 - 17:43 #15
Nu var jeg mest interesseret i resultaterne af debug-informationerne "Rel path" og "Abs path" i ovenstående eksempel.

For så kan jeg se hvori problemmet ligger.
Avatar billede syngredk Nybegynder
08. april 2006 - 17:46 #16
De informationer kom da ikke frem..
Avatar billede fixxxer Nybegynder
08. april 2006 - 18:46 #17
Så må jeg hellere gentage mig selv:


Prøv at erstatte den del i dit nuværende script, der opretter mappen, med dette script:

$root = $_SERVER['DOCUMENT_ROOT'];
$mappe_navn = $_POST['folder'];
$mappen = $root.'../../photoalbum/'.$mappe_navn;
echo 'Rel path: '.$mappen;
echo 'Abs path: '.realpath($mappen);
mkdir($mappen);

Som du kan se echo'er jeg 2 steder teksten "Rel path: " + mappenavnet, og teksten "Abs. path: " + kanoniliseret mappenavn.

Dem vil jeg gerne se, for at kunne fortælle dig hvad der er galt.
Avatar billede fixxxer Nybegynder
08. april 2006 - 18:47 #18
-- og for at se dem må du nok fjerne din header('Location ..'), ellers er det klart at du ikke kan se dem..
Avatar billede syngredk Nybegynder
08. april 2006 - 19:04 #19
Rel path: /home/virtual/domæne.dk/public_html../../photoalbum/navnAbs path:
Warning: mkdir(/home/virtual/domæne.dk/public_html../../photoalbum/navn): No such file or directory in /home/virtual/domæne.dk/public_html/administration/photo/photo.config.php on line 11
Avatar billede fixxxer Nybegynder
09. april 2006 - 01:53 #20
Mon ikke fejlen ligger i at $root ikke slutter med en slash.

Vi kunne stole på at $_SERVER[DOCUMENT_ROOT] altid returnere uden afsluttende slash, men vi kunne også skrive en funktion der tilføjer denne hvis den mangler.
Den vil dog kun virke på Linux installationer.



function add_slash($string)
{
    if ($string[strlen($string)-1] != '/')
        return $string.'/';
    else return $string;
}   

$root = add_slash($_SERVER['DOCUMENT_ROOT']);
$mappe_navn = $_POST['folder'];
$mappen = $root.'../../photoalbum/'.$mappe_navn;
echo 'Rel path: '.$mappen;
echo 'Abs path: '.realpath($mappen);
mkdir($mappen);



Nu skulle "Rel path" gerne give

/home/virtual/domæne.dk/public_html/../../photoalbum/navn

Og absolute skulle gerne en kanoniseret path.

-- og så kan jeg se hvad der er galt.
Avatar billede fixxxer Nybegynder
09. april 2006 - 01:54 #21
Med absolute mener jeg "Abs path"
Avatar billede showsource Seniormester
09. april 2006 - 02:14 #22
"råt" eks. på nyt dir:

<?php
$base_path = $_SERVER["DOCUMENT_ROOT"] ."/";
$dir = "photoalbum";

$mkdir_path = $base_path . $dir;

    if(!is_dir($mkdir_path)) {
    mkdir($mkdir_path, 0777);
    chmod($mkdir_path, 0777);
    }else{
    chmod($mkdir_path, 0777);
    }
?>


Husk bare på, at der er forskel på om du har lavet $dir med et FTP program eller et php script, hvis dit host er UNIX baseret!!!
Avatar billede syngredk Nybegynder
09. april 2006 - 15:35 #23
Fixxxer, nu får jeg følgende fejl efter dit indlæg 01.53.53

Rel path: /home/virtual/domæne.dk/public_html/../../photoalbum/nuAbs path:
Warning: mkdir(): open_basedir restriction in effect. File(/home/virtual/domæne.dk/public_html/../../photoalbum/nu) is not within the allowed path(s): (/home/virtual/domæne.dk:/home/virtual/_tmp) in /home/virtual/domæne.dk/public_html/administration/photo/photo.config.php on line 18


Jeg forstår dog ikke denne linie:
File(/home/virtual/domæne.dk/public_html/../../photoalbum/nu) is not within the allowed

Efter mappen public_html skal den ikke ind i 2 mapper og derefter finde photoalbum. Den ligger i selve roden, altså public_html
Avatar billede syngredk Nybegynder
09. april 2006 - 15:38 #24
fixxxer --> YES !, godt man undre sig her i livet..

Har ændret denne ting "ml/../../photoalbum/nu" som jeg undre mig i ovenstående indlæg.

$root = add_slash($_SERVER['DOCUMENT_ROOT']);
$mappe_navn = $_POST['folder'];
$mappen = $root.'../../photoalbum/'.$mappe_navn;

ÆNDRET TIL - uden ../../:

$root = add_slash($_SERVER['DOCUMENT_ROOT']);
$mappe_navn = $_POST['folder'];
$mappen = $root.'photoalbum/'.$mappe_navn;

Så funger det, den opretter mappen osv.
Avatar billede fixxxer Nybegynder
09. april 2006 - 15:44 #25
Netop, jeg forstod heller ikke hvorfor du skulle 2 niveauer op over din www-root.

Da mappen nu er oprettet af webserveren og ikke via FTP, skulle du uden problemer kunne oprette nye mapper og filer, inde i den oprettede mappe, via PHP.
Avatar billede syngredk Nybegynder
09. april 2006 - 15:49 #26
Tak for hjælpen, endnu engang fixxxer :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester