从4.4到5.3.6的PHP版本更新破坏了网站

时间:2013-01-18 20:14:21

标签: php migration php4

以某种方式将网站移动到更新的服务器时,php代码崩溃了。我们确实首先在临时站点进行了测试,但它仍然破坏了。

列表的所有动态链接都不再有效。我有一个下一个按钮,除了更改网址外什么都不做。当您单击下一步时,它仍然显示第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 个答案:

答案 0 :(得分: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进行参数化查询将有助于保护您免受此攻击。
  5. 修复这些问题会使页面正常工作,但实际上你应该让某人从头开始重写。即使对于PHP 4,这段代码也让我觉得很不舒服。