我的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方法调用这个私有方法,因为没有用户加载,然后它创建它):
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。
我真的希望有人可以帮助我解决这个问题,因为我一直试图让这一天工作,我试图删除并重新创建数据库和表格,包括插入代码。
事先,非常感谢您的时间和帮助。
答案 0 :(得分:0)
尝试查看errorInfo函数的返回值,如var_dump($q->errorInfo());
。如果您在执行查询时遇到失败,就会在DBMS的实际客户端工具(即MySQL Workbench)中执行该查询时,这会给出错误消息。