0

mysqlとphpの初心者

サイトの各ページのヒット カウンターと、すべてのページとヒットを一覧表示するプライベート ページがあります。すべてのページをゼロにリセットするボタンがあり、各ページ リストの横に、各ページを個別にリセットするリセット ボタンがあります。これはすべてテキスト ファイルを使用していましたが、現在は mysql データベースに切り替えています。「RESET ALL」ボタンが機能するようにコーディングしましたが、個々のページ ボタンを機能させることができません。

処理コードは次のとおりです。

    if($_POST[ind_reset]) {
$ind_reset = $_POST[ind_reset];
mysql_connect("server", "username", "password") or die(mysql_error()); 
 mysql_select_db("database") or die(mysql_error());
    $sql = 'UPDATE counters SET Hits =\'0\' WHERE Page = \'$ind_reset\';';
      }

HTML フォーム コードは文字列です。

$page_reset = "<form id='Reset' action='counter_update.php' method='post'>
    <button type='submit' name='ind_reset' value='$formPage'>RESET</button>
    </form>";
4

1 に答える 1

0

最初のことから始めましょう:

if($_POST[ind_reset]) {

する必要があります

if($_POST['ind_reset']) {

PHP がエラーを黙って修正しているため、引用符なしで動作します。エラー報告を E_ALL にすると、エラー メッセージが表示されます。

考慮しなければならないことの 1 つは、POST データが想定どおりであるとは決して信頼できないということです。多分あなたはタイプミスをしました。ハッカーが偽の POST データを送信している可能性があります。いずれにせよ、そのデータベースの更新に間違ったものが入れられると、コードが台無しになります。このため、単純にその POST 値をデータベースにプラグインするのではなく、値が有効であることを確認するチェッカーが必要です。このようなことを行うとき、可能な値の配列を作成し、データベースへの更新または挿入時にそれらの値のみを使用します。例:

$pages = array('value_on_page'=>'value_put_in_database', 
               'xyz'=>'thing_in_database_2');
//the valid things to post are either 'value_on_page' or 'xyz',
//but what goes into the database are the values those keys point to
//e.g. if $_POST['ind_reset'] == 'xyz', $ind_reset will be 'thing_in_database_2'

$key = $_POST['ind_reset'];
if(!isset($pages[$key])) {  
    //if that posted value isn't a key in the array, it's bad
    error_log('Invalid posted page'.$key);
} else {
    //this is a valid posted page
    $ind_reset = $pages[$key]; 

    //** do the database stuff right here in this spot **//
}

さて、投稿したコードが機能しないという理由で、データベース クエリを実行する最後の重要な部分、つまり実際にクエリを実行する部分が欠けています。

    $conn = mysql_connect("server", "username", "password") or error_log(mysql_error()); 
    mysql_select_db("database") or error_log(mysql_error());
    $sql = 'UPDATE counters SET Hits =\'0\' WHERE Page = \'$ind_reset\';';
    mysql_query($sql, $conn) or error_log(mysql_error());

「die」を「error_log」に置き換えたことにお気づきでしょうか。error_log(mysql_error(), 1, 'youremail@example.com') を実行すると、メールで送信されます。それ以外の場合は、私の例のように、システムのエラー ログ ファイルがどこにでも置かれます。その後、データベース エラーの優れた履歴を保持できるため、必然的に StackOverflow に戻ってさらに質問をするときに、何が起こっているのかを正確に伝えることができます。ファイルを使用する場合は、エラー ログ ファイルの名前をローテーションするか (私はその日の日付に従って名前を付けています)、定期的にクリアするようにしてください。

コメントに投稿した mysqli コードを使用することは、mysql_* 関数よりも優れたアイデアですが、完全には正しくありません。「bind_param」部分は、変数を疑問符のある場所に貼り付けます。変数が文字列の場合は "s" を最初に置き、整数の場合は "i" を最初に置きます。

    $db = new mysqli("server", "username", "password", "database");
    if(!$db->connect_errno) {
        $stmt = $db->prepare("UPDATE counters SET Hits = '0' where Page = ?");  
        $stmt->bind_param('s',$ind_reset); //assuming $ind_reset is a string
        if(!$stmt->execute()) {
            error_log($stmt->error);
        }
        $stmt->close();
    } else {
        error_log($db->connect_error);
    }
    $db->close();
于 2013-04-02T20:49:45.340 に答える