Hindi lumilikha ng mkdir php folder. Gumagana ang Php - Lumikha ng isang folder kung hindi pa ito umiiral. Mga parameter ng function ng mkdir


ang paglalathala ng artikulong ito ay pinahihintulutan lamang na may link sa website ng may-akda ng artikulo

Sa artikulong ito, ilalarawan ko ang isang opsyon upang malutas ang problema ng paglikha ng mga folder gamit ang php sa safe mode.
Upang lumikha ng isang folder sa PHP, mayroong isang karaniwang function na mkdir(), ngunit sa karamihan ng mga kaso ito ay lumalabas na walang silbi at alam ng maraming tao ang tungkol dito, ngunit hindi alam ng maraming tao na maaari mong malutas ang problemang ito.
Ang lahat ay napaka-simple, kailangan mong lumikha ng mga folder gamit ang mga function ng FTP na binuo sa php.
Sa ibaba ay isinusulat ko ang tungkol dito nang mas detalyado.

Mga problema sa mkdir() kapag lumilikha ng isang folder.
Tulad ng alam mo, kung pinagana ang safe mode sa php (safe_mode = on), hindi gagana ang paggawa ng mga folder (mga direktoryo) gamit ang mkdir(). Upang maging mas tumpak, maaari mo itong gawin, ngunit ang karagdagang paggamit ng folder na ito ay magiging imposible. Hindi mo magagawang mag-upload ng mga file sa folder na ito, hindi mo ito mapapalitan ng pangalan at hindi mo ito matatanggal, kahit na mag-log in ka sa pamamagitan ng FTP (sa ilang mga kaso maaari mong tanggalin sa pamamagitan ng FTP).

Safe mode ay pinagana bilang default sa lahat ng server at lahat ng hosting provider. Kung wala kang opsyon na huwag paganahin ang Safe Mode, may isa pang paraan.

Paglikha ng mga folder sa php gamit ang FTP.
Halos lahat ng mga server at hosting ay may ftp support na pinagana sa php.
Sa tulong ng mga function na ito malalagpasan natin ang problema sa paglikha ng mkdir() folder.
Isang halimbawa ng paglikha ng isang folder sa pamamagitan ng FTP.

$conn_id = @ ftp_connect ("ftp.server.ru" , 21 , 5 ); // kumonekta sa FTP server
kung($conn_id) // kung matagumpay ang koneksyon sa server, magpatuloy
{
$login_result = @ftp_login($conn_id, "user", "pass"); // ipasok ang iyong login at password para sa FTP
if($login_result) // kung tinanggap ng server ang password sa pag-login, magpatuloy
{
// ngayon ay kailangan mong maglaro gamit ang passive mode, i-on o i-off ito (TRUE, FALSE)
// kung hindi gumana nang tama ang karagdagang ftp function, subukang baguhin ang parameter na ito (TRUE o FALE)
ftp_pasv($conn_id, TRUE); // sa kasong ito ay pinagana ang passive mode
ftp_mkdir($conn_id, "1/2/3"); // at ang mismong paglikha ng folder
}
}
ftp_close($conn_id); // at isara ang FTP connection
?>
Ngayon, hindi isang malaking komento sa code.
Ang unang linya ay kumokonekta sa FTP server. Karaniwan, upang kumonekta sa isang lokal na FTP server, sapat na upang tukuyin ang localhost bilang server, ngunit maaari mo ring tukuyin ang buong address.
Kung pinagana o hindi pinagana ang passive mode ay depende sa mga setting ng FTP.

Kapag lumilikha ng isang folder, mag-ingat, ang folder ay nilikha mula sa FTP login root. Iyon ay, ang mga landas dito ay naiiba sa mga landas ng file system at ang folder ay nilikha tulad ng nakikita sa pamamagitan ng FTP.
Kung kapag lumilikha ng isang folder ay tinukoy mo ang ilang mga attachment, tulad ng sa aking halimbawa na "1/2/3", kung gayon sa kasong ito ang lahat ng nawawalang mga folder ay malilikha. Kung walang folder na "1", ito ay malilikha, at sa loob nito ang folder na "2" ay malilikha, at sa loob nito ang folder na "3" ay malilikha. Kung mayroon nang mga intermediate na folder, ang mga nawawala lang ang malilikha.
Bago gumawa ng folder, maaari kang lumipat sa isang folder, halimbawa


At pagkatapos ng function na ito maaari kang lumikha ng isang folder. Kung ang path sa folder ay tinukoy bilang "2/3" nang walang nangungunang slash, pagkatapos ay malilikha ang folder na may kaugnayan sa folder kung saan kami ay kasalukuyang matatagpuan. Iyon ay, ang folder na "1/2/3" ay malilikha


Kung tutukuyin mo ang isang nangungunang slash (/1/2/3) kapag gumagawa ng isang folder, ang folder ay malilikha mula sa FTP root, anuman ang folder kung saan ka lumipat.

Mga komento

10/14/2009 Sergey
lahat ng mapanlikha ay simple :)

12.12.2009 Victor
Salamat, gumagana ang lahat, ngunit sa ftp client ang nilikha na mga folder ay hindi agad makikita, kailangan mong i-restart ito, i.e. huwag lamang idiskonekta mula sa server at kumonekta muli, ngunit isara ang programa at patakbuhin itong muli (ginagamit ko ang FileZilla Client).

12/14/2009 Admin
Sa tingin ko lahat ng FTP client ay nag-cache ng mga file at folder. Halimbawa, sa Kabuuang Kumander mayroong isang espesyal na "update" na pindutan para sa mga bagay na ito ay isang kahihiyan na ang FileZilla ay wala nito.

01/24/2010 Alexander
Pano ba naman walang ganyan sa FileZilla, meron akong version 3.2.2, mga isang taon na at may ganung function at sa pagkakaalala ko noon pa!!!

08/27/2010 Vitaly
Ang mga folder ay nilikha na may 755 sa kanan, ngunit kailangan mo ng 777.
Sa yugto ng paglikha, posible bang i-configure kung anong mga karapatan ang malilikha ng folder sa pamamagitan ng FTP?

08/27/2010 Admin
Vitaly, mayroong isang function para dito
ftp_chmod($conn_id, 0777, $file)
pagkatapos gumawa ng folder o file, gamitin ito

08/28/2010 Vitaly
salamat, Admin!

09/12/2010 Andrey
Paumanhin, bakit hindi ako lumikha ng ilang mga direktoryo, iyon ay:

06/12/2011 Ilya
May hindi maganda. Mga isyu sa server:
Babala: Inaasahan ng ftp_close() na magiging mapagkukunan ang parameter 1, ibinigay ang boolean sa /home/bos/p/h/p/phpscripts/public_html/formf.php sa linya 19

06/15/2011 Victor
Ilya, isinulat niya na ang unang parameter na ipinapasa mo sa ftp_close function ay hindi tama

06/29/2011 Alexey
Parehong problema ni Andrey
(maraming mga direktoryo ay hindi nilikha)
ftp_mkdir ($conn_id, "1"); // ganito ito gumagana
ngunit tulad nito ftp_mkdir ($conn_id, "1/2/3");
???

07/27/2011 Victor
Alexey, kakaiba, sinuri ko, lumilikha ito ng ilang mga folder para sa akin.
Siguro ang ilang tricky mode ay pinagana sa server, pagkatapos ay kailangan mong lumikha ng mga folder nang paisa-isa, lumikha muna ng folder 1, pagkatapos ay ipasok ito at lumikha ng folder 2 dito, pagkatapos ay ipasok ang folder 2 at lumikha ng 3 sa loob nito...

11/07/2011 k1-801 (Posible si Dmitry)
At upang tanggalin ang mga folder, sa pagkakaintindi ko, sa pamamagitan ng
rmdir_ftp($conn_id, $dir);
Kaya?

At, sa pamamagitan ng paraan, sa ilang kadahilanan ay hindi ito lumikha ng isang folder para sa akin (at hindi nagsusulat ng mga error ... kakaiba ...)

03/10/2012 YA
Salamat, kung hindi, ako ay pinahirapan sa tanong na ito.
at pinatawad mo ang lahat at ang pangunahing bagay ay gumagana ito

05/29/2012 Mikhail
Syempre sorry. Saan ko dapat isulat ang code na ito, kung hindi, hindi ako magaling dito, ngunit kailangan ko talagang lumikha ng isang folder))

07/04/2012 Nomaq
May mali sa akin... sa unang pagkakataon na lumaktaw ang code, sa pangalawang pagkakataon ay sinabi nito na umiiral na ang ganoong folder... tila ito ay nilikha, ngunit hindi ito nakikita kahit na pagkatapos i-restart ang FTP((((
at gayundin, kailangan kong lumikha ng isang folder na hindi sa parehong folder kung saan ang PHP file ay, ngunit bumalik sa isang hakbang, at pagkatapos ay magpasok ng isa pang folder at lumikha ito doon.. isang bagay na tulad nito:
../folder1/bagong folder dito
mangyaring tulong, kung hindi mahirap) salamat)

07/04/2012 Nomaq
Naisip ko ang mga paraan))) salamat sa pangkalahatan para sa artikulo, bihira na sinuman ang nagpapaliwanag nang maayos kung paano)))

01/27/2013 CiliZ
Magaling, paggalang sa artikulo

06/05/2013 Vasily
Ang corporate folder ay ang pangunahing elemento ng corporate identity ng isang kumpanya. Ito ay isang produkto para sa paglakip ng maliit na halaga ng mga dokumento at mga materyales sa papel. Ginagamit ang mga folder sa loob ng isang kumpanya, para sa pag-iimbak at paglipat ng dokumentasyon, at para sa mga layunin ng advertising. Higit pang mga detalye sa website: www.logodesigner.ru/papki

Ang mkdir() function ay lumilikha ng bagong folder sa tinukoy na direktoryo. Kung matagumpay ang paglikha, ibabalik ang True. Kapag gumagawa ng bagong folder, maaari kang magtakda ng mga karapatan sa pag-access dito gamit ang parameter na $mode. Sa pamamagitan ng pagtatakda ng $recursive sa True, maaari kang lumikha ng maraming subfolder.

PHP bersyon 4 at mas mataas.

function na bool mkdir(string $pathname [, int $mode [, bool $recursive [, mapagkukunan $context]]])

Mga parameter ng function ng mkdir

$pathnamePath sa direktoryo na gagawin.
$modeAng mga karapatan sa ginawang folder ay itinalaga bilang isang octal na halaga na may mandatoryong zero sa unang lugar (0777). Bukod sa unang zero, ang mga numero ay kumakatawan sa mga antas ng pag-access para sa may-ari, para sa grupo ng may-ari, para sa lahat.
Ang antas ng pag-access ay tinutukoy ng mga numero:
0 - tinanggihan ang pag-access;
1 – read access;
2 – access sa pagsulat;
4 - pag-access sa pagpapatupad.
Kadalasan, ang mga karapatan ay tinukoy bilang isang pinagsama-samang halaga, halimbawa:
7 – ganap na pag-access (1+2+4);
5 – pagbabasa at pagpapatupad (1+4).
Ang default na halaga ay 0777.
$recursiveIsang Boolean na parameter na tumutukoy kung ang mga nested subdirectory ay maaaring gawin.
$kontekstoGinagamit kapag nagtatrabaho sa mga stream. Idinagdag sa PHP 5.0.0.

Mga halimbawa ng paggamit ng mkdir function

mkdir( "bagong folder" );

mkdir( "../newfolder" ); // isang antas pababa

mkdir("/folder1/folder2/newfolder" ); // buong landas

mkdir( "newfolder" , 0777); // lumikha ng isang folder na may mga nakatalagang karapatan

Kung kailangan mong gumawa ng maraming subfolder, kailangan mong itakda ang $recursive = True.

mkdir("folder1/folder2/newfolder" , 0777, True ); // paglikha ng isang folder sa kasalukuyang direktoryo

Ang PHP ay may isang solong function - mkdir(), na nagpapahintulot sa iyo na lumikha ng mga direktoryo sa server ng website, na kung minsan ay kinakailangan sa sambahayan. Halimbawa, kapag lumilikha ng isang bagong materyal, kailangan mong lumikha ng isang folder para dito, kung saan, muli gamit ang iyong CMS, ia-upload mo ang lahat ng kinakailangang mga file.

Mkdir("/path/to/my/dir", 0700);

Yung. sa isang partikular na direktoryo ay lumikha kami ng isang bagong folder at, halimbawa, itakda ang mode nito sa mode 0700, halimbawa, upang makapagsulat ng mga file sa folder, binago namin ang mode sa 0777.

Ngunit dito lumalabas ang problema sa mkdir(). Kapag isinagawa ang php script na ito nang pinagana ang safe_mode server function, ang may-ari (UID) ay sinusuri at kung ang may-ari ng script at ang folder ay hindi magkatugma, maaaring hindi mo, halimbawa, na magsulat ng isang file sa nilikha. direktoryo, tanggalin ang isang file sa loob nito, o, halimbawa, sa pamamagitan ng FTP mo Hindi mo matatanggal ang mismong folder.

Ngunit mayroong isang mas eleganteng solusyon sa problemang ito, nang hindi kinakailangang hilingin sa hoster na huwag paganahin ang safe_mode function para sa iyo (ang function na ito ay pinagana sa ganap na lahat ng mga hosting site bilang default, upang matiyak ang seguridad). Karaniwan, ang mga bayad na serbisyo sa pagho-host ay nagbibigay din ng access sa ftp, at ito ang ating sisimulan.

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

Ang unang variable sa function ay ang address ng iyong ftp server, ang pangalawa ay ang port kung saan ka kumonekta sa ftp at ang huli ay ang pinapayagang timeout ng koneksyon. Medyo tungkol sa timeout, ito ay kinakailangan para sa kasunod na mga operasyon ng network kung hindi mo ito ipasok, pagkatapos ay ang default na halaga ay nakatakda sa 90 segundo. Pagkatapos ng koneksyon, sinusuri namin kung ito ay matagumpay at ipinadala ang pag-login at password:

If($conn_ftp) // matagumpay ang koneksyon ($login_result = @ftp_login($conn_ftp, "user", "pass"); // ipasok ang iyong login at password para sa FTP if($login_result) // naipasa ang login at password verification tagumpay(ftp_pasv($conn_ftp, TRUE);))

Matapos suriin ang pag-login at password, kailangan nating magpasya sa passive mode at itakda ito sa TRUE o FALSE - ito ay kinakailangan kung ang karagdagang mga function ng FTP ay hindi gagana nang tama. Ngayon pagkatapos tukuyin ang passive mode, maaari kaming lumikha ng aming mga folder, ilalarawan ko ang lahat ng mga function na maaaring maging kapaki-pakinabang sa iyo sa hinaharap:

$file = ftp_mkdir($conn_ftp, "public_html/materials/345"); //Paglikha ng direktoryo 345 sa folder ng mga materyales, kung wala ang folder ng mga materyales, //ito rin ay malilikha, pareho sa public_html folder (ang direktoryo na ito // ay ipinahiwatig upang makita mo ang buong landas, kung hindi man ay isang folder lamang na may site) ftp_chdir($conn_ftp, "public_html/materials"); //Kung talagang mayroon kang folder ng mga materyales, hindi mo na kailangang isulat ang buong //path, maaari mo lamang itong puntahan at pagkatapos ay lumikha ng isang folder 345 dito gamit ang //ang sumusunod na code ftp_mkdir ($conn_ftp, "345") ftp_chmod($ conn_ftp, 0777, $file); //Lahat ng mga folder ay nilikha gamit ang mode 0755 bilang default, ang command na ito ay magpapahintulot sa iyo na baguhin //ito sa 0777, na magbibigay-daan sa iyo upang magdagdag ng mga file sa nilikha na folder.

Ngayon ay magbibigay ako ng kumpletong halimbawa ng gumaganang code upang makita mo kung ano ang hitsura ng lahat, halimbawa, sa akin:

$dir_name = oras(); // Dito ko nililikha ang pangalan ng folder batay sa oras na inilunsad ang script $conn_ftp = @ftp_connect("your_ftp_server", 21, 5); if($conn_ftp) // matagumpay ang koneksyon ($login_result = @ftp_login($conn_ftp, "user", "pass"); // ipasok ang iyong login at password para sa FTP if($login_result) // naipasa ang login at password verification tagumpay (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); ) )

Ito rin ay nagkakahalaga ng pagsasabi ng kaunti tungkol sa pagtukoy ng mga direktoryo kapag lumilikha ka kung tumukoy ka ng isang slash sa simula, ang folder ay gagawin kaugnay sa ftp root. Kapag kumokonekta sa isang FTP server palagi kang kumokonekta sa root, kaya tandaan ito.

alisin ang mga tag (12)

Nakatagpo ako ng ilang mga kaso sa mga pag-install ng WordPress mula sa Bluehost kung saan nakatagpo ako ng mga error sa aking tema ng WordPress dahil nawawala ang folder ng pag-upload ng wp-content/uploads.

Tila ang Bluehost cPanel WP installer ay hindi gumagawa ng folder na ito, kahit na ang HostGator ay gumagawa.

Kaya kailangan kong magdagdag ng code sa aking tema na sumusuri para sa folder at lumilikha nito kung hindi man.

Mga sagot

Subukan ito:

Kung (!file_exists("path/to/directory") ( mkdir("path/to/directory", 0777, true); )

Tandaan na ang 0777 ay ang default na mode para sa mga direktoryo at maaari pa ring baguhin ng kasalukuyang umask.

Ang WordPress ay mayroon ding napakadaling gamit na function na wp_mkdir_p na gagawa ng recursively ng isang istraktura ng direktoryo.

Pinagmulan para sa sanggunian:-

Function wp_mkdir_p($target) ($wrapper = null; // hubarin ang protocol if(wp_is_stream($target)) ( list($wrapper, $target) = explode("://", $target, 2); ) // mula sa php.net/mkdir user na nag-ambag ng mga tala $target = str_replace("//", "/", $target); // ibalik ang wrapper sa target kung($wrapper !== null) ( $target ); = $wrapper . "://" . if (empty($target)) $target = "/"; if (file_exists($target)) ibalik ang @is_dir($target); " != $target_parent && ! is_dir($target_parent)) ($target_parent = dirname($target_parent); ) // Kunin ang mga bits ng pahintulot. if ($stat = @stat($target_parent)) ($dir_perms = $stat[ "mode"] & 0007777; ) else ($dir_perms = 0777; ) kung (@mkdir($target, $dir_perms, true)) ( // Kung nakatakda ang umask na nagbabago sa $dir_perms, kailangan nating muling- itakda nang tama ang $dir_perms gamit ang 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; }

para sa ($i = 1; $i

Kailangan ko ang parehong para sa login site. Kailangan kong lumikha ng isang direktoryo na may dalawang variable. Ang direktoryo ng $ ay ang pangunahing folder kung saan nais kong lumikha ng isa pang subfolder na may numero ng lisensya ng mga gumagamit.

Include_once("../include/session.php"); $lnum = $session->lnum; // Numero ng lisensya ng mga user mula sa mga session $directory = uploaded_labels; // Pangalan ng direktoryo kung saan nilikha ang folder kung (!file_exists($directory."/".$lnum)) ( mkdir($directory."/".$lnum, 0777, true); )

Isang bagay na mas generic habang lumalabas ito sa google. Habang ang mga detalye ay mas tiyak, ang pamagat ng tanong na ito ay mas generic.

Dadalhin ito ng landas na may posibleng mahabang hanay ng mga hindi nilikhang direktoryo at magpapatuloy sa paglipat ng isang direktoryo hanggang sa mapunta ito sa isang umiiral nang direktoryo. Susubukan nitong lumikha ng susunod na direktoryo sa loob ng direktoryong iyon at magpapatuloy hanggang sa malikha ang lahat ng mga direktoryo. Nagbabalik ito ng totoo kung matagumpay.

Maaaring pahusayin sa pamamagitan ng pagbibigay ng stop level kaya mabibigo lang ito kung lumabas ito sa folder ng user o isang bagay, at paganahin ang mga pahintulot.

Upang lumikha ng isang folder kung hindi pa ito umiiral

Pagsasaalang-alang sa isyu sa kapaligiran.

  • WordPress.
  • Web hosting server.
  • Ipagpalagay na ang Linux ay hindi nagpapatakbo ng PHP.

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

Ang manual ay nagsasaad na ang tanging kinakailangang parameter ay $pathname !

para ma-code na lang natin:

Paliwanag:

Hindi namin kailangang ipasa ang anumang parameter o suriin kung umiiral ang folder o maging ang parameter ng transfer mode kung kinakailangan; para sa mga sumusunod na dahilan:

  • Ang command ay lilikha ng isang folder na may pahintulot na 0755 (ang default na pahintulot para sa isang pampublikong folder) o 0777 bilang ang default na command.
  • hindi pinapansin ang mode Windows host na nagpapatakbo ng PHP .
  • Ang mkdir command ay may built-in na check kung ang folder ay umiiral; kaya kailangan lang nating suriin para sa pagbabalik ng True | Mali; at ito ay hindi isang error, ito ay isang babala lamang, at ang babala ay hindi pinagana sa pagho-host ng mga server bilang default.
  • Depende sa bilis, mas mabilis ito kung hindi pinagana ang babala.

Ito ay isa pang paraan ng pagtingin sa tanong at hindi pag-claim ng pinakamahusay o pinakamainam na solusyon.

Nasubok sa PHP7, Production Server, Linux

Maaari mo ring subukan:

$dirpath = "path/to/dir"; $mode = "0777"; is_dir($dirpath) || mkdir($dirpath, $mode, true);

Kung (!is_dir("path_directory")) (@mkdir("path_directory"); )

Isang mas mabilis na paraan upang lumikha ng isang folder:

Kung (!is_dir("path/to/directory") ( mkdir("path/to/directory", 0777, true); )

gagawin mo

Printf("Kumusta %s,
", $pangalan);

bago mag-install ng cookies, na ipinagbabawal. Hindi ka maaaring magpadala ng anumang data bago ang mga header, kahit isang walang laman na linya.