Php 验证表单中的字符串大小

Php 验证表单中的字符串大小,php,validation,symfony,doctrine-orm,Php,Validation,Symfony,Doctrine Orm,在设置要与Symfony表单一起使用的条令实体时,我希望验证给定的字符串大小不会超过数据库的列大小。请注意,我使用的是单词size而不是length Symfony附带了许多验证约束,特别是。然而,看看它的文档 计算值的长度时要使用的字符集。这个 如果可用,则使用grapheme_strlen PHP函数。若否,详情为何? 如果可用,则使用mb_strlen PHP函数。如果两者都不可用, 使用strlenphp函数 它使用grapheme\u strlen或mb\u strlen返回字符串的可

在设置要与Symfony表单一起使用的条令实体时,我希望验证给定的字符串大小不会超过数据库的列大小。请注意,我使用的是单词size而不是length

Symfony附带了许多验证约束,特别是。然而,看看它的文档

计算值的长度时要使用的字符集。这个 如果可用,则使用grapheme_strlen PHP函数。若否,详情为何? 如果可用,则使用mb_strlen PHP函数。如果两者都不可用, 使用strlenphp函数

它使用
grapheme\u strlen
mb\u strlen
返回字符串的可视长度,而不是实际大小。在处理非ASCII字符串时,实际大小是一个因素。例如,大多数亚洲语言每个字符使用3个字节

关于
@Column(length)
注释,它没有说明任何内容,这让我相信这是一个字节计数。因此,如果我声明一个长度为64的列和一个最大大小为64的约束,那么就会出现问题


现在,我可以使用自定义约束,甚至可以创建自定义约束。但是,还有更好的办法吗?从表单字段接收的字符串在持久化到数据库之前应该如何验证其大小?

是的,文档中确实提到了将在两者之间选择的函数顺序

然而,这让我思考,我亲自去看了源代码。没有这种东西的踪迹。我倾向于相信,他们想说,这些函数将用于确定字符集,然而,在源代码中也不存在这样的东西。我认为这是某种打字错误,复制/粘贴错误

,看看:

$stringValue = (string) $value;
if ('UTF8' === $charset = strtoupper($constraint->charset)) {
    $charset = 'UTF-8'; // iconv on Windows requires "UTF-8" instead of "UTF8"
}

$length = @iconv_strlen($stringValue, $charset);
$invalidCharset = false === $length;
事实上,它们用来确定正确的长度。我认为可以放心地假设您的验证会很好

至于
@列
长度
参数,该参数不用于验证,而是用于模式创建/迁移过程。因此,不应将其视为验证过程的保障措施


希望这能有所帮助。

是的,文档中确实提到了将在两者之间选择的函数顺序

然而,这让我思考,我亲自去看了源代码。没有这种东西的踪迹。我倾向于相信,他们想说,这些函数将用于确定字符集,然而,在源代码中也不存在这样的东西。我认为这是某种打字错误,复制/粘贴错误

,看看:

$stringValue = (string) $value;
if ('UTF8' === $charset = strtoupper($constraint->charset)) {
    $charset = 'UTF-8'; // iconv on Windows requires "UTF-8" instead of "UTF8"
}

$length = @iconv_strlen($stringValue, $charset);
$invalidCharset = false === $length;
事实上,它们用来确定正确的长度。我认为可以放心地假设您的验证会很好

至于
@列
长度
参数,该参数不用于验证,而是用于模式创建/迁移过程。因此,不应将其视为验证过程的保障措施


希望这能有所帮助。

我想你没有抓住我问题的重点。即使使用iconv\u strlen,我也无法获得字符串的字节计数,但数据库列是由字节大小定义的。验证从表单返回的字符串长度以及要添加到数据库中的内容时,出现不匹配。我认为您没有抓住我问题的重点。即使使用iconv\u strlen,我也无法获得字符串的字节计数,但数据库列是由字节大小定义的。验证表单返回的字符串长度以及要添加到数据库的内容时,会出现未匹配。