我正在创建一个Web应用程序,它接受用户输入(Scientific Paper DOI)并查询数据库以显示图形。我一直在尝试通过检查用户输入是否匹配正确的DOI来限制与远程服务器(带有Web服务器的私有DMZ)之间的数据库连接...如果它没有连接到数据库我希望如果有很多用户同时进行查询,这将有助于加速应用程序。
Pseudo:所有纸张DOI都以“10.1103 /”开头,因为它们都是物理论文。这部分我已经使用substr正确实现了。接下来,我想检查输入中的每个字符,以确保它只包含这些字符:
示例DOI:
这是我的代码:
function checkDOI($doi) {
if (substr($doi, 0, 8) != "10.1103/") {
echo "Invalid DOI";
return false;
}
for ($n = 0; $n < strlen($doi)+1; $n++) {
if ( !ctype_alnum($doi[n]) && $doi[n] != "." && $doi[n] != "/") {
echo "Invalid DOI";
return false;
}
}
echo "Valid DOI";
return true;
}
if(isset($_POST['submit'])) {
$doi_input = $_POST['doi_input'];
checkDOI($doi_input);
}
我第一次使用PHP和javascript,伪是相当简单但由于某种原因,第二个if语句有问题。不确定我是否真的可以这样做。 Echos只是用于测试。
您认为对每个输入进行此检查会显着减慢应用程序的速度吗?是否值得限制与mysql的连接数量?
如果check检查数据库,如果checked返回true,则代码的底部将被修改。
感谢您的帮助!
答案 0 :(得分:0)
您的错误是$doi[n]
,它不是数组,如果索引无效。
所以使用像
这样的函数$chars_doi = str_split($doi);
在循环之前获取一个字符数组然后在循环中使用
$chars_doi[$n]
所以你应该有类似的东西:
$chars_doi = str_split($doi);
$size = sizeof($chars_doi) - 1;
for ($n = 0; $n < $size; $n++) {
if (!ctype_alnum($chars_doi[$n]) && $chars_doi[$n] != "." && $chars_doi[$n] != "/") {
echo "Invalid DOI";
return false;
}
}
小提示,避免使用诸如strlen
/ sizeof
之类的函数作为循环参数,否则将在每次迭代时调用它。性能最好事先将值存储在变量中。
答案 1 :(得分:0)
检查输入中的每个字符,以确保它只包含这些字符
我建议你使用preg_match
。试试这个:
$value="10.1103/RevModPhys.9.1";
if(preg_match("/^[a-zA-Z0-9\/.]+$/", $value)){
echo "match found";
}else{
echo "no match found";
}
点击此处:Demo
了解更多信息:preg_match
答案 2 :(得分:0)
我会这样做:
if (! preg_match ('#^10\.1103/[\p{L}\p{N}.-_]+$#', $doi)) {
... // bad
return;
}
// good
参考:
http://www.php.net/manual/en/reference.pcre.pattern.syntax.php http://php.net/manual/en/regexp.reference.unicode.php