PHP - 将独立记录库存值减少1

时间:2015-04-29 11:58:17

标签: php mysql dreamweaver stock

我正在做一个学校项目,我正在使用Dreamweaver以及使用phpMyAdmin的后端数据库。

现在,我需要做的是,当我点击按钮时,它会将“products”表中的库存列值减少1。

但表中有不同的产品。如下所示:

http://i.stack.imgur.com/vLZXQ.png

让我们假设,用户在“Destiny”的游戏页面上点击“立即购买”按钮,如何让它将库存水平降低一个,但命运的为Fifa 15专栏记录并。所以Destiny股票变成了49,但是Fifa仍然是50.我只需要让每个按钮都有不同的脚本或者吗?

目前,我在页面中创建了一个链接到动作脚本的按钮,但我不知道我将使用哪种代码。

谢谢

2 个答案:

答案 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正在发生的事情。

第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使用的详细信息,它将以完全相同的方式执行其任务。

Sooo

第2部分:

即建立数据库连接 - 现在需要运行更新:首先,您需要检查给定的值是否有效:

if (is_numeric($_GET['id']) && $_GET['id'] >0 ){
$id = (int)$_GET['id'];
} 

这是检查链接传递的值是否为整数的简单代码。绝不相信用户输入。

最好不要直接将GETPOST值插入到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表示它是 整数 值。请参阅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.";
}

第4部分

最后如果您希望可以输出打印消息,或者我倾向于将消息放入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));

此脚本将完成工作