2013-02-06 207 views
5

我想只接受来自用户的小写字母和大写字母。只允许大写字母和小写字母

我试过下面的代码,它回应无效的字符消息,但不起作用。我的意思是它没有检查。它只是显示消息。任何帮助?

<form action="" method="post"> 
<input type="text" name="fname"> 
<input type="submit" value="Send" name="submit"> 
</form> 

更新:这就是我要检查并插入名称数据库。如果名称中的数字通过显示错误消息来拒绝该名称,否则如果该名称仅包含字母,则将其插入数据库中。这就是我想要的成就。

<?php 
if (isset($_POST['submit'])) { 
$fname = $_POST["fname"]; 

if(!preg_match ('/^([a-zA-Z]+)$/', $fname)){ 
echo "Invalid characters"; 
} 

if (empty($fname)) { 
echo '<span> First name is required</span>'; 
} 

else{ 
$mysqli = new mysqli("localhost", "root", "", "test"); 
$stmt = $mysqli->prepare("INSERT INTO test (firstname) VALUES (?)"); 

$stmt->bind_param("s", $fname); 
$stmt->execute(); 

$stmt->close(); 

$mysqli->close(); 


} 
} 
?> 
+2

'$ fname'里有什么?其上面写着它的 –

+0

。它的一个帖子变量 – diEcho

+0

你的意思是?它从表单获取用户输入。 – alte

回答

0

利用这一点,这是给我正确的答案

if(!preg_match ('/^([a-zA-Z]+)$/', $fname)){ 
    echo "Invalid characters"; 
} 
else{ 
    echo "correct"; 
} 
+0

我想要显示的单个错误,我的意思是..如果用户输入数字,我会让他知道错误,并转到我的else语句,而不是返回true,如果输入只匹配字母.. – alte

+0

此模式将匹配任何输入字符串。只要至少有一个字母,使用'+'的变体仍然会匹配包含任意数量的非字母字符的字符串。 –

+0

@alte,john - 我已经纠正了我的错误,现在检查.. – sourcecode

1

检查不将[a-zA-Z]模式相匹配的字符的总的想法是好的。

但是,如果要使其工作,则您的if条件的“不”部分出错了。你现在得到的只是确保fname中的任何单个字符都是大写或小写拉丁字母。

你想逻辑的“而不是”部分推入模式:

if (preg_match('/[^a-zA-Z]/', $fname)) { 

此检查在fname任何字符不是拉丁字母,这是你想要做什么。你的新更新有一个不同的测试,也可以工作(它似乎来自源代码的更新答案,但你有来自不同答案的几个测试,这将工作得很好)。但是,更新后的帖子明确指出,您的问题与测试名称的模式并不相同。

你的代码如下所示:

if (/* invalid fname */) { 
    echo "Invalid characters"; 
} 

if (/* empty fname */) { 
    echo '<span> First name is required</span>'; 
} 

else { 
    /* insert into database */ 
} 

else子句只依赖于在它之前紧跟的if:检查fname是否为空。换句话说,不管您对fname这些字符的检查结果如何,只要它不是空的,就将其插入数据库。

解决此问题的一个简单方法是将您的第二个if更改为elseif。这会将所有三个条件链接在一起,因此最后的else块只会在前面的条件不打印错误消息未触发的均为时才会发生。

if (/* empty fname */) { 
    echo 'First name is required.'; 
} 

elseif (/* invalid fname */) { 
    echo 'Invalid characters'; 
} 

else { 
    /* insert into database */ 
} 
+0

它不适用于我..我按照你所说的做了,但错误没有显示... – alte

+0

是你发布的代码是否与它一模一样在你的脚本中?您发布的代码有语法错误:'else'子句的右括号作为“做某事”注释的一部分隐藏。 –

+0

我已经发布整个代码 – alte

5
if(!isset($_POST['fname']) || !ctype_alpha($_POST['fname'])){ 
    // can i haz alpha letters only? 
} 

reference

5

如果你只是要检查,你可以使用ctype_alpha()但你说你要接受只有字母,所以如果您选择接受输入你可以:

检查后
$fname=preg_replace('/[^a-z]/i','',$fname); 

更好

+0

谢谢。删除不需要的字符比允许用户发送任何他们想要的更好。 – alte

+0

这个,我喜欢这个方法!去掉所有不好的东西,并用客户端js验证它是否是Web应用类型的东西。 – stefgosselin

1

这段代码有几个问题,你坚持使用的可能是你在同一个PHP文件中有表单和处理。这是可能的,但它需要一种不同的方法。对于初学者来说,分开它们可能会更好。

发布的代码会发生什么情况是PHP处理器在没有提交表单时尝试处理表单数据,甚至没有检查数据的存在。现在$fname未定义,所以测试总是失败。

测试也是错误的。现在只检查$fname是否至少包含一个字母。例如,if(!preg_match ('/^[a-zA-Z]+$/', $fname))会测试$fname由一个或多个Ascii字母组成,而没有其他字符。

+0

我在同一页面中有表单和php,它不是一个问题,因为我只在按下提交按钮时才运行php。其实我在这里发布代码时没有包括那部分......对于测试部分,这是我正在尝试做的。我的目标不是只检查是否有数字,但如果有数字则拒绝输入。 – alte

相关问题