4

我想知道是否可以使用超链接更新数据库。在我的网站上,我正在尝试更新用户在游戏世界中的位置。位置由数值表示。

前任:

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 injection是脆弱的。检查如何防止 PHP 中的 SQL 注入?

请不要mysql_*在新代码中使用函数。它们不再被维护并被正式弃用。改为了解准备好的语句,并使用PDOMySQLi

所以考虑到这一点,这里有一个 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来做你的ajaxing,这样页面就不会被迫重新加载

<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、上面的脚本和至少一个链接:

<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));
}

请注意,这将在每次刷新网页时运行,因此建议将上述代码放在另一个 PHP 页面中,然后使用与之前传递的相同参数重定向到 play.php。

于 2013-02-25T03:02:47.610 回答