【问题标题】:INSERT INTO doesn't fill all rowsINSERT INTO 不会填满所有行
【发布时间】:2019-05-01 16:22:50
【问题描述】:

我的代码有问题,它是 PayPal 快速集成。我的意思是在经过一些调整以匹配我的数据库后处于其原始状态,等等它可以工作,它用 ex 填充行。付款人ID等。

我的数据库中有 2 个表 - 首先是 Products,它有 5 行,例如 productID、Price、货币等,但我需要 1 个额外的行 - 假设我们称之为 Credits。我手动将它添加到我的数据库中,用数据填充表格产品。

然后我有另一个名为 Orders 的表 - 我在其中添加了名为 Credits 的行,而不是在成功付款+结帐匹配 Credits 到所选产品后,它应该在 Orders 表中填充此行 Credits。我遇到的问题是订单表中填充了除最后一行之外的所有数据-> 信用它总是在数据库中显示 NULL。

这是我的代码的一部分:

    public function getAllProducts()
    {
        $db = getDB();
        $stmt = $db->prepare("SELECT * FROM products");
        $stmt->bindParam("pid", $pid, PDO::PARAM_INT) ;
        $stmt->execute();
        $data = $stmt->fetchAll(PDO::FETCH_OBJ);
        $db=null;
        return $data;

    }

    public function getProduct($pid)
    {
        $db = getDB();
        $stmt = $db->prepare("SELECT * FROM products WHERE pid=:pid");
        $stmt->bindParam("pid", $pid, PDO::PARAM_INT) ;
        $stmt->execute();
        $data = $stmt->fetch(PDO::FETCH_OBJ);
        $db=null;
        return $data;

    }

这是我有问题的地方

    public function orders()
    {
        $id = $_SESSION['session_id'];
        $db = getDB();
        $stmt = $db->prepare("SELECT P.product, P.price, P.product_img, P.currency, P.credits, O.created, O.oid  FROM orders O, products P WHERE O.id_fk=:id AND P.pid = O.pid_fk ORDER BY O.created DESC");
        $stmt->bindParam("id", $id, PDO::PARAM_INT) ;
        $stmt->execute();
        $data = $stmt->fetchAll(PDO::FETCH_OBJ);
        $db=null;
        return $data;

    }

    public function updateOrder($pid, $payerID, $paymentID, $token, $credits)
    {
        $id = $_SESSION['session_id'];
        if($this->pyamentCheck($paymentID) < 1 && $id > 0){
        $db = getDB();

        $stmt = $db->prepare("INSERT INTO orders (id_fk, pid_fk, payerID, paymentID, token, created, credits) VALUES (:id, :pid, :payerID, :paymentID, :token, :created, :credits)");
        $stmt->bindParam("paymentID", $paymentID, PDO::PARAM_STR) ;
        $stmt->bindParam("payerID", $payerID, PDO::PARAM_STR) ;
        $stmt->bindParam("token", $token, PDO::PARAM_STR) ;
        $stmt->bindParam("pid", $pid, PDO::PARAM_INT) ;
        $stmt->bindParam("id", $id, PDO::PARAM_INT) ;
        $created = time();
        $stmt->bindParam("created", $created, PDO::PARAM_INT) ;
        $stmt->bindParam(":credits", $credits, PDO::PARAM_INT) ;

        $stmt->execute();
        $db=null;
        return true;

        }
        else{
            return false;
        }

    }

我想不通。

【问题讨论】:

  • $stmt = $db-&gt;prepare("SELECT * FROM products"); 没有占位符,因此现在也应该可以使用。
  • 您应该打开异常并将其放入将报告错误的尝试捕获中。
  • 您是否尝试在 bindParam 中的列名前添加分号(:)?
  • 是的,结果一样
  • 这是 PDO 还是 MySQLi?两者都不太可能。你会删除其中一个标签吗?

标签: php pdo prepared-statement


【解决方案1】:

这是一个非常常见的问题,因此值得回答,无论它看起来多么明显。

一旦你有一个工作 INSERT查询并且一个列变成NULL,这意味着源变量包含@ 987654322@。

所以问题既不在于 PDO,也不在于准备好的语句,也不在于数据库,而在于您的源变量 $credits。您必须检查与此变量相关的代码并确保它确实包含所需的值。

【讨论】:

  • ->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);没有显示任何错误,我尝试更改表的代码名称,然后它抛出异常错误,当我输入正确的表名称时,它什么也没显示,我的意思是没有错误。仍然在 DB 最后一行是 NULL
  • @KamilWisniewski 也许在你的函数定义中给$credits一个默认值,$credits = 0)或者调试你调用函数的位置和变量是什么。
  • 也许我没有写下所有信息。我不能输入 $Credit = 0 或 100 或 1000,因为它的 paypal express checkout。如果用户选择前。产品 1 在 DB 中的 Credits 数量为 100,如果他选择产品 2,则为 200,依此类推。因此,在他选择产品后,他会被重定向到带有 session_id 和 pid-> 产品 ID 的贝宝结帐。当他完成付款时,他应该参考这个 Session 和 pid 获得这些 Credits。除了这个额外的积分之外,所有信息都填充到数据库中的订单表中。在 Products 表中,我用金额填充 Credits 行。它仍然在 Order 表中用 NULL 填充最后一个
  • @KamilWisniewski 您应该进一步处理您的代码。这实际上是所有程序员都在做的事情。我们可以帮助您的很少,没有您的代码,没有您的数据库,没有您的贝宝帐户。您已经回答了为什么 Credits 列(它称为列,而不是行)为空的问题。为什么您的 $credits 变量为空是您的工作。
猜你喜欢
  • 2011-07-12
  • 2012-01-08
  • 1970-01-01
  • 2014-04-23
  • 1970-01-01
  • 1970-01-01
  • 2013-07-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多