以下代码是test.php,我在同级目录下建立一个book_txt7目录,并设置为了777权限,目录可以建立成功<?php$base_dir="book_txt7";  //定义目录名if(file_exists($base_dir)){ 
     echo $base_dir."文件夹已经存在!";
 chmod($base_dir,0777);
   }else{
     echo $base_dir."文件夹不存在!";
     if(mkdir($base_dir,0777)){
         echo $base_dir."文件夹创建成功!"; 
     }  
   }
?> 但是我把$base_dir变量修改为book_txt7/200905,也就是在刚建立的目录下面再建立一个200905目录,就出错了。
错误提示是:Warning: mkdir() [function.mkdir]: SAFE MODE Restriction in effect. The script whose uid is 28546 is not allowed to access /www/freehost.com/m/o/p/tom2000/htdocs/book_txt7 owned by uid 2001我是想建立的目录200905也应该有777权限,因为我要往里面写入TXT类型的文本文件等,但是连目录也不能建立啊。系统环境是:
Linux 
php的safe_mode为 On 
请问各位如何能够实现呢,依次建两层目录,然后能够往里面写入文件啊?

解决方案 »

  1.   

    需要说明一下:
    我是没有服务器管理权限的,所以配置linux那些都不能做
      

  2.   

    安全模式的问题,可以尝试用ftp的方式去建立目录。我自己就是虚拟主机的代理商,做了差不多8年的代理了。有些主机开启了安全模式,不过ftp方式可以建立目录。被安全模式限制或屏蔽的函数,以下安全模式列表可能不完整或不正确。  下表显示 安全模式限制函数dbmopen()

      将检查您将要操作的文件/目录与正在执行的脚本是否有相同的 UID。
    dbase_open()

      将检查您将要操作的文件/目录与正在执行的脚本是否有相同的 UID。
    filepro()

      将检查您将要操作的文件/目录与正在执行的脚本是否有相同的 UID。
    filepro_rowcount()

      将检查您将要操作的文件/目录与正在执行的脚本是否有相同的 UID。
    filepro_retrieve()

      将检查您将要操作的文件/目录与正在执行的脚本是否有相同的 UID。
    ifx_*()

      sql_safe_mode 限制, (!= safe mode)
    ingres_*()

      sql_safe_mode 限制, (!= safe mode)
    mysql_*()

      sql_safe_mode 限制, (!= safe mode)
    pg_loimport()

      将检查您将要操作的文件/目录与正在执行的脚本是否有相同的 UID。
    posix_mkfifo()

      将检查您将要操作的目录和正在执行的脚本是否有相同的 UID。
    putenv()

      遵循 ini 设置的 safe_mode_protected_env_vars 和 safe_mode_allowed_env_vars 选项。请参考 putenv() 函数的有关文档。
    move_uploaded_file()

      将检查您将要操作的文件/目录与正在执行的脚本是否有相同的 UID。
    chdir()

      将检查您将要操作的目录和正在执行的脚本是否有相同的 UID。
    dl()

      该函数在安全模式中已被屏蔽。
    backtick operator

      该函数在安全模式中已被屏蔽。
    shell_exec()

      (在功能上和 backticks 函数相同) 该函数在安全模式中已被屏蔽。
    exec()

      您只能在 safe_mode_exec_dir 设置的目录下进行执行操作。基于某些原因,目前不能在可执行对象的路径中使用。
    system()

      您只能在 safe_mode_exec_dir 设置的目录下进行执行操作。基于某些原因,目前不能在可执行对象的路径中使用。
    passthru()

      您只能在 safe_mode_exec_dir 设置的目录下进行执行操作。基于某些原因,目前不能在可执行对象的路径中使用。
    popen()

      您只能在 safe_mode_exec_dir 设置的目录下进行执行操作。基于某些原因,目前不能在可执行对象的路径中使用。
    mkdir()

      将检查您将要操作的目录和正在执行的脚本是否有相同的 UID。
    rmdir()

      将检查您将要操作的文件/目录与正在执行的脚本是否有相同的 UID。
    rename()

      将检查您将要操作的文件/目录与正在执行的脚本是否有相同的 UID。 将检查您将要操作的目录和正在执行的脚本是否有相同的 UID。
    unlink()

      将检查您将要操作的文件/目录与正在执行的脚本是否有相同的 UID。 将检查您将要操作的目录和正在执行的脚本是否有相同的 UID。
    copy()

      将检查您将要操作的文件/目录与正在执行的脚本是否有相同的 UID。 将检查您将要操作的目录和正在执行的脚本是否有相同的 UID。 (on source and target)
    chgrp()

      将检查您将要操作的文件/目录与正在执行的脚本是否有相同的 UID。
    chown()

      将检查您将要操作的文件/目录与正在执行的脚本是否有相同的 UID。
    chmod()

      将检查您将要操作的文件/目录与正在执行的脚本是否有相同的 UID。 另外,您不能设置 SUID、SGID 和 sticky bits
    touch()

      将检查您将要操作的文件/目录与正在执行的脚本是否有相同的 UID。 将检查您将要操作的目录和正在执行的脚本是否有相同的 UID。
    symlink()

      将检查您将要操作的文件/目录与正在执行的脚本是否有相同的 UID。 将检查您将要操作的目录和正在执行的脚本是否有相同的 UID。 (注意:仅测试 target)
    link()

      将检查您将要操作的文件/目录与正在执行的脚本是否有相同的 UID。 将检查您将要操作的目录和正在执行的脚本是否有相同的 UID。 (注意:仅测试 target)
    getallheaders()

      在安全模式下,以“authorization”(区分大小写)开头的头信息将不会被返回。警告:getallheaders() 无法在 aol-server 下实现!
    header()

      在安全模式下,如果您设置了 WWW-Authenticate,当前脚本的 uid 将被添加到该头信息的 realm 部分。
    highlight_file(), show_source()

      将检查您将要操作的文件/目录与正在执行的脚本是否有相同的 UID。 将检查您将要操作的目录和正在执行的脚本是否有相同的 UID。 (注意,仅在4.2.1版本后有效)
    parse_ini_file()

      将检查您将要操作的文件/目录与正在执行的脚本是否有相同的 UID。 将检查您将要操作的目录和正在执行的脚本是否有相同的 UID。 (注意,仅在 4.2.1 版本后有效)

      任何使用 php4/main/fopen_wrappers.c 的函数 
      

  3.   

    如果不想用ftp模式,那么换一个主机吧。
      

  4.   

    个人觉得应该是可以的但你不能这么建,book_txt7/200905你可以在book_txt7下建200905
    或者给全路径建
    如果book_txt7不存在,则要加递归参数一次创建多级目录,否则出错
      

  5.   

     肯定是可行的,除非这函数被禁用了 (chmod mkdir)
    $base_dir="book_txt7";  //定义目录名if(file_exists($base_dir))
    {
        echo $base_dir."文件夹已经存在!";
        chmod($base_dir,0777);
    }
    else
    {
        echo $base_dir."文件夹不存在!";
        mkdir($base_dir,0777);
        echo $base_dir."文件夹创建成功!"; 
    }
      

  6.   


    晕, safe_mode 为 On 的话,  好像是吧 chmod 给禁掉了!  这个的话,就不好说了  
      

  7.   

    mkdir()  将检查您将要操作的目录和正在执行的脚本是否有相同的 UID。 2楼说了只是检查,一般虚拟主机均是分用户的,那个空间的uid应该就是你或者你手动改一下所有PHP程序的uid
      

  8.   

    你把book_txt7修改成book_txt7/200905,在建立文件来200905之前你得先判断book_txt7目录是否存在,如果book_txt7不存在,想同时建立两个目录就会报你上面的错误.
    //first 
    $base_dir="book_txt7";  //定义目录名 if(file_exists($base_dir)){ 
      chmod($base_dir,0777); 
      }else{ 
        if(mkdir($base_dir,0777);
      } 
    //secodn
    $base_dir2 = "book_txt7/200905";
    if(file_exists($base_dir2))
    {
        echo $base_dir2."文件夹已经存在!";
        chmod($base_dir2,0777);
    }
    else
    {
        echo $base_dir2."文件夹不存在!";
        mkdir($base_dir2,0777);
        echo $base_dir2."文件夹创建成功!"; 
    }