Tidak mencipta folder php mkdir. Php berfungsi - Buat folder jika ia belum wujud. parameter fungsi mkdir


penerbitan artikel ini dibenarkan hanya dengan pautan ke laman web pengarang artikel

Dalam artikel ini, saya akan menerangkan satu pilihan untuk mengatasi masalah mencipta folder menggunakan php dalam mod selamat.
Untuk mencipta folder dalam PHP, terdapat fungsi mkdir() standard, tetapi dalam kebanyakan kes ia ternyata tidak berguna dan ramai orang tahu mengenainya, tetapi tidak ramai yang tahu bahawa anda boleh mengatasi masalah ini.
Segala-galanya sangat mudah, anda perlu mencipta folder menggunakan fungsi FTP terbina dalam php.
Di bawah saya menulis tentang ini dengan lebih terperinci.

Masalah dengan mkdir() semasa membuat folder.
Seperti yang anda ketahui, jika mod selamat didayakan dalam php (safe_mode = on), maka membuat folder (direktori) menggunakan mkdir() tidak akan berfungsi. Untuk menjadi lebih tepat, anda boleh menciptanya, tetapi penggunaan selanjutnya folder ini adalah mustahil. Anda tidak akan dapat memuat naik fail ke folder ini, anda tidak akan dapat menamakannya semula dan anda tidak akan dapat memadamkannya, walaupun anda log masuk melalui FTP (dalam beberapa kes anda boleh memadamkannya melalui FTP).

Mod selamat didayakan secara lalai pada semua pelayan dan semua penyedia pengehosan. Jika anda tidak mempunyai pilihan untuk melumpuhkan Mod Selamat, terdapat jalan keluar lain.

Mencipta folder dalam php menggunakan FTP.
Hampir semua pelayan dan pengehosan mempunyai sokongan ftp yang didayakan dalam php.
Dengan bantuan fungsi ini kita akan mengatasi masalah mencipta folder mkdir().
Contoh mencipta folder melalui FTP.

$conn_id = @ ftp_connect ("ftp.server.ru" , 21 , 5 ); // sambung ke pelayan FTP
jika($conn_id) // jika sambungan ke pelayan berjaya, teruskan
{
$login_result = @ftp_login($conn_id, "user", "pass"); // masukkan log masuk dan kata laluan anda untuk FTP
if($login_result) // jika pelayan menerima kata laluan log masuk, teruskan
{
// kini anda perlu bermain dengan mod pasif, hidupkan atau matikan (BENAR, SALAH)
// jika fungsi ftp selanjutnya tidak berfungsi dengan betul, cuba tukar parameter ini (TRUE atau FALE)
ftp_pasv($conn_id, TRUE); // dalam kes ini mod pasif didayakan
ftp_mkdir($conn_id, "1/2/3"); // dan penciptaan folder itu sendiri
}
}
ftp_close($conn_id); // dan tutup sambungan FTP
?>
Sekarang, bukan komen besar tentang kod itu.
Baris pertama bersambung ke pelayan FTP. Biasanya, untuk menyambung ke pelayan FTP tempatan, cukup untuk menentukan localhost sebagai pelayan, tetapi anda juga boleh menentukan alamat penuh.
Sama ada mod pasif didayakan atau dilumpuhkan bergantung pada tetapan FTP.

Apabila mencipta folder, berhati-hati, folder itu dicipta daripada akar log masuk FTP. Iaitu, laluan di sini berbeza daripada laluan sistem fail dan folder dibuat seperti yang dilihat melalui FTP.
Jika semasa membuat folder anda menentukan beberapa lampiran, seperti dalam contoh saya "1/2/3", maka dalam kes ini semua folder yang hilang akan dibuat. Sekiranya tidak ada folder "1", ia akan dibuat, dan di dalamnya folder "2" akan dibuat, dan di dalamnya folder "3" akan dibuat. Jika folder perantaraan sudah wujud, maka hanya folder yang hilang akan dibuat.
Sebelum mencipta folder, anda boleh beralih ke folder, contohnya


Dan selepas fungsi ini anda boleh membuat folder. Jika laluan ke folder ditentukan sebagai "2/3" tanpa garis miring utama, maka folder itu akan dibuat relatif kepada folder di mana kami berada sekarang. Iaitu, folder "1/2/3" akan dibuat


Jika anda menentukan garis miring utama (/1/2/3) semasa mencipta folder, folder itu akan dibuat daripada akar FTP, tanpa mengira folder mana yang anda pindahkan.

Komen

14/10/2009 Sergey
semua yang cerdik adalah mudah :)

12.12.2009 Victor
Terima kasih, semuanya berfungsi, tetapi dalam klien ftp folder yang dibuat tidak dapat dilihat dengan serta-merta, anda perlu memulakannya semula, i.e. jangan hanya putuskan sambungan dari pelayan dan sambung semula, tetapi tutup program dan jalankannya semula (saya menggunakan Klien FileZilla).

12/14/2009 Admin
Saya rasa semua pelanggan FTP cache fail dan folder. Sebagai contoh, dalam Total Commander terdapat butang "kemas kini" khas untuk perkara sedemikian; memalukan bahawa FileZilla tidak mempunyai ini.

24/01/2010 Alexander
Macam mana tak ada dalam FileZilla, saya ada versi 3.2.2, umurnya sudah lebih kurang setahun dan ada fungsi sebegitu dan seingat saya selalu ada!!!

27/08/2010 Vitaly
Folder dicipta dengan 755 di sebelah kanan, tetapi anda memerlukan 777.
Pada peringkat penciptaan, adakah mungkin untuk mengkonfigurasi hak folder yang akan dibuat melalui FTP?

27/08/2010 Admin
Vitaly, ada fungsi untuk ini
ftp_chmod($conn_id, 0777, $file)
selepas mencipta folder atau fail, gunakannya

28/08/2010 Vitaly
terima kasih, Admin!

09/12/2010 Andrey
Maaf, mengapa saya tidak membuat beberapa direktori, iaitu:

06/12/2011 Ilya
Sesuatu tidak berjalan lancar. Isu pelayan:
Amaran: ftp_close() menjangkakan parameter 1 sebagai sumber, boolean diberikan dalam /home/bos/p/h/p/phpscripts/public_html/formf.php pada baris 19

15/06/2011 Victor
Ilya, dia menulis bahawa parameter pertama yang anda hantar ke fungsi ftp_close adalah tidak betul

29/06/2011 Alexey
Masalah yang sama seperti Andrey
(berbilang direktori tidak dibuat)
ftp_mkdir ($conn_id, "1"); // ini adalah cara ia berfungsi
tetapi seperti ini ftp_mkdir ($conn_id, "1/2/3"); // tidak berfungsi.
???

27/07/2011 Victor
Alexey, pelik, saya menyemak, ia mencipta beberapa folder untuk saya.
Mungkin beberapa mod rumit didayakan pada pelayan, maka anda perlu membuat folder satu demi satu, mula-mula buat folder 1, kemudian masukkannya dan buat folder 2 di dalamnya, kemudian masukkan folder 2 dan buat 3 di dalamnya...

11/07/2011 k1-801 (Dmitry mungkin)
Dan untuk memadam folder, sejauh yang saya faham, melalui
rmdir_ftp($conn_id, $dir);
Jadi?

Dan, dengan cara ini, atas sebab tertentu ia tidak mencipta folder untuk saya (dan tidak menulis ralat... pelik...)

03/10/2012 YA
Terima kasih, jika tidak saya terseksa dengan soalan ini.
dan anda memaafkan segala-galanya dan perkara utama adalah ia berkesan

29/05/2012 Mikhail
Sudah tentu saya minta maaf. Di mana saya harus menulis kod ini, jika tidak, saya tidak pandai sama sekali, tetapi saya benar-benar perlu membuat folder))

07/04/2012 Nomaq
Ada yang tidak kena dengan saya... kali pertama kod melangkau, kali kedua ia mengatakan bahawa folder sedemikian sudah wujud... nampaknya ia sedang dibuat, tetapi ia tidak kelihatan walaupun selepas memulakan semula FTP((((
dan juga, saya perlu mencipta folder bukan dalam folder yang sama di mana fail PHP berada, tetapi kembali satu langkah, dan kemudian masukkan folder lain dan buat di sana.. sesuatu seperti ini:
../folder1/folder baharu di sini
tolong bantu, jika tidak sukar) terima kasih)

07/04/2012 Nomaq
Saya mengetahui caranya))) terima kasih secara umum untuk artikel itu, jarang ada sesiapa yang menerangkan dengan betul bagaimana caranya)))

27/01/2013 CiliZ
Syabas, hormati artikel tersebut

06/05/2013 Vasily
Folder korporat ialah elemen utama identiti korporat syarikat. Ia adalah produk untuk melampirkan sejumlah kecil dokumen dan bahan kertas. Folder digunakan dalam syarikat, untuk menyimpan dan memindahkan dokumentasi, dan untuk tujuan pengiklanan. Butiran lanjut di laman web: www.logodesigner.ru/papki

Fungsi mkdir() mencipta folder baharu dalam direktori yang ditentukan. Jika penciptaan berjaya, mengembalikan Benar. Apabila mencipta folder baharu, anda boleh menetapkan hak akses kepadanya menggunakan parameter $mode. Dengan menetapkan $recursive kepada True, anda boleh membuat berbilang subfolder.

PHP versi 4 dan lebih tinggi.

fungsi bool mkdir(rentetan $pathname [, int $mode [, bool $rekursif [, sumber $konteks]]])

parameter fungsi mkdir

$pathnameLaluan ke direktori yang akan dibuat.
$modHak kepada folder yang dibuat. Hak diperuntukkan sebagai nilai perlapanan dengan sifar mandatori di tempat pertama (0777). Selain daripada sifar pertama, nombor mewakili tahap akses untuk pemilik, untuk kumpulan pemilik, untuk orang lain.
Tahap akses ditentukan oleh nombor:
0 – akses ditolak;
1 – akses baca;
2 – akses tulis;
4 – akses pelaksanaan.
Selalunya, hak ditentukan sebagai jumlah komposit, sebagai contoh:
7 – akses penuh (1+2+4);
5 – membaca dan melaksanakan (1+4).
Nilai lalai ialah 0777.
$rekursifParameter Boolean yang menentukan sama ada subdirektori bersarang boleh dibuat.
$konteksDigunakan semasa bekerja dengan aliran. Ditambah dalam PHP 5.0.0.

Contoh penggunaan fungsi mkdir

mkdir( "Fail baharu" );

mkdir( "../Fail baharu" ); // satu tahap ke bawah

mkdir("/folder1/folder2/newfolder" ); // laluan penuh

mkdir( "folder baharu" , 0777); // buat folder dengan hak yang diberikan

Jika anda perlu mencipta berbilang subfolder, anda perlu menetapkan $recursive = True.

mkdir("folder1/folder2/newfolder" , 0777, True ); // mencipta folder dalam direktori semasa

PHP mempunyai satu fungsi - mkdir(), yang membolehkan anda membuat direktori pada pelayan laman web, yang kadangkala sangat diperlukan dalam isi rumah. Sebagai contoh, apabila mencipta bahan baharu, anda perlu membuat folder untuknya, di mana, sekali lagi menggunakan CMS anda, anda akan memuat naik semua fail yang diperlukan.

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

Itu. dalam direktori tertentu kami mencipta folder baharu dan, sebagai contoh, tetapkan modnya kepada mod 0700, sebagai contoh, untuk dapat menulis fail ke folder, kami menukar mod kepada 0777.

Tetapi di sinilah masalah dengan mkdir() timbul. Apabila melaksanakan skrip php ini dengan fungsi pelayan safe_mode didayakan, pemilik (UID) diperiksa dan jika pemilik skrip dan folder tidak sepadan, maka anda mungkin tidak dapat, sebagai contoh, untuk menulis fail ke yang dibuat direktori, padam fail di dalamnya, atau, sebagai contoh, melalui FTP anda Anda tidak akan dapat memadamkan folder itu sendiri.

Tetapi terdapat penyelesaian yang lebih elegan untuk masalah ini, tanpa perlu meminta hoster untuk melumpuhkan fungsi safe_mode untuk anda (fungsi ini didayakan pada semua tapak pengehosan secara lalai, untuk memastikan keselamatan). Pada asasnya, perkhidmatan pengehosan berbayar juga menyediakan akses kepada ftp, dan inilah yang akan kami mulakan.

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

Pembolehubah pertama dalam fungsi ialah alamat pelayan ftp anda, yang kedua ialah port yang anda sambungkan ke ftp dan yang terakhir ialah tamat masa sambungan yang dibenarkan. Sedikit mengenai tamat masa, adalah perlu untuk operasi rangkaian seterusnya; jika anda tidak memasukkannya, maka nilai lalai ditetapkan kepada 90 saat. Selepas sambungan, kami menyemak sama ada ia berjaya dan menghantar log masuk dan kata laluan:

If($conn_ftp) // sambungan berjaya ($login_result = @ftp_login($conn_ftp, "user", "pass"); // masukkan log masuk dan kata laluan anda untuk FTP if($login_result) // log masuk dan pengesahan kata laluan diluluskan kejayaan(ftp_pasv($conn_ftp, TRUE);))

Selepas menyemak log masuk dan kata laluan, kami perlu memutuskan mod pasif dan menetapkannya kepada BENAR atau SALAH - ini perlu jika fungsi FTP selanjutnya tidak akan berfungsi dengan betul. Sekarang selepas menentukan mod pasif, kami boleh mencipta folder kami, saya akan menerangkan semua fungsi yang mungkin berguna kepada anda pada masa hadapan:

$file = ftp_mkdir($conn_ftp, "public_html/materials/345"); //Mencipta direktori 345 dalam folder bahan, jika folder bahan tidak wujud, //ia juga akan dibuat, sama dengan folder public_html (direktori ini //ditandakan supaya anda boleh melihat keseluruhan laluan, jika tidak, ia adalah hanya folder dengan tapak) ftp_chdir($conn_ftp, "public_html/materials"); //Jika anda pasti mempunyai folder bahan, maka anda tidak perlu menulis keseluruhan //laluan, anda boleh pergi ke sana dahulu dan kemudian buat folder 345 di dalamnya menggunakan //kod berikut ftp_mkdir ($conn_ftp, "345") ftp_chmod($ conn_ftp, 0777, $file); //Semua folder dicipta dengan mod 0755 secara lalai, arahan ini akan membolehkan anda menukar //ke 0777, yang membolehkan anda menambah fail ke folder yang dibuat.

Sekarang saya akan memberikan contoh lengkap kod kerja supaya anda boleh melihat rupa semuanya, sebagai contoh, saya:

$dir_name = masa(); //Di sini saya mencipta nama folder berdasarkan masa skrip dilancarkan $conn_ftp = @ftp_connect("your_ftp_server", 21, 5); if($conn_ftp) // sambungan berjaya ($login_result = @ftp_login($conn_ftp, "user", "pass"); // masukkan log masuk dan kata laluan anda untuk FTP if($login_result) // log masuk dan pengesahan kata laluan diluluskan kejayaan (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); ) )

Ia juga bernilai mengatakan sedikit tentang menentukan direktori semasa membuat; jika anda menentukan garis miring pada permulaan, folder akan dibuat relatif kepada akar ftp. Apabila menyambung ke pelayan FTP, anda sentiasa menyambung ke akar, jadi ingat perkara ini.

alih keluar tag (12)

Saya telah menghadapi beberapa kes dengan pemasangan WordPress daripada Bluehost di mana saya mengalami ralat dalam tema WordPress saya kerana folder muat naik wp-content/uploads tiada.

Nampaknya pemasang Bluehost cPanel WP tidak mencipta folder ini, walaupun HostGator melakukannya.

Jadi saya perlu menambah kod pada tema saya yang menyemak folder dan menciptanya sebaliknya.

Jawapan

Cuba ia:

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

Ambil perhatian bahawa 0777 sudah pun menjadi mod lalai untuk direktori dan masih boleh ditukar oleh umask semasa.

WordPress juga mempunyai fungsi yang sangat berguna wp_mkdir_p yang akan mencipta struktur direktori secara rekursif.

Sumber rujukan:-

Fungsi wp_mkdir_p($target) ( $wrapper = null; // tanggalkan protokol if(wp_is_stream($target)) ( list($wrapper, $target) = explode("://", $target, 2); ) // daripada php.net/mkdir pengguna menyumbang nota $target = str_replace("//", "/", $target); // letakkan semula pembalut pada sasaran if($wrapper !== null) ( $target = $wrapper . "://" . $target; ) // mod selamat gagal dengan garis miring di bawah versi PHP tertentu. $target = rtrim($target, "/"); // Gunakan rtrim() dan bukannya untrailingslashit untuk mengelakkan pergantungan pemformatan.php. if (kosong($target)) $target = "/"; if (file_exists($target)) return @is_dir($target); // Kita perlu mencari kebenaran folder induk yang wujud dan mewarisi itu. $target_parent = dirname($target); manakala ("." != $target_parent && ! is_dir($target_parent)) ($target_parent = dirname($target_parent); ) // Dapatkan bit kebenaran. if ($stat = @stat($target_parent)) ($dir_perms = $stat["mod"] & 0007777; ) else ($dir_perms = 0777; ) if (@mkdir($target, $dir_perms, true)) ( // Jika umask ditetapkan yang mengubah suai $dir_perms, kita perlu menetapkan semula $dir_perms dengan betul dengan chmod() jika ($dir_perms != ($dir_perms & ~umask())) ( $folder_parts = explode( "/", substr($target, strlen($target_parent) + 1)); untuk ($i = 1; $i<= count($folder_parts); $i++) { @chmod($target_parent . "/" . implode("/", array_slice($folder_parts, 0, $i)), $dir_perms); } } return true; } return false; }

Saya memerlukan perkara yang sama untuk tapak log masuk. Saya perlu membuat direktori dengan dua pembolehubah. Direktori $ ialah folder utama tempat saya ingin mencipta subfolder lain dengan nombor lesen pengguna.

Include_once("../include/session.php"); $lnum = $session->lnum; //Nombor lesen pengguna daripada sesi $directory = uploaded_labels; // Nama direktori yang folder sedang dibuat if (!file_exists($directory."/".$lnum)) ( mkdir($directory."/".$lnum, 0777, true); )

Sesuatu yang lebih generik kerana ia muncul di google. Walaupun butirannya lebih spesifik, tajuk soalan ini lebih generik.

/** * secara rekursif mencipta laluan direktori yang panjang */ 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)) ? mkdir($path) : false; )

Ini akan mengambil laluan dengan kemungkinan rangkaian panjang direktori yang belum dibuat dan terus bergerak ke atas satu direktori sehingga ia berakhir dalam direktori sedia ada. Ia kemudian akan cuba mencipta direktori seterusnya dalam direktori itu dan meneruskan sehingga semua direktori telah dibuat. Ia kembali benar jika berjaya.

Boleh dipertingkatkan dengan menyediakan tahap berhenti supaya ia gagal jika ia keluar dari folder pengguna atau sesuatu dan mendayakan kebenaran.

Untuk mencipta folder jika ia belum wujud

Pertimbangan isu alam sekitar.

  • WordPress.
  • Pelayan pengehosan web.
  • Dengan mengandaikan Linux tidak menjalankan PHP.

bool mkdir(rentetan $pathname[, int $mode=0777[, bool $recursive=FALSE[, sumber$konteks]]])

Manual menyatakan bahawa satu-satunya parameter yang diperlukan ialah $pathname !

jadi kita hanya boleh kod:

Penjelasan:

Kami tidak perlu menghantar sebarang parameter atau menyemak sama ada folder itu wujud atau bahkan parameter mod pemindahan jika perlu; sebab-sebab berikut:

  • Perintah itu akan mencipta folder dengan kebenaran 0755 (kebenaran lalai untuk folder awam) atau 0777, kebenaran lalai untuk arahan itu.
  • mod diabaikan dalam Hos Windows menjalankan PHP .
  • Perintah mkdir mempunyai semakan terbina dalam jika folder wujud; jadi kami hanya perlu menyemak untuk mengembalikan True | Salah; dan ini bukan ralat, ia hanya amaran, dan amaran dilumpuhkan pada pelayan pengehosan secara lalai.
  • Bergantung pada kelajuan ia lebih pantas jika amaran dilumpuhkan.

Ini adalah satu lagi cara untuk melihat soalan dan tidak menuntut penyelesaian terbaik atau optimum.

Diuji pada PHP7, Pelayan Pengeluaran, Linux

Anda juga boleh mencuba:

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

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

Cara yang lebih pantas untuk membuat folder:

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

awak buat

Printf("Hai %s,
", $nama);

sebelum memasang kuki, yang dilarang. Anda tidak boleh menghantar sebarang data sebelum pengepala, malah baris kosong.