【问题标题】:php pdo success but dont enter the data to the databasephp pdo 成功但不向数据库输入数据
【发布时间】:2014-01-10 10:50:40
【问题描述】:

我的 PDO/SQL 遇到了这个奇怪的问题。我使用命名空间和类来控制事物。

我使用自定义 PDO 类,这是因为我还定义了一些标准值,例如 PDO 应该抛出异常等等。

当我尝试创建用户时出现了奇怪的问题。我正处于这个项目的开发阶段,因此我正在硬编码一个测试登录。

try  
{  
$user = new OOP\User\user();  
$user->setFirstname("Firstname");  
$user->setLastname("Lastname");  
$user->setUsername("Test");  
$user->setSecret(OOP\utillityClass::create_unique_hash(128));  
$user->setPassword(OOP\utillityClass::create_password("*Duh as if im studpid enought to post my password*", $user->getSecret()));  
$user->setEmail("some mail");  
$birthday = new DateTime("1990-01-01");  
$user->setBirthday($birthday);  
$user->setClass(1);  
$user->setAdded(new DateTime());  
$user->setLast_Active(new DateTime());  
$user->setActivated(true);  
$user->setIp(OOP\utillityClass::getip());  
$user->setIv(OOP\Crypt\crypt::createIv("hex"));  
$permissions = array();  
$permissions['staff'] = array();  
$permissions['staff']['read'] = 1;  
$user->setPermissions(json_encode($permissions));  
$user->save();  
}  
catch (Exception $e)  
{  
echo "Error *censored, i use slurs while debugging*:" . PHP_EOL;  
print_r($e);  
}

以上是创建代码。

这是数据库中的表:

CREATE TABLE IF NOT EXISTS `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `firstname` varchar(50) NOT NULL,
  `lastname` varchar(50) NOT NULL,
  `username` varchar(50) NOT NULL,
  `password` varchar(128) NOT NULL,
  `secret` varchar(128) NOT NULL,
  `email` varchar(255) NOT NULL,
  `birthday` date NOT NULL,
  `class` int(11) NOT NULL,
  `added` datetime NOT NULL,
  `last_active` datetime NOT NULL,
  `activated` tinyint(1) NOT NULL DEFAULT '0',
  `ip` varchar(40) NOT NULL,
  `iv` varchar(32) NOT NULL,
  `permissions` text NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

插入代码来了(注意调用的是公共save方法,但是save方法调用这个私有方法,因为没有加载用户,所以创建它):

private function insert()
{

    // We need the $CONFIG variable for sending actiovation emails \\
    global $CONFIG;

    $q = $this->PDO->prepare("INSERT INTO `user` (`firstname`, `lastname`, `username`, `password`, `secret`, `email`, `birthday`, `class`, `added`, `last_active`, `activated`, `ip`, `iv`, `permissions`) VALUES (:firstname, :lastname, :username, :password, :secret, :email, :birthday, :class, :added, :last_active, :activated, :ip, :iv, :permissions);");


    $q->bindParam(':firstname', $this->firstname);
    $q->bindParam(':lastname', $this->lastname);
    $q->bindParam(':username', $this->username);
    $q->bindParam(':password', $this->password);
    $q->bindParam(':secret', $this->secret);
    $q->bindParam(':email', $this->email);
    $q->bindParam(':birthday', $this->birthday->format("Y-m-d"));
    $q->bindParam(':class', $this->class);
    $q->bindParam(':added', $this->added->format("Y-m-d H:i:s"));
    $q->bindParam(':last_active', $this->last_active->format("Y-m-d H:i:s"));
    $q->bindParam(':activated', $this->activated);
    $q->bindParam(':ip', $this->ip);
    $q->bindParam(':iv', $this->iv);
    $q->bindParam(':permissions', $this->permissions);

    $res = $q->execute();

    if ($q->errorCode() != 00000)
    {
        throw new \Exception("An error occured during the creation");
    }
    else
    {
        return true;
    }

}

现在有趣的事情来了,根本没有Exception或PDOException,实际上它应该通过但它没有将数据输入数据库,而是自增数增加1。

我真的希望有人能帮我解决这个问题,因为我整天都在努力让它工作,并且我试图删除并重新创建数据库和表,包括插入代码。

在此之前,非常感谢您的时间和帮助。

【问题讨论】:

  • 愚蠢的问题,但是你所有的类变量都设置好了吗?
  • 这个$user = new OOP\User\user(); 代表被误解(虽然我可能是错的)眨眼。 Useruser 但这只是我。查看andrewsi 提到的内容。
  • 尝试设置调用的错误模式 $this->PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);然后将整个查询执行包装在一个 try catch 块中,而不是查看错误代码。此外,如果它在事务中,您将需要提交更改。
  • @andrewsi 是的,变量设置正确,忘了提如果我手动创建查询,然后在 phpmyadmin 中输入,那么它可以完美运行。
  • @Fred-ii- 没错,我就是这样做的,大写字母应该模拟我命名空间中的目录,而小的只有类名。

标签: php sql oop pdo


【解决方案1】:

尝试像var_dump($q->errorInfo()); 那样查看errorInfo 函数的返回值。如果您确实未能执行查询,这将向您提供错误消息,就像您在 DBMS 的实际客户端工具(即 MySQL Workbench)中执行该查询一样。

【讨论】:

  • array(3) { [0]=> string(5) "00000" [1]=> NULL [2]=> NULL } 但是数据库中仍然没有数据
  • 您的表中可能存在 NOT NULL 约束或权限问题。我认为你唯一能做的就是 var_dump 你的所有变量,并在 DBMS 的客户端工具中执行与所有变量相对应的实际插入操作。请务必使用您在 PHP 脚本中使用的相同凭据。但我认为这会很奇怪,因为通常 DBMS 会通知客户这些错误。
  • 听起来可能是这个原因,我试试看。我会带着结果回来的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-23
  • 2020-07-20
  • 2014-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-26
相关资源
最近更新 更多