【问题标题】:SQLSTATE[HY093]: Invalid parameter number: parameter was not defined, but I have all of them defined?SQLSTATE[HY093]:无效的参数号:参数没有定义,但我都定义了?
【发布时间】:2017-03-27 03:25:18
【问题描述】:

我正在使用 PDO 将一些数据推送到我的 MySQL 服务器,表名为“用户”,我收到以下错误:

[26-Mar-2017 22:18:21 America/Chicago] Could not successfully add user!
[26-Mar-2017 22:18:21 America/Chicago] SQLSTATE[HY093]: Invalid parameter number: parameter was not defined

我查看了有关堆栈溢出的多个其他问题,并带有相同的错误消息,归结为 PDO 准备和执行参数不匹配。但是,我的准备和执行是匹配的,我已经检查了很多次,但我仍然收到错误。这是我的代码:

        $noMusicScore = $data->noMusicScore;
        $classicalMusicScore = $data->classicalMusicScore;
        $popMusicScore = $data->popMusicScore;
        $hiphopMusicScore = $data->hiphopMusicScore;

        try
        {
            $db = new PDO('info here......');
            $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

            $query = $db->prepare("INSERT INTO User (no-music-score, classical-music-score, pop-music-score, hiphop-music-score) 
                                   VALUES (:no-music-score, :classical-music-score, :pop-music-score, :hiphop-music-score)");

            $query->execute(array(':no-music-score' => $noMusicScore, ':classical-music-score' => $classicalMusicScore, 
                                  ':pop-music-score' => $popMusicScore, ':hiphop-music-score' => $hiphopMusicScore));

            error_log("Successfully added user!");
        }

        catch(PDOException $e)
        {
            error_log("Could not successfully add user!");
            error_log($e->getMessage());
        }

        unset($db, $query);

【问题讨论】:

  • 该线程中的答案或 cmets 都不应该与此相关吗?似乎所有参数都存在。我建议进一步简化查询,只使用 :pop、:classical 等。只是为了确保命名没有问题。不过,它看起来确实正确。
  • 尝试 echo for $query 是否提供所需的查询?
  • 不要使用破折号作为占位符名称。仅限 A-Z、数字和下划线。

标签: php mysql pdo


【解决方案1】:

我解决了这个问题。我只是删除了占位符名称的破折号,一切都到位了。 “否”也是一个 SQL 关键字,所以我认为这也是问题的一部分。

【讨论】:

  • 您对占位符的命名完全正确!但是“no”只是一个关键字,而不是一个保留关键字,所以世界工作:-) 但列也不应该包含破折号,mysql 会认为你在做数学!
猜你喜欢
  • 2012-06-13
  • 2012-04-15
  • 2020-03-18
  • 2016-11-28
  • 2016-12-15
相关资源
最近更新 更多