【发布时间】:2017-12-02 23:01:02
【问题描述】:
我得到一个奇怪的结果,在我的 mySQL 数据库中激活/停用站点用户帐户的更新方法 (http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/data-retrieval-and-manipulation.html#update) 调用有时未更新并返回 0。代码如下:
$user_id = '198';
$sqlSetStmnt= [ 'activation_code' => NULL, 'active' => 0 ];
$conn = $this->get( 'database_connection' );
try {
$result = $conn->update( 'users', $sqlSetStmnt,[ 'id' => (int)$user_id ] );
}
catch( Exception $e ) {
$error = $e->getMessage();
throw new \Exception( 'update user account data function -- ' .
'error: ' . $error . ' - ' .
'unable to update your account!' );
} // End of catch( Exception ) block.
if( ( $result === FALSE ) || ( $result !== 1 ) ) {
throw new \Exception( 'update user account data function -- ' .
'update return value: ' . $result . ' - ' .
'unable to update your account!' );
} // if( ( $result === FALSE ) || ( $result !== 1 ) ) ...
users 表有一个作为主键的 id int(11) 列,一个 active tinyint(1) 列,以及activation_code varchar(40) NULL 列。
请注意,$user_id 变量包含一个字符串值 '198',但在创建 $sqlSetStmnt 值时它被强制转换为 int。
检查 users 表确认 users 表中有一行 id 列值为 198更新调用。
运行更新调用时使用的帐户有足够的权限来更改行 active 和 activation_code 列的值。
系统中没有其他用户或访问数据库,因此该行上没有任何锁。
我使用 x-debug 检查了代码,$user_id 和 $sqlSetStmnt 变量的值已正确设置为我预期的值,即 $result 被 update 方法设置为 0,并且 update 方法调用没有抛出异常。
顺便说一下,没有必要使用变量绑定,因为$user_id和$sqlSetStmnt变量中的值不是用户输入的,所以不可能SQL 注入或缓冲区溢出。
有什么方法可以从 DBAL 获取有关 update 方法返回 0 的原因的信息吗?
谢谢。
【问题讨论】:
-
update 返回实际更新的记录数。你是说它实际上是在改变一条记录并返回0?
-
不,记录似乎没有更新。但是,由于存在具有匹配 id 列值的行,并且 id 列是表的主键,因此我希望应该更新一行并将结果设置为 1 而不是 0。
-
只有在activation_code 不为空和/或活动值不为零时才会更新该行。基本的 sql 数据库的东西。
标签: mysql symfony sql-update dbal