1

どういうわけか、サイトを新しいサーバーに移動すると、phpコードが壊れました。最初に一時的なサイトでテストしましたが、それでも壊れました。

リストの動的リンクはすべて機能しなくなりました。URLを変更する以外に何もしない次のボタンがあります。[次へ]をクリックすると、引き続き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());

誰かが私のリンクを機能させる方法を理解するのを手伝ってくれるなら、私はそれを本当に感謝します!私はあちこちでいくつかのことを試しましたが、結果の次のページにリダイレクトするページを取得できません。

4

1 に答える 1

1

これを理解できる言葉で言えば、これは.NET1.0サイトを.NET4.5環境に叩き込むようなものです。[おそらくもっと悪い]

それを壊しているいくつかのこと:

  1. IIRC$PHP_SELFはかなり前に非推奨になりました$_SERVER['PHP_SELF']。同等である必要がありますが、XSS攻撃が好きでない限り、このように使用しないでください
  2. これらのグローバル変数宣言はすべて私を悲しませます。
  3. #2のすべてと生成されているURLから、このスクリプトはで作成されregister_globals = Onたと思います。これは非常に安全ではないため、修正する必要があります。[Off少なくとも5.0以降、デフォルトでオンにしないでください。] $_GETおよび/または$_POSTスーパーグローバル配列を使用して、入力を検証します
  4. mysql_ *関数が非推奨になる過程にあることを除けば、それらを使用する方法により、SQLインジェクションに対して広くオープンになります。mysqliまたはPDOを使用したパラメーター化されたクエリは、これからユーザーを保護するのに役立ちます。

これらの問題を修正すると、ページは機能しますが、実際には、誰かに最初から書き直してもらう必要があります。PHP 4の場合でも、このコードを使用すると、すべてがぎこちなく感じられます。

于 2013-01-18T21:56:40.057 に答える