我想知道是否可以用超链接更新数据库。在我的网站上,我试图更新用户在游戏世界中的位置。位置用数值表示。
例如:
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,但由于页面需要刷新,我想知道是否有其他选择。
感谢您的时间和建议!:(
首先,您需要验证输入,并且您的代码可用于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来帮你调整,这样页面就不会被迫重新加载
<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 />
通过单击超链接,您正在服务器上执行GET请求。由于您已经在get请求中发送了一个参数,因此可以在PHP代码中执行以下操作:
if(isset($_GET['p'])){
$location = $_GET['p'];
$number = preg_replace("/[^0-9]/", '', $location);
updatePlayerLocation(intval($number));
}
请注意,每次刷新网页时都会运行此程序,因此建议将上述代码放在另一个PHP页面中,然后使用与以前相同的参数重新定向到play.PHP。