我有一个功能,可以为相应的user_token
更新user_id
:
public function setUserToken($userId, $userToken)
{
$stmt = $this->conn->prepare("UPDATE $this->dbname.user SET user_token=:user_token WHERE user_id=:user_id;");
try {
$stmt->bindParam(':user_token', $userToken, PDO::PARAM_STR, 70);
$stmt->bindValue(':user_id', "sdf", PDO::PARAM_INT);
$result['success'] = $stmt->execute();
$result['message'] = "Successfully updated user_token for user_id " . $userId;
} catch (PDOException $e) {
$result['success'] = false;
$result['message'] = "Failed to update user_token with error: " . $e->getMessage();
}
return $result;
}
用这句话:
$stmt->bindValue(':user_id', "sdf", PDO::PARAM_INT);
和try-catch
操作,我试图在user_id
不是整数时抛出错误。但是失败了。我想这是因为PHP会自动将“sdf”字符串转换为值为0的整数。
这里的解决方案是什么?
最佳答案
是的,你是对的。PDO不使用绑定强制类型转换。这可能是由于可能的错误和精度-它是更安全的发送一些值作为字符串,让一个数据库按其自身排序的问题。
在PHP7中,可以声明一个函数参数并向PHP发出提示,它必须是什么类型:
function whatever (int $id)
{
echo $id;
}
whatever("sdf");
会像你想的那样抛出异常。
如果您的PHP已经过时,那么您必须编写一个代码来手动检查。对于要使用的特定函数,您必须决定是否要检查变量的类型或其内容。对于前者,可以使用
is_int()
函数,对于后者,可以使用ctype_digit()
函数。if (!ctype_digit($user_id))
{
throw new Exception("Whatever");
}
另外,
请注意,错误处理是错误的。您不应该在适当的位置捕捉到错误,将代码保留为
public function setUserToken($userId, $userToken)
{
$stmt = $this->conn->prepare("UPDATE $this->dbname.user SET user_token=:user_token WHERE user_id=:user_id;");
$stmt->bindParam(':user_token', $userToken, PDO::PARAM_STR, 70);
$stmt->bindValue(':user_id', "sdf", PDO::PARAM_INT);
$result['success'] = true;
$result['message'] = "Successfully updated user_token for user_id " . $userId;
return $result;
}
而错误报告必须集中且安全,如所述here
如果你想把验证错误报告给客户端,我看不出有什么意义,但是如果你还想这样做,或者直接从验证代码返回这个错误消息,
if (!ctype_digit($user_id))
{
$result['success'] = false;
$result['message'] = "wrong data type";
}
或者创建一个不同的ValidationException,抛出它,捕获这个并将报告发送回客户机
关于php - 在更新数据库之前检查变量的类型。的PHP,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40036972/