2013-01-18 51 views
1

不知何故,当将站点移动到更新的服务器时,PHP代码崩溃了。我们确实先用一个临时网站进行了测试,但仍然爆发。PHP版本从4.4更新到5.3.6破解站点

上市的所有动态链接不再有效。我有一个下一个按钮,除了更改网址之外什么都不做。当你点击下一页时,它仍然显示第1页/共5页。我知道一些事情是正确的,因为在这个页面的顶部,它获取记录的数量并从数据库中显示出来。

我听说过这个代码是旧的,一个新的网站正在完成,所以我需要做的就是修复错误。我不需要重新整个页面,因为这会浪费时间。无论如何,他们将在接下来的几个月内将其淘汰。

我更喜欢.NET开发人员,所以我甚至不确定如何错误检查PHP网站。这里是破解的代码和定义这些变量的函数。

<?php 
echo "<br>\n"; 
echo "<strong>"; 
if($page_num > 1) { 
    $prev_page = $cur_page - 1; 
    echo "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"; 
    echo "<A HREF=\"$PHP_SELF?action=list_records&sort_order=$org_sort_order&order_by=$order_by&cur_page=$prev_page$search_link\">&lt;&lt; Previous</A>\n"; 
} 
if($page_num < $total_num_page) { 
    $next_page = $cur_page + 1; 
    $last_page = $total_num_page - 1; 
    echo "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"; 
    echo "<A HREF=\"$PHP_SELF?action=list_records&sort_order=$org_sort_order&order_by=$order_by&cur_page=$next_page$search_link\">Next &gt;&gt;</A>"; 
} 
echo "</strong>"; 
?> 



function list_records() {global $tbl_units, $tbl_members; 
global $unit_array, $location_array; 
global $default_sort_order, $default_order_by, $records_per_page; 
global $sort_order, $order_by, $cur_page, $search_db, $search_txt, $search_link; 
global $PHP_SELF; 

$query = "SELECT count(*) FROM $tbl_units 
        INNER JOIN $tbl_members ON $tbl_units.memberid = $tbl_members.username 
        WHERE $tbl_members.status = 'Active' AND $tbl_units.status = 'Available' $search_db"; 
$result = mysql_query($query); 
if(!$result) error_message(sql_error()); 

$query_data = mysql_fetch_row($result); 
$total_num_user = $query_data[0]; 
$page_num = $cur_page + 1; 
$total_num_page = $last_page_num 
       = ceil($total_num_user/$records_per_page); 

if($total_num_user > 0) { 
    echo "<CENTER><H3>$total_num_user unit(s) found. "; 
    echo "Displaying the page $page_num out of $last_page_num.</H3></CENTER>\n"; 
} else { 
    echo "<CENTER><div class='vacancy'>No vacancies at this time!</div></CENTER>\n"; 
} 

if(!empty($search_txt)) echo $search_txt; 

if(empty($order_by)) { 
    $order_by_str = "ORDER BY $default_order_by"; 
    $order_by = $default_order_by; 
} 
else $order_by_str = "ORDER BY $order_by"; 

if(empty($sort_order)) { 
    $sort_order_str = $org_sort_order = $default_sort_order; 
    $hold_order = $sort_order; 
    $sort_order = 'DESC'; 
} 
else { 
    $sort_order_str = $org_sort_order = $sort_order; 
    $hold_order = $sort_order; 
    if($sort_order == 'DESC') $sort_order = 'ASC'; 
    else $sort_order = 'DESC'; 
} 

if(empty($cur_page)) { 
    $cur_page = 0; 
} 

$limit_str = "LIMIT ". $cur_page * $records_per_page . ", $records_per_page"; 
$query = "SELECT $tbl_units.* FROM $tbl_units 
        INNER JOIN $tbl_members ON $tbl_units.memberid = $tbl_members.username 
        WHERE $tbl_members.status = 'Active' AND $tbl_units.status = 'Available' $search_db 
        $order_by_str $sort_order_str $limit_str"; 
$result = mysql_query($query); 
if(!$result) error_message(sql_error()); 

如果有人能帮助我弄清楚如何让我的链接工作,我会非常感激!我在这里和那里尝试了几件事,但我无法让页面重定向到结果的下一页。

+1

“我更像是一名.NET开发人员,所以我甚至不确定如何错误检查PHP网站。”找到在站点的php.ini文件中定义的PHP错误日志(php_error.log)。 – Grambot

+1

旧网站是否有'register_globals'?在旧服务器和新服务器上新建一个只包含'<?php phpinfo();'的新'info.php'文件,在浏览器中打开它,比较差异。 (在这个输出中,你还会发现一个名为'error_log'的指令,它将指定错误记录的位置,TheCpan在上面提到的错误。) – DCoder

+1

添加'error_reporting(-1); ini_set('display_startup_errors',1); ini_set('display_errors',1);'在文件的开头并重新加载页面,如果没有错误,至少应该得到一个警告。 –

回答

1

为了说明这一点,你应该明白:这就像拿一个.NET 1.0网站并将其打入.NET 4.5环境。 [可能更糟]

有些东西被打破它:

  1. IIRC $PHP_SELF不久前已被废弃,$_SERVER['PHP_SELF']应该是等价的,但应该这样,除非你喜欢XSS攻击中使用。
  2. 所有这些全局变量声明让我很难过。
  3. #2中的所有内容以及正在生成的网址都让我相信这个脚本是由register_globals = On创建的,这个脚本是非常不安全的,应该修复。 [默认Off,因为至少5.0,并且应该从不开启。]使用$ _GET和/或$ _POST超全局数组和验证您的输入
  4. 除了mysql_ *函数正在被弃用的过程中,您使用它们的方式让您可以开放SQL注入。使用mysqli或PDO进行参数化查询将有助于保护您免受此影响。

解决这些问题,将使网页正常工作,但实际上你应该让别人从头开始重写它。即使对于PHP 4,此代码也让我感觉非常棒。

+0

不要担心,这个网站不会长久。稍后会进行重新设计。 :)我没有写,我只是打电话来解决它。叹。我会记下你的笔记并继续工作。谢谢! – jlg