使用PHP检查用户HTML表单输入

时间:2013-11-22 16:43:27

标签: php

我正在创建一个Web应用程序,它接受用户输入(Scientific Paper DOI)并查询数据库以显示图形。我一直在尝试通过检查用户输入是否匹配正确的DOI来限制与远程服务器(带有Web服务器的私有DMZ)之间的数据库连接...如果它没有连接到数据库我希望如果有很多用户同时进行查询,这将有助于加速应用程序。

Pseudo:所有纸张DOI都以“10.1103 /”开头,因为它们都是物理论文。这部分我已经使用substr正确实现了。接下来,我想检查输入中的每个字符,以确保它只包含这些字符:

  • “/”
  • “”

示例DOI:

  • 10.1103 / RevModPhys.9.1
  • 10.1103 / RevModPhys.76.1015
  • 10.1103 / PhysRevLett.95.208304

这是我的代码:

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,则代码的底部将被修改。

感谢您的帮助!

3 个答案:

答案 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