【问题标题】:insert to sql from php gives SQLSTATE[HY093] Error从 php 插入到 sql 给出 SQLSTATE[HY093] 错误
【发布时间】:2018-05-31 02:54:07
【问题描述】:

我一直在努力尝试在我的 sql 中插入一条语句。但是在网上查找后我一直收到错误消息。请帮助我 :) 下面是我的代码-

$sql = "INSERT INTO Pokedex(name, nickname, datefound) 
        VALUES (:name, :nickname, :time);";
$stmt = $db->prepare($sql);
$params = array(":name" => $lcname, 
                ":nickname" => $nickname, 
                ":datefound" => $time);
$stmt->execute($params);

而且错误消息似乎在抱怨我的 sql:

DROP TABLE IF EXISTS Pokedex;

CREATE TABLE Pokedex(
   name          VARCHAR(30)     PRIMARY KEY,
   nickname      VARCHAR(30),
   datefound     DATETIME      
);

INSERT INTO Pokedex(name,nickname,datefound) VALUES 
("Pikachu","Pika","2018-01-03 12:23:44");

以下是错误信息:

致命错误:第 45 行 /home/ubuntu/workspace/hw7/insert.php 中的未捕获异常“PDOException”和消息“SQLSTATE[HY093]:无效参数编号:未定义参数”

PDOException: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in /home/ubuntu/workspace/hw7/insert.php on line 45

Call Stack:
    0.0002     238144   1. {main}() /home/ubuntu/workspace/hw7/insert.php:0
    0.0098     249912   2. PDOStatement->execute() /home/ubuntu/workspace/hw7/insert.php:45

请帮忙。

【问题讨论】:

    标签: php mysql pdo prepared-statement


    【解决方案1】:

    :datefound 不是:time。您需要匹配命名的占位符 (:datefound),而不是列的名称 (time)。

    或者,您可以使用匿名 ? 占位符并将值按正确顺序放入数组中。

    例如

    $sql = "INSERT INTO Pokedex(name, nickname, datefound) 
            VALUES (?, ?, ?);";
    $stmt = $db->prepare($sql);
    $params = array($lcname, $nickname, $time);
    $stmt->execute($params);
    

    它们按照出现的顺序绑定,因此第一个 ? 变为 $lcname

    【讨论】:

    • 你好,我试过你的格式,这导致我的代码是- $sql = "INSERT INTO Pokedex(name,nickname, datefound) VALUES (:name, :nickname, :datefound);"; $stmt = $db->prepare($sql); $params = array($lcname, $nickname, $time); $stmt->执行($params);仍然给我[HY093]的错误消息
    • 您不应该合并这两个代码位。要么使用您的原始代码并将绑定从 :time 更改为 :datetime,要么使用我编写的完整代码 sn-p。请注意,我的 SQL 中没有 :...
    • 哦,是的..你是对的;我已将代码更改为 $sql = "INSERT INTO Pokedex(name,nickname, datefound) VALUES (:name, :nickname, :datefound);"; $stmt = $db->prepare($sql); $params = array(":name" => $lcname, ":nickname" => $nickname, ":datefound" => $time); $stmt->执行($params);现在它给我错误消息 SQLSTATE[23000]
    • 致命错误:未捕获的异常 'PDOException' 带有消息 'SQLSTATE[23000]:完整性约束违规:1062 重复条目..
    • 您尝试写入的name 是否已经在数据库中?主要要求该字段是唯一的。
    【解决方案2】:

    您需要绑定参数。 请尝试以下代码:

     $sql = "INSERT INTO Pokedex(name, nickname, datefound) VALUES (:name, :nickname, :time);";
     $stmt = $db->prepare($sql);
     $stmt->bindParam(':name', $lcname);
     $stmt->bindParam(':nickname', $nickname);
     $stmt->bindParam(':time', $time);
     $lcname = "John Doe";
     $nickname = "john";
     $time = date('Y-m-d H:i:s');
     $stmt->execute();
    

    【讨论】:

    • 谢谢!!我知道收到错误 SQLSTATE[42000]:语法错误或访问冲突:1064 但我认为这是我现在遇到的另一种问题..
    猜你喜欢
    • 2016-04-08
    • 1970-01-01
    • 1970-01-01
    • 2019-09-22
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 2016-12-04
    • 2019-08-10
    相关资源
    最近更新 更多