PDOException:SQLSTATE [HY093] [重复]

Posted

技术标签:

【中文标题】PDOException:SQLSTATE [HY093] [重复]【英文标题】:PDOException: SQLSTATE[HY093] [duplicate] 【发布时间】:2020-12-24 10:09:22 【问题描述】:

嘿嘿。

我是 php 新手,但学习困难重重。我发现这是处理数据库连接的方法。已经调试了代码,但还剩下一件顽固的事情。似乎无法将我的大脑包裹在这个错误代码上。任何指针都以简单的方式,所以即使我理解。 ;-)

我正在浏览这个页面:https://www.php.net/manual/en/pdostatement.bindparam.php

错误信息: 数据库连接建立PDOException: SQLSTATE[HY093]: 参数号无效:参数未在 C:\xampp\htdocs\Test\dbtest.php:28 堆栈跟踪:#0 C:\xampp\htdocs\Test\dbtest.php( 28): PDOStatement->execute() #1 main

<?php
// Require needed classes
require_once('dbhandler.php');

// Create needed objects
$dbh = new DBHandler();

// Check if database connection established successfully
if ($dbh->getInstance() === null) 
    die("No database connection");


//$datetime = date("Y-m-d H:i:s");
$epost = 'svante@telia.com'; 
$namn = 'Svante';
$användarnamn = 'Poffe';
$lösenord = '1596';

try 
    $sql = "INSERT INTO users(epost, namn, användarnamn, lösenord) VALUES(:epost, :namn, :användarnamn, :lösenord)";

    $stmt = $dbh->getInstance()->prepare($sql);
    $stmt->bindParam(':epost', $epost, PDO::PARAM_STR);       
    $stmt->bindParam(':namn', $namn, PDO::PARAM_STR); 
    $stmt->bindParam(':användarnamn', $användarnamn, PDO::PARAM_STR);
    $stmt->bindParam(':lösenord', $lösenord, PDO::PARAM_STR);   

    $stmt->execute();
 

catch(PDOException $e) 
    echo $e;

?>

/斯万特

【问题讨论】:

如果使用不带重音符号的字符,是否还会出现此错误? 你在这里吗? $stmt->bindParam(':epost', $epost, PDO::PARAM_STR); $stmt->bindParam(:epost, $epost, PDO::PARAM_STR);这就是手册所说的: $sth->bindParam(':calories', $calories, PDO::PARAM_INT); 哦,对不起。消息后做了一些更改。我编辑主要问题。它在第 28 排场外。 请将您的问题edit 发送至:澄清问题标题、更多细节或澄清问题、改进文本排列、改进代码格式。见How to Ask 请浏览here和here 【参考方案1】:

可能值得尝试一个简化版本,省略 PHP 变量中的特殊字符和分配的占位符。

<?php
    require_once('dbhandler.php');

    $dbh = new DBHandler();

    $e = 'svante@telia.com'; 
    $n = 'Svante';
    $a = 'Poffe';
    $l = '1596';

        $sql = "INSERT INTO users( `epost`, `namn`, `användarnamn`, `lösenord` ) VALUES( :e, :n, :a, :l )";

        $stmt = $dbh->getInstance()->prepare($sql);
        $stmt->bindParam(':e', $e, PDO::PARAM_STR);       
        $stmt->bindParam(':n', $n, PDO::PARAM_STR); 
        $stmt->bindParam(':a', $a, PDO::PARAM_STR);
        $stmt->bindParam(':l', $l, PDO::PARAM_STR);   

        $stmt->execute();

【讨论】:

谢谢 Abronsius 教授。它就像一个魅力。我有我介意的,但被其他东西冲昏了头脑。它是用英语写的,之前女巫是“尽力而为”的方式,但是变量“名称”确实以错误的方式连接起来,而我用的是瑞典语。 ;-) :-) 好~很高兴它有帮助 顺便说一句,你可以在 catch 中回显 $e,更不用说根本不应该没有 catch 块 @YourCommonSense 你可以吗?那时我已经预料到它是一个对象的错误!我对你评论中的双重否定感到困惑shouldn't be no catch blocks ~ 你的意思是不应该有 catch 块吗?? 是的,这是一个双重否定,不应该有 catch 块。如果您看一下您回答的问题,就会发现“不可能”echo $e 提供的输出

以上是关于PDOException:SQLSTATE [HY093] [重复]的主要内容,如果未能解决你的问题,请参考以下文章

SQLSTATE [HY000] [2002] 连接被拒绝 - 原因:PDOException [重复]

PHP PDOException:“SQLSTATE [HY093]:无效参数号”

Symfony 错误:[PDOException] SQLSTATE[HY000] [2002] 没有这样的文件或目录

Symfony 2.8(Wamp):[Doctrine\DBAL\Exception\ConnectionException] PDOException:SQLSTATE[HY000] [2002]

Laravel 5.0 [PDOException] SQLSTATE[HY000]:一般错误:1215 无法添加外键约束

Laravel PDOException SQLSTATE[HY000] [1049] 未知数据库 'forge'