Php PDO的奇怪行为

Php PDO的奇怪行为,php,mysql,pdo,Php,Mysql,Pdo,一天中的好时光 我的masters项目给了我一个任务,在不使用任何框架的情况下开发移动应用程序(我指的是Symfony/Laravel/Phalcon等) 因为我以前经常与Laravel合作,所以我一直在尝试在我自己的“框架”中重新创建Laravel中可用的一些方法 然而,我在使用PDO时遇到了非常奇怪的问题。 以下是我试图做的: 我想使用user::create([])创建用户用户模型的方法(是的,我在某种程度上重新创建了模型系统) 如果我从数据库中检索数据,那么获取正确的数据是没有问题的。即

一天中的好时光

我的masters项目给了我一个任务,在不使用任何框架的情况下开发移动应用程序(我指的是Symfony/Laravel/Phalcon等)

因为我以前经常与Laravel合作,所以我一直在尝试在我自己的“框架”中重新创建Laravel中可用的一些方法

然而,我在使用PDO时遇到了非常奇怪的问题。
以下是我试图做的:

  • 我想使用
    user::create([])创建用户用户模型的方法(是的,我在某种程度上重新创建了模型系统)
    
  • 如果我从数据库中检索数据,那么获取正确的数据是没有问题的。即使是
    User::where('name','User name')->或where('name',User name')->first()->toArray()
    链也可以正常工作(查询没有“变形”)
  • 创建时,SQL查询看起来很好(在执行之前用
    str\u replace
    转储)
  • 执行查询后,数据库中只填充了一列(最后一列)的数据
  • 以下是
    创建(数组$parameters)
    方法:

    try {
            $reference = (new static);
            $sqlStatement = sprintf('INSERT INTO %s (%s) VALUES (', $reference->table, implode(', ', $reference->fillable));
            foreach ($parameters as $key => $value) {
                $reference->$key = $value;
                $sqlStatement .= ':' . $key . ', ';
            }
            $sqlStatement = rtrim($sqlStatement, ', ') . ')';
            $statement = $reference->connection->prepare($sqlStatement);
            foreach ($parameters as $key => $value)
                $statement->bindParam(':' . $key, $value);
            $statement->execute();
            return $reference;
        } catch (\PDOException $exception) {
            dd($exception);
        }
    
    我真的不知道这里出了什么问题,因为PHP和SQL部分看起来很好。
    非常感谢您的任何帮助或想法

    您的foreach缺少卷括号。另外
    ->bindValue
    ,除非它是一个输出参数。谢谢。我想我需要多睡一会儿。快7点了,过去15个小时我一直在做这个。再次感谢!记住,Laravel做了很多事情来保证参数的安全。您必须正确地转义此处输入的任何和所有值:表名也需要用反勾号转义,否则它们将导致问题:名为“order”的表或列将使此代码崩溃。我希望这是一个学术性的练习,因为在生产代码中使用您自己的框架可以让您很快重新发现编写一个功能完整的框架是多么痛苦。如果有人想要“没有框架”的代码,这可能是你想要传递的工作,责任太大了。@tadman这是一个学术练习。我们仍然被迫使用mysqli(PDO是一个“下一个级别”,不要使用它)。我已经玩“PHP”7-8年了,但如果你被告知“不要使用任何框架,自己编写代码”,你就不能争辩了。@IvanZhivolupov,如果这是一个太过空间化的时代。PHP5.1在2005年引入了PDO。您的foreach缺少花括号。另外
    ->bindValue
    ,除非它是一个输出参数。谢谢。我想我需要多睡一会儿。快7点了,过去15个小时我一直在做这个。再次感谢!记住,Laravel做了很多事情来保证参数的安全。您必须正确地转义此处输入的任何和所有值:表名也需要用反勾号转义,否则它们将导致问题:名为“order”的表或列将使此代码崩溃。我希望这是一个学术性的练习,因为在生产代码中使用您自己的框架可以让您很快重新发现编写一个功能完整的框架是多么痛苦。如果有人想要“没有框架”的代码,这可能是你想要传递的工作,责任太大了。@tadman这是一个学术练习。我们仍然被迫使用mysqli(PDO是一个“下一个级别”,不要使用它)。我已经玩“PHP”7-8年了,但如果你被告知“不要使用任何框架,自己编写代码”,你就不能争辩了。@IvanZhivolupov,如果这是一个太过空间化的时代。PHP5.1在2005年引入了PDO。