2013-02-25 52 views
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,但是当页面需要刷新时,我想知道是否有其他选择。

谢谢你的时间和建议! :)

+2

注意SQL注入攻击! – 2013-02-25 02:06:18

+0

'updatePlayerLocation'是服务器上运行的PHP函数。你不能用JavaScript调用它。你必须用'play.php'脚本来调用它# – 2013-02-25 02:07:20

+0

@BrianGenisio我熟悉mysql_real_escape_string,但我没有看到我可以如何应用这种情况。 SQL的哪部分是不安全的? – 2013-02-25 02:12:59

回答

4

首先,您需要验证输入并且您的代码可以运行到sql injection。检查How to prevent SQL injection in PHP?

Please, don't use mysql_* functions in new code。他们不再维护and are officially deprecated。了解prepared statements代替,并用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 /> 
+0

谢谢!接受答案! – 2013-02-25 18:15:24

1

通过单击超链接,您正在服务器上执行GET请求。正如你已经发送您的GET请求参数,你可以做你的PHP代码如下:

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

注意,这将每次运行的网页被刷新,所以它可能是明智的,上述代码放入另一个PHP页面,然后重新指向play.php,其参数与以前一样传递。