【问题标题】:PDOException: SQLSTATE[HY093] [duplicate]PDOException:SQLSTATE [HY093] [重复]
【发布时间】: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
  • 请浏览herehere

标签: php mysql pdo


【解决方案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 提供的输出
猜你喜欢
  • 2023-01-19
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 2019-07-09
  • 2021-04-08
  • 2014-06-29
  • 2021-06-18
  • 2019-05-08
相关资源
最近更新 更多