【问题标题】:Cannot insert into database using php with PDO:: execute()无法使用带有 PDO::execute() 的 php 插入数据库
【发布时间】:2011-10-02 10:50:02
【问题描述】:

我创建了一个简单的 mySQL 数据库,并尝试使用 PHP 将一些测试数据插入其中。当我在 Firefox 上运行该方法时,我收到以下消息,但我无法解决此问题:

警告:PDOStatement::execute() [pdostatement.execute]: SQLSTATE[HY093]: 参数号无效:

我将样本插入数据库的方法是:

public function confirmInsert(){
    $admin="admin";
    $pass="12345v";
    $mail="admin@example.com";  
    $insertSQL = "INSERT INTO 'users' ('user_name', 'user_pass, 'user_email')
            VALUES (
                    :admin, 
                    :pass,
                    :mail)";
    try {

        $stmt = $this->db->prepare($insertSQL);
        $stmt ->bindParam(':user_name',$admin, PDO::PARAM_STR);
        $stmt ->bindParam(':user_pass', $pass, PDO::PARAM_STR);
        $stmt->bindParam(':user_email', $mail,PDO::PARAM_STR);
        $stmt->execute();
        $stmt->closeCursor();
        return TRUE;
        } catch (Exception $e) {
            $e -> getMessage();
        }
}

我在 //localhost 上运行,并使用 apache 2.2 和 php 5.2.17。谢谢!!

【问题讨论】:

  • 你有一个无与伦比的开头单引号:'user_pass
  • @icktoofay:甚至更多 - 根本不应该有单引号,而是反引号(或什么都没有)

标签: php mysql database insert pdo


【解决方案1】:

我还没有制作 cmets 的权利,所以我必须发布这个作为答案..

R.E. Pompom6784的回答,使用bindParam()变量名不需要匹配参数:

$stmt->bindParam(':user_name', $admin, PDO::PARAM_STR);

应该可以正常工作。

您正在绑定:user_name 以接受名为$admin 的变量

..如果这样可以让事情更清楚一点。

如果您想了解有关此主题的更多信息,请阅读以下文章:

Why you Should be using PHP’s PDO for Database Access

它包括需要匹配变量和占位符名称的示例。

【讨论】:

    【解决方案2】:

    '您在查询中和绑定它们时的参数名称不同。您还必须删除查询中字段名称周围的引号。

    这样应该会更好:

    public function confirmInsert(){
        $admin='admin';
        $pass='12345v';
        $mail='admin@example.com';  
        $insertSQL = "INSERT INTO users (user_name, user_pass, user_email)
                VALUES (
                        :admin, 
                        :pass,
                        :mail)";
        try {
    
            $stmt = $this->db->prepare($insertSQL);
            $stmt ->bindParam(':admin',$admin, PDO::PARAM_STR);
            $stmt ->bindParam(':pass', $pass, PDO::PARAM_STR);
            $stmt->bindParam(':mail', $mail,PDO::PARAM_STR);
            $stmt->execute();
            $stmt->closeCursor();
            return TRUE;
            } catch (Exception $e) {
                $e -> getMessage();
            }
    }
    

    【讨论】:

    • 随着您的更改,它确实消除了错误消息,但它仍然没有向数据库中插入任何内容。您可以在准备字符串中看到的列名是:'user_name'、'user_pass、'user_email'。分别用bindParam、admin、pass、mail绑定的时候,是不是要改列名??
    • 没有列名保持不变,你在引号的使用中添加了一些错误,我已经更新了我的答案
    猜你喜欢
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    • 1970-01-01
    • 1970-01-01
    • 2014-06-29
    • 2013-10-13
    • 2014-11-25
    相关资源
    最近更新 更多