在更新Database |之前检查变量的类型PHP

时间:2016-10-14 07:05:25

标签: php mysql pdo

我有此功能可为相应的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的整数。

这里有什么解决方案?

1 个答案:

答案 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,抛出它,捕获它并将报告发送回客户端