xNeyte 给了你一些很好的建议,但我觉得你 - Xrin - 对使用 PHP 或类似的编程数据库内容完全陌生?
所以一步一步来:
MYSQL 数据库应该使用两种连接类型之一进行连接 - PDO 和 MySQLi_ 。 MySQL 数据库也将始终使用本机 MySQL 工作,但正如 xNeyte 已经提到的 - 这已被弃用并且强烈建议。
所以你所拥有的是你将你的信息传递给 PHP 页面,所以你的游戏列表在 index.php 上,你的工作页面将更新订购的游戏数量将是 update.php,在这个例子中。
Index.php 文件通过锚链接和$_GET 值(尽管我强烈建议使用php FORM 和$_POST 作为更好的选择)传递到update.php 页面,该页面需要执行以下操作(大致按这个顺序)工作:
Update.php
因此,我们将逐步介绍以下部分:
我会很痛苦并使用 MySQLi 而不是 PDO - xNeyte 在他给你的回答中使用了 PDO 语法,这是完全正确的,并且比 MySQLi 更好,为了清楚起见和你对 MySQL 本机的了解,它可能更容易查看/了解 MySQLi 发生了什么。
第 1 部分:
连接到数据库。
这应该通过面向对象的类来完成,
class database {
private $dbUser = "";
private $dbPass = ""; //populate these with your values
private $dbName = "";
public $dbLink;
public function __construct() {
$this->dbLink = new mysqli("localhost", $this->dbUser, $this->dbPass, $this->dbName);
}
if (mysqli_connect_errno()) {
exit('Connect failed: '. mysqli_connect_error());
}
if ( ! $this->dbLink )
{
die("Connection Error (" . mysqli_connect_errno() . ") "
. mysqli_connect_error());
mysqli_close($this->dbLink);
}
else
{
$this->dbLink->set_charset("UTF-8");
}
return true;
} //end __construct
} //end class
上面的整个代码块应该在 xNeyte 引用的database.php 中——这是您调用以与数据库交互的类。
所以在database.php对象中使用上面的代码,你需要在你的代码顶部调用数据库对象,然后你需要为你的类生成一个实例:
include "database.php"; ////include file
$dataBase = new database(); ///create new instance of class.
现在当您编写$dataBase->dbLink 时,这是与数据库的连接。如果您不知道您的数据库连接使用 PHPMyAdmin 使用的详细信息,它会以完全相同的方式执行其任务。
太棒了
第 2 部分:
也就是说你的数据库连接已经建立——现在你需要运行更新:首先你需要检查给定的值是否有效:
if (is_numeric($_GET['id']) && $_GET['id'] >0 ){
$id = (int)$_GET['id'];
}
这是检查从链接传递的值是否为整数的简单代码。永远不要相信用户输入。
永远不要将GET 和POST 值直接插入SQL 语句也是一个好主意。因此,我将值复制到 $id
第 3 部分:
$sql = "UPDATE <TABLE> SET STOCK = STOCK-1 WHERE Product_ID = ? LIMIT 1";
表名是你的表名,LIMIT 1 只是确保这只适用于一行,因此不会影响太多库存游戏。
上面是 SQL,但是如何在 PHP 中使它工作:
首先,需要准备语句,然后在准备好后,将值插入? 部分(这是 MySQLi 语法,PDO 有更有用的:name 语法)。
所以:
include "database.php"; ////include file
$dataBase = new database(); ///create new instance of class.
if (is_numeric($_GET['id']) && $_GET['id'] >0 ){
$id = (int)$_GET['id'];
$sql = "UPDATE <TABLE> SET STOCK = STOCK-1 WHERE Product_id = ? LIMIT 1";
$update = $dataBase->dbLink->prepare($sql);
$update->bind_param("i",$id);
$update->execute();
$counter = $update->affected_rows;
$update->close();
//////gap for later work, see below:
}
else
{
print "Sorry nothing to update";
}
这里可能发生了很多事情,首先bind_param 方法设置插入SQL 查询的值,将? 替换为$id 的值。 i 表示它是一个 Integer 值。请看http://php.net/manual/en/mysqli-stmt.bind-param.php
$counter 值只是返回受影响的行数,然后可以插入类似这样的内容:
if ($counter > 0 ){
print "Thank you for your order. Stock has been reduced accordingly.";
}
else {
print "Sorry we could not stock your order.";
}
第四部分
最后,如果您愿意,您可以只输出打印消息,或者我倾向于将消息放入 SESSION,然后将 PHP 页面重定向回来。
我希望这会有所帮助。如果您不习惯以这种方式进行数据库交互,我强烈建议您使用 PDO 或 MySQLi 但不要将两者结合使用,这会导致各种语法错误。使用 MySQLi 意味着您知道 MySQL 可以做的所有事情,都可以通过在函数调用中添加字母“i”来做得更好。它也非常适合参考 PHP.net 手册,该手册有一个非常清晰的详细示例,说明了如何使用每个 PHP 函数。