我正在做一些有学习目的的测试。我有一个PHP脚本,我在其中使用了一些函数来查看它们的工作原理:
首先,我使用了isset来确保var存在
然后empty
以确定var是否具有某些值
最后,我使用trim
删除了空格
经过一些测试后,我意识到修剪功能无法正常工作。
例如,我仍然可以写whitespaceCHARwhitespace
,然后我使用strlen
函数,结果得到3。我的剧本出了什么问题?
顺便说一下,我想知道这种表格验证是否可以接受,我希望避免一些sqlinjection。
提前致谢。
<span><?php echo $msg;?></span>
<form method="POST">
<label for="name" class="white-headers">NAME</label>
<input type="text" name="name" id="name" class="form-control">
<label for="last_name" class="white-headers">LAST NAME</label>
<input type="text" name="last_name" id="last_name" class="form-control">
<input type="submit" class="btn btn-success" name="submit">
</form>
$msg="";
if(isset($_POST["submit"])){
$name = $_POST["name"];
$last_name = $_POST["last_name"];
if(!empty(trim($name)) && !empty(trim($last_name))){
$name_len=strlen($name);
$last_name_len=strlen($name);
$msg="<div class='alert alert-success'>
both fields are set and have some value name =".$name." with ".$name_len." chars and last_name =".$last_name."
with ".$last_name_len. "chars</div>";
}
else{
$msg="<div class='alert alert-danger'>
both fields are set but one or both are empty name =".$name." and last_name =".$last_name."</div>";
}
}
答案 0 :(得分:2)
您使用trim
的唯一时间是检查修剪变量后是否还剩下任何内容:
if(!empty(trim($name)) && !empty(trim($last_name))) {
这不会影响$name
和$last_name
。
trim
返回删除了空格的字符串,但不会更改作为参数给出的变量的值。如果您希望修剪这些内容以供以后在代码中使用,则需要将它们设置为修剪后的值,例如$name = trim($name)
等。
在您的情况下,当您最初从$_POST
设置它们时,您可能会修剪它们。
$name = trim($_POST["name"]);
$last_name = trim($_POST["last_name"]);
然后你可以检查是否还有更简单的东西:
if ($name && $last_name) {
empty
不是必需的,因为您知道它们已设置,并且零长度字符串的计算结果为false。
答案 1 :(得分:-1)
如documentation中所述,trim
仅删除字符串开头或结尾的空格。中间的空格不受影响(使用_
标记空格):
__string
将成为string
string__
将成为string
s_t_r_i_n_g
将保持s_t_r_i_n_g
另外,正如Don't Panic's answer中所指出的那样,您正在检查 trim
之后的字符串,而不是其返回值。
关于表单验证:如果要在应用程序中使用它们之前清理输入,只需修剪它们是不够的。有许多方法可以清理输入,每个框架都提供了一些选项,但由于你特别提到sqlinjections,我的建议是从阅读PHP的mysqli.real_escape_string
开始