我有一个功能,可以为相应的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/

10-14 13:09
查看更多