PHP动态构造DNS类型变量传入dns_get_record报错,求解决方法
动态获取DNS类型参数导致dns_get_record报错的解决办法
问题出在参数类型不匹配:PHP里的DNS_A这类是预定义常量,对应一个整数值(比如DNS_A的值为1),而你通过拼接得到的$type是字符串"DNS_A",dns_get_record函数需要的是常量对应的整数值,而非字符串形式的常量名,因此直接传变量会报错。
解决方法
方法一:用constant()函数转换字符串为常量值
将拼接后的常量名字符串转为对应的值,同时建议先验证常量是否存在,避免非法参数引发错误:
$typeStr = strtoupper($_GET['type']); $constantName = "DNS_" . $typeStr; // 验证常量是否合法,防止恶意输入 if (!defined($constantName)) { die("无效的DNS记录类型"); } $type = constant($constantName); $array = dns_get_record($domain, $type);
方法二:维护允许的类型映射数组(更安全)
直接定义支持的DNS类型与对应常量的映射表,避免用户传入恶意参数触发未知常量:
// 按需添加你需要支持的DNS类型 $allowedDnsTypes = [ 'A' => DNS_A, 'AAAA' => DNS_AAAA, 'MX' => DNS_MX, 'NS' => DNS_NS, 'CNAME' => DNS_CNAME ]; $typeStr = strtoupper($_GET['type']); if (!isset($allowedDnsTypes[$typeStr])) { die("无效的DNS记录类型"); } $type = $allowedDnsTypes[$typeStr]; $array = dns_get_record($domain, $type);
直接传DNS_A能正常运行,是因为PHP会自动将这个常量解析为对应的整数值,而字符串形式的常量名无法被函数识别。
内容的提问来源于stack exchange,提问作者xowim46108
相关产品推荐
相关产品推荐

