0

オーケー、それで私は他のキャリアの興味を追求するためにウェブ開発から 1 年を取りました。ホスティング会社がサーバー上の PHP バージョンを更新したところ、split() が廃止されたため、日付変換関数を含むスクリプトがエラーをスローしていることがわかりました (1 年かかることを教えてくれます!)。

ここや他の場所を見回した後、preg_split()、explode()、strtotime() を使用する必要があることをさまざまに読みました。理論的には簡単に聞こえますが、それらを試してみると、日付の形式が間違っている (例: /--15/5/12) か、未定義のオフセット警告が表示されるか、スクリプトは動作しているように見えますが、確認が出力されます。更新が機能すると、恐ろしい 1-1-70 の日付が表示されるため、スクリプトが機能しないだけでなく、データベースに奇妙な空白のエントリがいくつかあり、合計が奇妙に加算されます (少なくとも、データベースは比較的簡単に見つけて修正できます)。エラー - とにかくサーバーパスワードをどこに置いたかを覚えたら!)。

split() エラーを非表示にできることはわかっていますが、それはベスト プラクティスではなく、本来の動作を試してみたいと思っています。問題のスクリプトは以下です。私の質問の短いバージョンは、このスクリプトを書き直して再び機能させるにはどうすればよいですか?

        <?php
        require_once('/home/thebooks/admins/connect.php');
        $id = stripslashes($_POST['id']);            
        $date = stripslashes($_POST['dateinput']); // get the data from the form
        $amountraised = stripslashes($_POST['amountraised']);  
        $comments = stripslashes($_POST['comments']); 
        // *** function dateconvert ***
        // dateconvert converts data from a variable (posted from a form or just stored) 
        // into a format mysql will be able to store and converting the 
        // database date back into the british standard of date month year.
        // The script accepts day.month.year or day/month/year or day-month-year. 
        // @param string $date - Date to be converted
        // @param string $func - which function is to be used (1 for input to mysql, 2 for output from mysql)    
        require_once('/home/thebooks/admins/connect.php');
        $id = stripslashes($_POST['id']);            
        $date = stripslashes($_POST['dateinput']); // get the data from the form
        $amountraised = stripslashes($_POST['amountraised']);  
        $comments = stripslashes($_POST['comments']); 
        // using type 1
        $date = dateconvert($date,1); // Would convert to e.g. 2005-12-19 which is the format stored by mysql
        function dateconvert($date,$func) {
        if ($func == 1){ //insert conversion
        list($day, $month, $year) = split('/-', $date); 
        $date = "$year-$month-$day"; 
        return $date;
        }
        if ($func == 2){ //output conversion
        list($year, $month, $day) = split('/-', $date); 
        $date = "$day/$month/$year"; 
        return $date;
          }
        }
        $update = "UPDATE fundraisingtotal SET date = '$date', amountraised = '$amountraised', comments = '$comments' WHERE id='$id' ";
        $result = mysql_query($update) or die(mysql_error());
        $realdate = dateconvert($date,2); // convert date to British date 
        if ($result) {
        echo "<p class=\"dbpara\">Thank you. Your update to the record was successful.</p>";
        echo "<p class=\"dbpara\">The record has been amended to a date of <b>$realdate</b> and amount of <b>$amountraised</b>. Comments: <b>$comments</b></p>";
        }
        else {
        echo "<p>Nothing has been changed.</p>";
        }
        mysql_close();
        ?>
4

3 に答える 3

1

PHP には、すばらしい日付/時刻ライブラリが組み込まれています。そっちを使った方がいいです。

また、時間をかけてSQL インジェクションについて学んでください。コードは最も単純な攻撃に対して非常に脆弱であるため、できるだけ早く修正してください。

于 2012-05-15T22:19:15.057 に答える
0

使用できませんでした:

$date = "01/12/2012"; 
echo date("dd/mm/yyyy", strtotime($date)); 

編集:

見られるように、このスレッドは次のとおりです。

日付形式の変換 yyyy-mm-dd => dd-mm-yyyy

于 2012-05-15T22:18:44.870 に答える
0

split非推奨ですが、そうでexplodeはありません。同じことを行いますが、式ではなく文字列を使用します (そうであれば、split実際にはわかりません)。もちろん、常にありpreg_splitます。

読み直したら使いたくなるようなpreg_split('#/|-#' ...

于 2012-05-15T22:16:14.300 に答える