我正在做一个学校项目,我正在使用Dreamweaver以及使用phpMyAdmin的后端数据库。
现在,我需要做的是,当我点击按钮时,它会将“products”表中的库存列值减少1。
但表中有不同的产品。如下所示:
http://i.stack.imgur.com/vLZXQ.png
让我们假设,用户在“Destiny”的游戏页面上点击“立即购买”按钮,如何让它将库存水平降低一个,但命运的仅为Fifa 15专栏记录并不。所以Destiny股票变成了49,但是Fifa仍然是50.我只需要让每个按钮都有不同的脚本或者吗?
目前,我在页面中创建了一个链接到动作脚本的按钮,但我不知道我将使用哪种代码。
谢谢
答案 0 :(得分:1)
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正在发生的事情。
连接数据库。 这应该使用面向对象 - 类,
来完成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使用的详细信息,它将以完全相同的方式执行其任务。
Sooo
即建立数据库连接 - 现在需要运行更新:首先,您需要检查给定的值是否有效:
if (is_numeric($_GET['id']) && $_GET['id'] >0 ){
$id = (int)$_GET['id'];
}
这是检查链接传递的值是否为整数的简单代码。绝不相信用户输入。
最好不要直接将GET
和POST
值插入到SQL语句中。因此,我已将值复制到$id
$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
表示它是 整数 值。请参阅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函数。
答案 1 :(得分:0)
最好是在每个按钮上设置一个带有游戏ID的链接(命运为1,Fifa15为2)。
然后用户通过点击启动的脚本将是:
<?php
include('database.php'); // your database connection
if($_GET['id']) {
$id=$_GET['id'];
} else throw new Exception('Invalid parameter');
$statement = myPDO::getInstance->prepare(<<<SQL
UPDATE TABLE
SET STOCK = STOCK-1
WHERE Product_id = :id
SQL
);
$statement->execute(array(":id" => $id));
此脚本将完成工作