【问题标题】:PDO database insertPDO 数据库插入
【发布时间】:2012-05-12 15:29:09
【问题描述】:

嗨,我在 mysql 中有一个表,有六个字段

ID, mobileNumber, firstName, lastName, email, password , rollID

ID 是自动递增的,我想使用 php 插入它

php代码

public function run($firstName, $lastName, $mobileNumber, $email, $password, $rePassword) {
        if (!$this->db->isExistedMobile($mobileNumber)) {
            try {
               $query = "INSERT INTO user (firstName, lastName, mobileNumber, email, password, rollID)
                VALUES (:firstName, :lastName, :mobileNumber, :email, :password, 'rollID')";
                $sth = $this->db->prepare($query);
                $sth->execute(array(
                    ':firstName' => $firstName,
                    ':lastName' => $lastName,
                    ':mobileNumber' => $mobileNumber,
                    ':email' => $email,
                    ':password' => $password,
                    ':rollID' => "roma"
                ));
                header("location: " . URL . "index");
            } catch (PDOException $e) {
                die($e->getMessage());
                exit;
            }
        } else {
            include 'controlers/Error.php';
            $error = new Error();
            $error->index("you enterd a used mobile number");
        }
    }

我有这个例外

SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens

函数 isExistedMobile 总是返回 false 所以不用担心,我不知道哪里错了,是语法吗?还是在rollID cos中我使它成为静态的? 谢谢你的帮助:)

【问题讨论】:

  • (我没有投反对票)。你能解释一下出了什么问题吗?一个假定记录没有按预期插入到数据库中,但您实际上并没有这么说。或者也许是重定向没有按预期工作?注:在调试过程中设置$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 是值得的,以便输出任何 PDO 错误。
  • 如果您熟悉 try/catch 块,您可以将整个查询放在 try{} 和 catch(PDOException $e) 中。我没有看到任何明显的错误,所以我的猜测是其中一个变量是未定义的。
  • 另外,你应该 exit;die() 在使用标题位置之后,并将“控制器”作为其中的两个 L。 :P
  • 我尝试了 try 和 catch,但没有发现异常 :(,我将更新问题以包括 try 和 catch
  • @WilliamKinaan:除非抛出异常,否则您无法捕获异常 - 为此您必须更改 PDO 的错误模式,如我之前的评论中所述。但我建议这样做,然后捕获异常,以便将其输出并且您可以了解发生了什么。

标签: php mysql database pdo


【解决方案1】:

问题(your original code)是参数数组有一个尾随逗号,这在其中创建了一个额外的null 元素。

我建议按原计划恢复到该版本(使用 rollID 的文字值),但请确保删除 $password 之后的尾随逗号:

public function run($firstName, $lastName, $mobileNumber, $email, $password, $rePassword) {
        if (!$this->db->isExistedMobile($mobileNumber)) {
            $query = "INSERT INTO user (firstName, lastName, mobileNumber, email, password, rollID)
                VALUES (:firstName, :lastName, :mobileNumber, :email, :password, 'ddd')";
            $sth = $this->db->prepare($query);
            $sth->execute(array(
                ':firstName' => $firstName,
                ':lastName' => $lastName,
                ':mobileNumber' => $mobileNumber,
                ':email' => $email,
                ':password' => $password  // , removed from here
            ));
            header("location: " . URL . "index");
        } else {
            include 'controlers/Error.php';
            $error = new Error();
            $error->index("you enterd a used mobile number");
        }
    }

【讨论】:

  • 我需要 rollID 是静态的,并且它的值为“roma”
  • @WilliamKinaan:一开始你的查询是正确的;你只需要删除多余的,
  • 你是这个意思吗? $query = "INSERT INTO user (firstName, lastName, mobileNumber, email, password, rollID) VALUES (:firstName, :lastName, :mobileNumber, :email, :password, rollID)";
  • 考虑到 OP 想要什么,恕我直言,这不是一个好的答案,您应该在查询中为 rollID 添加一个冒号,正如 GolezTrol 指出的那样
  • @Mahn:查看 OP 对他的问题的修改,看看他是从哪里开始的——rollID 只是在他自己的试错尝试中开始向参数移动,以解决我在回答中发现的问题.正如他的问题所述,他希望 rollID 是“静态的”(我们可以理解为从他的原始帖子中“获取恒定的文字值”)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-28
  • 1970-01-01
  • 2014-04-17
  • 1970-01-01
相关资源
最近更新 更多