4

ハイパーリンクを使用してデータベースを更新できるかどうか疑問に思っています。私の Web サイトで、ゲーム世界でのユーザーの位置を更新しようとしています。位置は数値で表されます。

元:

1 = キャンプ
2 = 町
3 = 森

そのために、PHP 関数を作成しました。

function updatePlayerLocation($location)
{
    mysql_query("UPDATE ss_character SET location='$location' WHERE id='".$_SESSION['id']."'");
}

この関数は、次に示すように、リンクの onClick 関数で呼び出されます。

echo "<a href=\"play.php?p=location_0\" onclick='updatePlayerLocation(0)'>" . $possibleLocations[0] . "</a><br />";

$possibleLocations 配列には、0 から 10 の範囲で、ユーザーがいることができるすべての場所が含まれています。

ページをロードするとリンクが機能するように見えますが、MySQL クエリは実行されません。私の以前の調査では AJAX の使用が提案されていましたが、ページを更新する必要があるため、代替手段があるかどうか疑問に思っています。

お時間とご提案をありがとうございました! :)

4

2 に答える 2

4

まず、入力を検証する必要があり、コードはSQL インジェクションに対して脆弱です。PHPでSQLインジェクションを防ぐ方法を確認してください。

mysql_*新しいコードで関数を使用しないでください。それらはもはや保守されておらず、公式に廃止されています。代わりに準備済みステートメントについて学び、 PDOまたはMySQLiを使用してください

それを念頭に置いて、まったく同じことを行う PDO スクリプトを次に示します。これはかなり長くなりますが、これは単なる例であるため、必要に応じてクラスとして使用できます。

<?php

// create connection to database
$conn = new PDO('mysql:dbname=DATABASE_NAME;host=localhost;port=3306', USERNAME, PASSWORD);

// prepare query
$pdo = $conn->prepare("UPDATE ss_character SET location = :location WHERE id = :session_id");

// set up parameters
$params = ['location' => (int)$_POST['location'], 'session_id' => $_SESSION['id']];

// loop through the paramaters to determine the type
foreach ($params as $key => $value) {

    switch ($value) {

        case is_int($value):
            $param = PDO::PARAM_INT;
            break;

        case is_bool($value):
            $param = PDO::PARAM_BOOL;
            break;

        case is_null($value):
            $param = PDO::PARAM_NULL;
            break;

        default:
            $param = PDO::PARAM_STR;
            break;
    }

    // bind paramter to query
    $pdo->bindValue(":$key", $value, $param);
}

// execute the query
$result = $pdo->execute($params);

// echo result for ajax
echo ($result) ? true : false;

そして、ページが強制的にリロードされないように、jQuery で ajax を実行する必要があります。

<script>

    function updatePlayerLocation(location) {

        // ensure location is numeric or stop
        if !isNaN(location) return false;

        // update location via ajax
        $.ajax({
            url: 'http://your_url/to/php/script.php',
            type: 'POST',
            data: 'location=' + location,
            success: function(data) {
                // log result to console for error trapping purposes
                console.log(data);
            }
        });

        // stop link from being processed
        return false;

    }

</script>

もちろん、HTML にはjQuery、上記のスクリプト、および少なくとも 1 つのリンクが含まれます。

<a href="#" onclick="return updatePlayerLocation(0);">Location name</a><br />
于 2013-02-25T03:03:13.713 に答える
1

ハイパーリンクをクリックすると、サーバー上で GET 要求が実行されます。既に get リクエストでパラメーターを送信しているため、PHP コードで次の操作を実行できます。

if(isset($_GET['p'])){ 
    $location = $_GET['p'];
    $number = preg_replace("/[^0-9]/", '', $location);
    updatePlayerLocation(intval($number));
}

これは Web ページが更新されるたびに実行されることに注意してください。そのため、上記のコードを別の PHP ページに配置し、前と同じパラメーターを渡して play.php にリダイレクトすることをお勧めします。

于 2013-02-25T03:02:47.610 に答える