分享

ECSHOP 源码分析(install/index.php2)

 quasiceo 2014-05-03


(2010-09-25 18:06:23)作者:飞机
/*------------------------------------------------------ */
//-- 设置数据库账号
/*------------------------------------------------------ */
case 'database' :
   if (file_exists(ROOT_PATH . 'data/config.php'))
   {
       include_once(ROOT_PATH . 'data/config.php');
   }
   else
   {
       $db_host = 'localhost';
       $db_name = 'ecshop';
       $db_user = 'root';
       $db_pass = '';
       $prefix = 'ecs_';
   }
   include_once(ROOT_PATH . 'install/inc_goods_type_'.$selected_lang.'.php');
   $goods_type = '';
   $n = 0;
   foreach ($attributes AS $key=>$val)
   {
       $goods_type .= ' <input type="checkbox" name="goods_type[]" value="' .$key. '" checked="true" /> '. $lang[$key];
       $n ++;
       if ($n >= 4)
       {
           $goods_type .= "<br />";
           $n = 0;
       }
   }
 
 break;
/*------------------------------------------------------ */
//-- 安装测试数据,填写管理员账号
/*------------------------------------------------------ */
case 'administrator' :
 $db_host   = trim($_POST['db_host']);
   $db_name   = trim($_POST['db_name']);
   $db_user   = trim($_POST['db_user']);
   $db_pass   = trim($_POST['db_pass']);
   $prefix    = trim($_POST['db_prefix']);
 include_once(ROOT_PATH . "includes/adodb/adodb.inc.php");
   $connect_success = true;
   /* 测试数据库联接 */
   if (http://blog.sina.com.cn/s/mailto:!@mysql_connect($db_host, $db_user, $db_pass))
   {
       $step = 'message';
       $message = $lang['connect_failed'];
       $connect_success = false;
   }
   else
   {
       $mysql_ver = mysql_get_server_info();
   
       if (http://blog.sina.com.cn/s/mailto:!@mysql_select_db($db_name))
       {
           $query = ($mysql_ver > '4.1') ? "CREATE DATABASE $db_name DEFAULT CHARACTER SET utf8" : "CREATE DATABASE $db_name";
   
           if (!mysql_query($query))
           {
               $step = 'message';
               $message = $lang['select_db_failed'];
               $connect_success = false;
           }
       }
   }
 @mysql_close();
 /* 初始化数据库类 */
 if($connect_success)
 {
 $db = &NewADOConnection('mysql');
 if(!$db->Connect($db_host, $db_user, $db_pass, $db_name))
 {
           $step = 'message';
           $message = $db->ErrorMsg();
           $connect_success = false;
 }
 $db->query("SET NAMES utf8");
 }
   if ($connect_success)
   {
       /* 写入配置文件 */
       $configfile = "<?" ."phpn";
       $configfile .= "// database hostn";
       $configfile .= "$db_host  = '$db_host';nn";
       $configfile .= "// database namen";
       $configfile .= "$db_name  = '$db_name';nn";
       $configfile .= "// database usernamen";
       $configfile .= "$db_user  = '$db_user';nn";
       $configfile .= "// database passwordn";
       $configfile .= "$db_pass  = '$db_pass';nn";
       $configfile .= "// table prefixn";
       $configfile .= "$prefix   = '$prefix';n";
       $configfile .= '?'.'>';
/********************************************************
fopen(PHP 3, PHP 4 , PHP 5)
fopen -- 打开文件或者 URL
说明
resource fopen ( string filename, string mode [, int use_include_path [, resource zcontext]])
fopen() 将 filename 指定的名字资源绑定到一个流上。如果 filename 是 "scheme://..." 的格式,则被
当成一个 URL,PHP 将搜索协议处理器(也被称为封装协议)来处理此模式。如果该协议尚未注册封装协议,
PHP 将发出一条消息来帮助检查脚本中潜在的问题并将 filename 当成一个普通的文件名继续执行下去。
如果 PHP 认为 filename 指定的是一个本地文件,将尝试在该文件上打开一个流。该文件必须是 PHP 可以
访问的,因此需要确认文件访问权限允许该访问。如果激活了 安全模式或者 open_basedir 则会应用进一步的限制。
如果 PHP 认为 filename 指定的是一个已注册的协议,而该协议被注册为一个网络 URL,PHP 将检查并确认
allow_url_fopen 已被激活。如果关闭了,PHP 将发出一个警告,而 fopen 的调用则失败。
注: 所支持的协议列表见附录 L。某些协议(也被称为 wrappers)支持 context 和 php.ini 选项。参见相
应的页面哪些选项可以被设定。(也就是 php.ini 的值 user_agent 用在 http 协议中。)有关 contexts 和
zcontext 参数的说明,参见 参考 CXII, Stream Functions。
mode 参数指定了所要求到该流的访问类型。可以是以下:
表格 1. fopen() 中的 mode 的可能值列表
mode 说明
'r' 只读方式打开,将文件指针指向文件头。 
'r+' 读写方式打开,将文件指针指向文件头。 
'w' 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。 
'w+' 读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。 
'a' 写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。 
'a+' 读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。 
'x' 创建并以写入方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE,
并生成一条 E_WARNING 级别的错误信息。如果文件不存在则尝试创建之。这和给 底层的 open(2) 系统调用指定
O_EXCL|O_CREAT 标记是等价的。此选项被 PHP 4.3.2 以及以后的版本所支持,仅能用于本地文件。 
'x+' 创建并以读写方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE,
并生成一条 E_WARNING 级别的错误信息。如果文件不存在则尝试创建之。这和给 底层的 open(2) 系统调用指定
O_EXCL|O_CREAT 标记是等价的。此选项被 PHP 4.3.2 以及以后的版本所支持,仅能用于本地文件。 
注: 不同的操作系统家族具有不同的行结束习惯。当你写入一个文本文件并想插入一个新行时,你需要使用符合
你操作系统的行结束符号。基于 Unix 的系统使用 n 作为行结束字符,基于 Windows 的系统使用 rn 作为行
结束字符,基于 Macintosh 的系统使用 r 作为行结束字符。
如果写入文件时使用了错误的行结束符号,则其它应用程序打开这些文件时可能会表现得很怪异。
Windows 下提供了一个文本转换标记('t')可以透明地将 n 转换为 rn。与此对应你还可以使用 'b' 来强制
使用二进制模式,这样就不会转换你的数据。要使用这些标记,要么用 'b' 或者用 't' 作为 mode 参数的最后一个字符。
默认的转换模式依赖于 SAPI 和你使用的 PHP 版本,因此为了便于移植鼓励你总是指定恰当的标记。当操作以 n
作为行结束定界符的纯文本文件时,如果你还期望这些文件可以用于其它应用程序例如 Notepad,则应该在脚本中使用
 't' 模式。在所有其它情况下使用 'b'。
在操作二进制文件时如果没有指定 'b' 标记,可能会碰到一些奇怪的问题,包括坏掉的图片文件以及关于 rn 字符的奇怪问题。
为移植性考虑,强烈建议在用 fopen() 打开文件时总是使用 'b' 标记。
再一次,为移植性考虑,强烈建议你重写那些依赖于 't' 模式的代码使其使用正确的行结束符并改成 'b' 模式。
自 PHP 4.3.2 起,对所有区别二进制和文本模式的平台默认模式都被设为二进制模式。如果你在升级后脚本碰到问题,
尝试暂时使用 't' 标记,直到所有的脚本都照以上所说的改为更具移植性以后。
如果也需要在 include_path 中搜寻文件的话,可以将可选的第三个参数 use_include_path 设为 '1' 或 TRUE。
如果打开失败,本函数返回 FALSE。
例子 1. fopen() 例子
<?php
$handle = fopen ("/home/rasmus/file.txt", "r");
$handle = fopen ("/home/rasmus/file.gif", "wb");
$handle = fopen ("http://www./", "r");
$handle = fopen ("http://blog.sina.com.cn/s/ftp://user:password@/somefile.txt", "w");
?> 
 
如果在用服务器模块版本的 PHP 时在打开和写入文件上遇到问题,记住要确保所使用的文件是服务器进程所能够访问的。
在 Windows 平台上,要小心转义文件路径中的每个反斜线,或者用斜线。
<?php
$handle = fopen ("c:\data\info.txt", "r");
?> 
参见附录 L,fclose(),fgets(),fread(),fwrite(),fsockopen(),file(),file_exists(),
is_readable(),stream_set_timeout() 和 popen()。
********************************************************/
       $fp = fopen(ROOT_PATH . 'data/config.php', 'wb+');
 if (!$fp)
 {
  $step = 'message';
           $message = $_LANG['open_config_error'];
 }
       fwrite($fp, trim($configfile));
       fclose($fp);
/***************************************
set_time_limit
配置该页最久执行时间。
语法: void set_time_limit(int seconds);
返回值: 无
函数种类: PHP 系统功能
内容说明
本函数用来配置该页最久执行时间。默认值是 30 秒,在 php.ini
 中的 max_execution_time 变量配置,若配置为 0 则不限定最久时间。
 当执行到该函数时,才开始计算。例如,若默认是 30 秒
,而在执行到该函数前已执行了 25 秒,而用本函数改为 20 秒,
则该页面最长执行时间为 45 秒。
***************************************/
       /* 安装数据库 */
       @set_time_limit(120);
       
       $arr_files[] = 'structure.sql';
       $arr_files[] = 'data_'.$selected_lang.'.sql';
       if (isset($_POST['install_demo']) && $_POST['install_demo'] == 1)
       {
           // 测试数据
           $arr_files[] = ROOT_PATH . 'install/demo/demo_'.$selected_lang.'.sql';
           // 复制图片
           if (!file_exists(ROOT_PATH . 'images/200609'))
           {
               mkdir(ROOT_PATH . 'images/200609');
               chmod(ROOT_PATH . 'images/200609', 0777);
           }
           if (!file_exists(ROOT_PATH . "images/200609/"))
  {
    $step = 'message';
                $message = $_LANG['safe_mode_on3'];
  }
  
  $dir = opendir(ROOT_PATH . 'install/demo/200609') ;
           while ($file = @readdir($dir))
           {
               if (is_file(ROOT_PATH . 'install/demo/200609/'. $file))
               {
                   copy(ROOT_PATH . 'install/demo/200609/'. $file, ROOT_PATH . 'images/200609/'.$file);
                   chmod(ROOT_PATH . 'images/200609/'.$file, 0777);
               }
           }
           closedir($dir);
 }
       foreach ($arr_files AS $key=>$file)
       {
           if (!file_exists($file))
           {
               continue;
           }
           $arr_file = array_filter(file($file), "remove_comment");
           $sql_file = str_replace(" `ecs_", ' `'.$prefix, implode('', $arr_file));
           $sql_file = str_replace("r", '', $sql_file);
  if($mysql_ver > '4.1')
  {
    $sql_file  = str_replace("TYPE=MyISAM", 'ENGINE=MyISAM DEFAULT CHARSET=utf8', $sql_file);
  }
          
           $sql_arr   = explode(";n", $sql_file);
           foreach ($sql_arr AS $key=>$sql)
           {
   if (empty($sql))
               {
                   continue;
               }
               if (!$db->query($sql))
               {
                   $step = 'message';
                   $message = $db->ErrorMsg(). "<br /><br />" .$sql;
                   break;
               }
           }
           if ($step == 'message')
           {
               break;
           }
       }
       if (isset($_POST['goods_type']) && $step!='message')
       {
           include_once (ROOT_PATH . 'install/inc_goods_type_' . $selected_lang . '.php');
           foreach ($attributes AS $key=>$val)
           {
               if (!in_array($key, $_POST['goods_type']))
               {
                   continue;
               }
               $db->query($val['cat']) or die($db->ErrorMsg()."<br />".$val['cat']);
               $cat_id = $db->Insert_ID();
               $attr_query = str_replace("{cat_id}", $cat_id, $val['attr']);
               $db->query($attr_query) or die($db->ErrorMsg()."<br />".$attr_query);
           }
       }
   }

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多