我有此功能可为相应的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的整数。
这里有什么解决方案?
答案 0 :(得分:1)
是的,你是对的。 PDO不会通过绑定强制执行类型转换。这可能是由于精度可能出错 - 将一些值作为字符串发送更安全,让数据库通过itseslf对事物进行排序。
在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,抛出它,捕获它并将报告发送回客户端