【问题标题】:PHP - Reducing an independent record stock value by 1PHP - 将独立记录股票价值减少 1
【发布时间】:2015-04-29 11:58:17
【问题描述】:

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

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

但是表中有不同的产品。如下图:

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

假设,一个用户在“命运”的游戏页面上点击立即购买按钮,我怎样才能使它的库存水平减少一,但仅限命运记录和为国际足联 15 列。所以 Destiny 库存变成 49,但国际足联保持 50。我是否只需让每个按钮都有不同的脚本?

目前,我在页面中制作了一个按钮,该按钮链接到一个动作脚本,但我不确定我将使用哪种代码。

谢谢

【问题讨论】:

  • 你想用 Ajax 做还是不做?
  • 最好不要,我从未使用过 Ajax。如果可能的话,我只是想通过 php 的动作脚本来做到这一点?

标签: php mysql dreamweaver stock


【解决方案1】:

xNeyte 给了你一些很好的建议,但我觉得你 - Xrin - 对使用 PHP 或类似的编程数据库内容完全陌生?

所以一步一步来:

MYSQL 数据库应该使用两种连接类型之一进行连接 - PDOMySQLi_ 。 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'];
} 

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

永远不要将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 表示它是一个 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 页面重定向回来。

我希望这会有所帮助。如果您不习惯以这种方式进行数据库交互,我强烈建议您使用 PDOMySQLi 但不要将两者结合使用,这会导致各种语法错误。使用 MySQLi 意味着您知道 MySQL 可以做的所有事情,都可以通过在函数调用中添加字母“i”来做得更好。它也非常适合参考 PHP.net 手册,该手册有一个非常清晰的详细示例,说明了如何使用每个 PHP 函数。

【讨论】:

    【解决方案2】:

    最好是在每个按钮上设置一个带有游戏 ID 的链接(1 代表命运,2 代表 FIFA15)。

    那么用户将通过单击启动的脚本将是:

    <?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));
    

    这个脚本可以完成这项工作

    【讨论】:

    • 这是目前出现的错误:prntscr.com/6zi2ya 通过“最好是在每个按钮上设置一个带有游戏 ID 的链接(1 代表命运,2 代表国际足联) 。”你是说prntscr.com/6zi3fv
    • 使用&lt;a href='script.php?id={$product['idProduct']'&gt;Test&lt;/a&gt; 的链接。稍后您将插入图像、按钮或其他内容
    • 这解决了第一个问题,但现在我得到一个 PDO 错误prntscr.com/6zi5lu
    • 不,我的意思是语法,你从来没有用 php 管理过数据库?您可以使用 PDO(我正在使用的个人类以使其使用更容易)或 mysqli 方法
    • php 标签关闭是可选的,我建议永远不要关闭它,因为如果你在它之后有一个换行符,它会发送标题,因为它会被视为 HTML 并会导致错误
    猜你喜欢
    • 2018-02-16
    • 2011-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多