Hoe maak je een php-map aan. Php werkt - Maak een map als deze nog niet bestaat

tags verwijderen (12)

Ik ben verschillende gevallen tegengekomen bij WordPress-installaties van Bluehost waarbij ik fouten tegenkwam in mijn WordPress-thema omdat de map uploads wp-content/uploads ontbrak.

Blijkbaar maakt het Bluehost cPanel WP-installatieprogramma deze map niet aan, hoewel HostGator dat wel doet.

Ik moet dus code aan mijn thema toevoegen die de map controleert en deze op een andere manier maakt.

Antwoorden

Probeer dit:

If (!file_exists("pad/naar/map")) ( mkdir("pad/naar/map", 0777, true); )

Merk op dat 0777 al de standaardmodus voor mappen is en nog steeds kan worden gewijzigd door het huidige umask.

WordPress heeft ook een zeer handige functie wp_mkdir_p die recursief een directorystructuur zal creëren.

Bron ter referentie: -

Functie wp_mkdir_p($target) ( $wrapper = null; // strip het protocol if(wp_is_stream($target)) ( list($wrapper, $target) = explode("://", $target, 2); ) // van php.net/mkdir heeft de gebruiker opmerkingen bijgedragen $target = str_replace("//", "/", $target); // plaats de wrapper terug op het doel if($wrapper !== null) ( $target ); = $wrapper . "://" ) // veilige modus mislukt met een afsluitende slash onder bepaalde PHP-versies. if (leeg($target)) $target = "/"; if (file_exists($target)) retourneert @is_dir($target); " != $target_parent && ! is_dir($target_parent)) ( $target_parent = dirname($target_parent); ) // Haal de toestemmingsbits op. if ($stat = @stat($target_parent)) ( $dir_perms = $stat[ "mode"] & 0007777; ) else ( $dir_perms = 0777; ) if (@mkdir($target, $dir_perms, true)) ( // Als er een umask is ingesteld die $dir_perms wijzigt, moeten we dit opnieuw doen stel de $dir_perms correct in met chmod() if ($dir_perms != ($dir_perms & ~umask())) ( $folder_parts = explode( "/", substr($target, strlen($target_parent) + 1));<= count($folder_parts); $i++) { @chmod($target_parent . "/" . implode("/", array_slice($folder_parts, 0, $i)), $dir_perms); } } return true; } return false; }

voor ($i = 1; $i

Include_once("../include/session.php"); $lnum = $sessie->lnum; //Gebruikerslicentienummer van sessies $directory = geüploade_labels; // Naam van de map waarin de map wordt aangemaakt if (!file_exists($directory."/".$lnum)) ( mkdir($directory."/".$lnum, 0777, true); )

Iets algemener zoals het op Google verschijnt. Hoewel de details specifieker zijn, is de titel van deze vraag algemener.

/** * maak recursief een lang mappad */ function createPath($path) ( if (is_dir($path)) return true; $prev_path = substr($path, 0, strrpos($path, "/", - 2) + 1); $return = createPath($prev_path); return ($return && is_writable($prev_path)) ?

Dit zal een pad nemen met mogelijk een lange keten van niet-aangemaakte mappen en één map omhoog gaan totdat het in een bestaande map terechtkomt. Vervolgens zal het proberen de volgende map binnen die map aan te maken en doorgaan totdat alle mappen zijn aangemaakt. Het retourneert waar als het succesvol is.

Kan worden verbeterd door een stopniveau op te geven, zodat het gewoon mislukt als het buiten de map van de gebruiker gaat of zoiets, en door machtigingen in te schakelen.

Om een ​​map aan te maken als deze nog niet bestaat

Overweging van het milieuprobleem.

  • WordPress.
  • Webhostingserver.
  • Ervan uitgaande dat Linux geen PHP draait.

bool mkdir(string $padnaam[, int $mode=0777[, bool $recursive=FALSE[, resource$context]]])

In de handleiding staat dat de enige vereiste parameter $pathname is!

zodat we eenvoudigweg kunnen coderen:

Uitleg:

We hoeven geen enkele parameter door te geven of te controleren of de map bestaat, of indien nodig zelfs de parameter voor de overdrachtsmodus; om de volgende redenen:

  • De opdracht maakt een map aan met de machtiging 0755 (de standaardmachtiging voor een openbare map) of 0777 als de standaardopdracht.
  • modus wordt genegeerd Windows-host met PHP .
  • De opdracht mkdir heeft een ingebouwde controle of de map bestaat; dus we hoeven alleen maar te controleren of True | Vals; en dit is geen fout, het is alleen een waarschuwing, en de waarschuwing is standaard uitgeschakeld op hostingservers.
  • Afhankelijk van de snelheid gaat het sneller als de waarschuwing uitgeschakeld is.

Dit is een andere manier om naar de vraag te kijken en niet de beste of optimale oplossing te claimen.

Getest op PHP7, productieserver, Linux

Je kunt ook proberen:

$dirpath = "pad/naar/map"; $modus = "0777"; is_dir($dirpad) || mkdir($dirpath, $mode, true);

If (!is_dir("pad_map")) ( @mkdir("pad_map"); )

Een snellere manier om een ​​map te maken:

If (!is_dir("pad/naar/map")) ( mkdir("pad/naar/map", 0777, true); )

jij zult doen

Printf("Hallo %s,
", $naam);

voordat u cookies installeert, wat verboden is. U kunt geen gegevens vóór de headers verzenden, zelfs geen lege regel.

PHP heeft een enkele functie: mkdir(), waarmee u mappen op de websiteserver kunt maken, die soms zo noodzakelijk zijn in het huishouden. Wanneer u bijvoorbeeld nieuw materiaal maakt, moet u er een map voor maken, waarin u, wederom met behulp van uw CMS, alle benodigde bestanden uploadt.

Mkdir("/pad/naar/mijn/map", 0700);

Die. in een bepaalde map maken we een nieuwe map aan en stellen we de modus bijvoorbeeld in op modus 0700. Om bijvoorbeeld bestanden naar de map te kunnen schrijven, veranderen we de modus naar 0777.

Maar dit is waar het probleem met mkdir() ontstaat. Wanneer u dit php-script uitvoert terwijl de safe_mode-serverfunctie is ingeschakeld, wordt de eigenaar (UID) gecontroleerd en als de eigenaar van het script en de map niet overeenkomen, kunt u bijvoorbeeld mogelijk geen bestand naar de aangemaakte map schrijven map, verwijder er een bestand in, of bijvoorbeeld via FTP. U kunt de map zelf niet verwijderen.

Maar er is een elegantere oplossing voor dit probleem, zonder dat u de hoster hoeft te vragen de safe_mode-functie voor u uit te schakelen (deze functie is standaard ingeschakeld op absoluut alle hostingsites om de veiligheid te garanderen). In principe bieden betaalde hostingdiensten ook toegang tot ftp, en hier zullen we van uitgaan.

$conn_ftp = @ftp_connect("uw_ftp_server", 21, 5);

De eerste variabele in de functie is het adres van uw ftp-server, de tweede is de poort waarop u verbinding maakt met ftp en de laatste is de toegestane verbindingstime-out. Een beetje over de time-out, deze is nodig voor volgende netwerkbewerkingen; u voert deze niet in, dan is de standaardwaarde ingesteld op 90 seconden. Na de verbinding controleren wij of deze gelukt is en sturen wij de login en het wachtwoord:

If($conn_ftp) // verbinding was succesvol ( $login_result = @ftp_login($conn_ftp, "user", "pass"); // voer uw login en wachtwoord in voor FTP if($login_result) // login en wachtwoordverificatie geslaagd succes(ftp_pasv($conn_ftp, TRUE);))

Nadat we de login en het wachtwoord hebben gecontroleerd, moeten we beslissen over de passieve modus en deze instellen op TRUE of FALSE - dit is nodig als verdere FTP-functies niet correct werken. Nu we de passieve modus hebben gedefinieerd, kunnen we onze mappen maken. Ik zal alle functies beschrijven die in de toekomst nuttig voor u kunnen zijn:

$file = ftp_mkdir($conn_ftp, "public_html/materials/345"); //Maak map 345 aan in de map materialen, als de map materialen niet bestaat, //deze wordt ook aangemaakt, hetzelfde met de map public_html (deze map //is aangegeven zodat je het hele pad kunt zien, anders is het gewoon een map met site) ftp_chdir($conn_ftp, "public_html/materials"); //Als je zeker een map met materialen hebt, hoef je niet het hele //pad te schrijven, je kunt er gewoon eerst naartoe gaan en er dan een map 345 in maken met //de volgende code ftp_mkdir ($conn_ftp, "345") ftp_chmod($ conn_ftp, 0777, $bestand); //Alle mappen worden standaard gemaakt met modus 0755. Met deze opdracht kunt u //it wijzigen in 0777, waardoor u bestanden aan de gemaakte map kunt toevoegen.

Nu geef ik een compleet voorbeeld van werkende code, zodat je kunt zien hoe het er allemaal uitziet, bijvoorbeeld de mijne:

$mapnaam = tijd(); //Hier maak ik de mapnaam op basis van het tijdstip waarop het script werd gestart $conn_ftp = @ftp_connect("your_ftp_server", 21, 5); if($conn_ftp) // verbinding was succesvol ( $login_result = @ftp_login($conn_ftp, "user", "pass"); // voer uw login en wachtwoord in voor FTP if($login_result) // login en wachtwoordverificatie geslaagd success ( ftp_pasv ($conn_ftp, TRUE); ftp_chdir ($conn_ftp, "public_html/materials"); ftp_mkdir ($conn_ftp, $dir_name); ftp_chmod($conn_ftp, 0777, $dir_name); ) )

Het is ook de moeite waard om iets te zeggen over het opgeven van mappen bij het maken; als je aan het begin een schuine streep opgeeft, wordt de map aangemaakt ten opzichte van de ftp-root. Wanneer u verbinding maakt met een FTP-server, maakt u altijd verbinding met de root, dus houd hier rekening mee.

De functie mkdir() maakt een nieuwe map in de opgegeven map. Als het maken is gelukt, wordt True geretourneerd. Wanneer u een nieuwe map maakt, kunt u er toegangsrechten voor instellen met behulp van de parameter $mode. Door $recursive op True in te stellen, kunt u meerdere submappen maken.

PHP-versie 4 en hoger.

functie bol mkdir(string $padnaam [, int $mode [, bool $recursive [, bron $context]]])

mkdir-functieparameters

$padnaamPad naar de map die moet worden gemaakt.
$modusRechten op de aangemaakte map worden toegewezen als een octale waarde met in de eerste plaats een verplichte nul (0777). Afgezien van de eerste nul vertegenwoordigen de cijfers de toegangsniveaus voor de eigenaar, voor de groep van de eigenaar, voor alle anderen.
Het toegangsniveau wordt bepaald door de cijfers:
0 – toegang geweigerd;
1 – leestoegang;
2 – schrijftoegang;
4 – toegang tot uitvoering.
Meestal worden rechten gespecificeerd als een samengesteld bedrag, bijvoorbeeld:
7 – volledige toegang (1+2+4);
5 – lezen en uitvoeren (1+4).
De standaardwaarde is 0777.
$recursiefEen Booleaanse parameter die bepaalt of geneste submappen kunnen worden gemaakt.
$contextWordt gebruikt bij het werken met streams. Toegevoegd in PHP 5.0.0.

Voorbeelden van het gebruik van de mkdir-functie

mkdir( "nieuwe map");

mkdir( "../nieuwe map" ); // een niveau lager

mkdir("/map1/map2/nieuwemap" ); // volledig pad

mkdir( "nieuwe map", 0777); // maak een map met toegewezen rechten

Als u meerdere submappen moet maken, moet u $recursive = True instellen.

mkdir("map1/map2/nieuwemap" , 0777, True ); // een map maken in de huidige map


publicatie van dit artikel is alleen toegestaan ​​met een link naar de website van de auteur van het artikel

In dit artikel zal ik een optie beschrijven om het probleem van het maken van mappen met behulp van php in de veilige modus te omzeilen.
Om een ​​map in PHP aan te maken, is er standaard een mkdir()-functie, maar in de meeste gevallen blijkt deze nutteloos te zijn en veel mensen weten ervan, maar niet veel mensen weten dat je dit probleem kunt omzeilen.
Alles is heel eenvoudig, je moet mappen maken met behulp van de FTP-functies die in php zijn ingebouwd.
Hieronder schrijf ik hierover meer in detail.

Problemen met mkdir() bij het maken van een map.
Zoals je weet, als de veilige modus is ingeschakeld in php (safe_mode = on), zal het maken van mappen (directories) met mkdir() niet werken. Om preciezer te zijn: u kunt deze aanmaken, maar verder gebruik van deze map is onmogelijk. U kunt geen bestanden naar deze map uploaden, u kunt de naam ervan niet wijzigen en u kunt deze niet verwijderen, zelfs niet als u inlogt via FTP (in sommige gevallen kunt u deze verwijderen via FTP).

De veilige modus is standaard ingeschakeld op alle servers en alle hostingproviders. Als u niet de mogelijkheid heeft om de Veilige modus uit te schakelen, is er een andere uitweg.

Mappen maken in php met behulp van FTP.
Bijna alle servers en hosting hebben ftp-ondersteuning ingeschakeld in php.
Met behulp van deze functies zullen we het probleem van het maken van de map mkdir() omzeilen.
Een voorbeeld van het aanmaken van een map via FTP.

$conn_id = @ ftp_connect ("ftp.server.ru" , 21 , 5 ); // maak verbinding met de FTP-server
als($conn_id) // als de verbinding met de server succesvol was, ga dan verder
{
$login_result = @ftp_login($conn_id, "gebruiker", "pas"); // voer uw login en wachtwoord voor FTP in
if($login_result) // als de server het inlogwachtwoord heeft geaccepteerd, ga dan verder
{
// nu moet je met de passieve modus spelen, deze in- of uitschakelen (TRUE, FALSE)
// als andere ftp-functies niet correct werken, probeer dan deze parameter te wijzigen (TRUE of FALE)
ftp_pasv($conn_id, TRUE); // in dit geval is de passieve modus ingeschakeld
ftp_mkdir($conn_id, "1/2/3"); // en het maken van de map zelf
}
}
ftp_close($conn_id); // en sluit de FTP-verbinding
?>
Nu geen grote opmerking over de code.
De eerste lijn maakt verbinding met de FTP-server. Om verbinding te maken met een lokale FTP-server is het doorgaans voldoende om localhost als server op te geven, maar u kunt ook het volledige adres opgeven.
Of de passieve modus is in- of uitgeschakeld, hangt af van de FTP-instellingen.

Wees voorzichtig bij het maken van een map: de map wordt gemaakt vanuit de FTP-aanmeldingsroot. Dat wil zeggen dat de paden hier verschillen van de bestandssysteempaden en dat de map wordt gemaakt zoals gezien via FTP.
Als u bij het aanmaken van een map meerdere bijlagen opgeeft, zoals in mijn voorbeeld "1/2/3", dan worden in dit geval alle ontbrekende mappen aangemaakt. Als er geen map "1" is, wordt deze gemaakt en daarin wordt de map "2" gemaakt, en daarin wordt de map "3" gemaakt. Als er al tussenmappen bestaan, worden alleen de ontbrekende aangemaakt.
Voordat u een map aanmaakt, kunt u bijvoorbeeld naar een map gaan


En na deze functie kunt u een map maken. Als het pad naar de map is opgegeven als “2/3” zonder de voorafgaande schuine streep, wordt de map aangemaakt ten opzichte van de map waarin we ons momenteel bevinden. Dat wil zeggen dat de map "1/2/3" wordt aangemaakt


Als u een schuine streep (/1/2/3) opgeeft bij het maken van een map, wordt de map gemaakt vanuit de FTP-hoofdmap, ongeacht naar welke map u bent verhuisd.

Opmerkingen

14-10-2009 Sergej
alles wat ingenieus is, is eenvoudig :)

12.12.2009 Victor
Bedankt, alles werkt, maar in de ftp-client zijn de aangemaakte mappen niet meteen zichtbaar, je moet hem opnieuw opstarten, d.w.z. verbreek niet alleen de verbinding met de server en maak opnieuw verbinding, maar sluit het programma af en voer het opnieuw uit (ik gebruik FileZilla Client).

14/12/2009 Beheerder
Ik denk dat alle FTP-clients bestanden en mappen in de cache opslaan. In Total Commander is er bijvoorbeeld een speciale ‘update’-knop voor dergelijke zaken; het is jammer dat FileZilla deze niet heeft.

24-01-2010 Alexander
Hoe komt het dat er niet zoiets bestaat in FileZilla, ik heb versie 3.2.2, het is al ongeveer een jaar oud en er is zo'n functie en voor zover ik me herinner is dat altijd zo geweest!!!

27-08-2010 Vitaly
Mappen worden aangemaakt met 755 aan de rechterkant, maar je hebt 777 nodig.
Is het in de aanmaakfase mogelijk om op de een of andere manier te configureren welke rechten de map via FTP wordt aangemaakt?

27-08-2010 Beheerder
Vitaly, hier is een functie voor
ftp_chmod($conn_id, 0777, $bestand)
nadat u een map of bestand hebt gemaakt, gebruikt u deze

28/08/2010 Vitaly
bedankt, beheerder!

09/12/2010 Andrej
Pardon, waarom maak ik niet verschillende mappen, dat wil zeggen:

06/12/2011 Ilja
Er gaat iets niet goed. De serverproblemen:
Waarschuwing: ftp_close() verwacht dat parameter 1 resource is, booleaanse waarde opgegeven in /home/bos/p/h/p/phpscripts/public_html/formf.php op regel 19

15-06-2011 Victor
Ilya, hij schrijft dat de eerste parameter die je doorgeeft aan de functie ftp_close niet correct is

29/06/2011 Alexey
Hetzelfde probleem als Andrej
(meerdere mappen worden niet aangemaakt)
ftp_mkdir ($conn_id, "1"); zo werkt het
maar zoals dit ftp_mkdir ($conn_id, "1/2/3"); / werkt niet.
???

27/07/2011 Victor
Alexey, vreemd, ik heb het gecontroleerd, er worden verschillende mappen voor mij gemaakt.
Misschien is er een lastige modus ingeschakeld op de server, dan moet je mappen één voor één maken, eerst map 1 maken, deze vervolgens openen en er map 2 in maken, dan map 2 invoeren en er 3 in maken...

11/07/2011 k1-801 (Dmitry is mogelijk)
En om mappen te verwijderen, voor zover ik het begrijp, via
rmdir_ftp($conn_id, $dir);
Dus?

En trouwens, om de een of andere reden maakt het geen map voor mij aan (en schrijft het geen fouten... vreemd...)

03/10/2012 JA
Bedankt, anders werd ik gekweld met deze vraag.
en je vergeeft alles en het belangrijkste is dat het werkt

29/05/2012 Michail
Natuurlijk spijt het me. Waar moet ik deze code schrijven, anders ben ik er helemaal niet goed in, maar ik moet echt een map maken))

07/04/2012 Nomak
Er is iets mis met mij... de eerste keer dat de code overslaat, de tweede keer dat er zo'n map bestaat... het lijkt alsof deze wordt aangemaakt, maar deze is niet zichtbaar, zelfs niet na het opnieuw opstarten van FTP((((
en ik moet ook een map maken die niet in dezelfde map staat als waar het PHP-bestand staat, maar een stap teruggaan en dan een andere map invoeren en die daar maken.. zoiets als dit:
../folder1/nieuwe map hier
help alstublieft, als het niet moeilijk is) bedankt)

07/04/2012 Nomak
Ik heb de manieren ontdekt))) in het algemeen bedankt voor het artikel, het komt zelden voor dat iemand goed uitlegt hoe)))

27-01-2013 CiliZ
Goed gedaan, respect voor het artikel

06/05/2013 Vasili
Een bedrijfsmap is het belangrijkste element van de huisstijl van een bedrijf. Het is een product voor het bevestigen van kleine hoeveelheden documenten en papiermaterialen. Mappen worden zowel binnen een bedrijf gebruikt voor het opslaan en verplaatsen van documentatie, als voor reclamedoeleinden. Meer details op de website: www.logodesigner.ru/papki