最近有客户反应网站访问不了了,经检查发现是网站程序报SQL语句错误,错误代码如下:
Database error: Invalid SQL: select * from ew_cp_con_cn where userid=\\\\\'1\\\\\' and menuid=\\\\\'\\\\\' order by limit 0,10MySQL Error: 0 (db68441)Session halted.
因为这个是老产品上家已经停止售后,所以无法联系到上家进行处理,只能我们自己研究。SQL语句报错,第一时间想到的就是检查程序代码,但由于程序核心部分全部加密所以这条路是走不通的,只能另想其他的办法。经过一帆研究后发现此错误为PHP环境配置导致的,需要将php.ini中的全局变量打开,也就是将“register_globals = Off”修改为“register_globals = On”。这个是因为智能建站模板程序是基于PHP4环境下开发的,在变量参数接收时与现在的PHP5有一些不一样,这也是PHP版本的一个兼容性问题,以下引用网上资料说明:
当register_globals=Off的时候,下一个程序接收的时候应该用$_GET['user_name']和$_GET['user_pass']来接受传递过来的值。(注:当<form>;的method属性为post的时候应该用$_POST['user_name']和$_POST['user_pass'])
当register_globals=On的时候,下一个程序可以直接使用$user_name和$user_pass来接受值。
但如果在生产环境中将“register_globals = Off”修改为“register_globals = On”的话又会对服务器产生安全隐患,所以我们需要想其他办法来解决这个问题。最后找到一种方法,通过程序来模拟全局变量的控制。首先我们需要找到一个全局的配置文件,如智能建站模板程序中的db.php,然后在里面加入如下代码:
<?phpif ( !ini_get(\\\\\'register_globals\\\\\') ){ extract($_POST); extract($_GET); extract($_SERVER); extract($_FILES); extract($_ENV); extract($_COOKIE); if ( isset($_SESSION) ){ extract($_SESSION); }}?>;
这种方法经过测试几乎完全可用,但不排除会出现其他并发问题。
补充:
经过测试,目前发现用此方法会获取不到session或者cookie的值。会影响使用智能建站套餐多语言模板程序用户,问题表现:当网站默认语言为中文(英文)时,在访问网站过程中切换成英文(中文),再访问其他栏目又会回到以默认语言显示。为解决此问题,所以现在依然将成都网通90服务器上的php.ini全局变量配置修改为register_globals = On