2016-03-27 197 views
0

简单的游戏来测试用户输入的秘密词是不是按预期工作。评估条件时没有任何东西返回到屏幕上。我很确定这是一个简单的问题,但这里的大多数问题/答案比我想要的要复杂得多。为什么我的秘密词功能不能正常工作

这就是我正在与之合作。要求用户输入正好9个字符的单词,并且必须包含@符号。所有的键盘字符都是现场直播。如果不符合要求,则向用户回传,如果符合要求则回应。

<?php 
if (!isset($secret_word)) { 
    $secret_word = ''; } 
/* prompt user to enter a secret word that contains 9 characters of which one must be @ sign and all keyboard characters are allowed. if the secret word isn't correct output what is wrong with the word. */ 

#get user input 
$secret_word = filter_input(INPUT_POST, 'secret_word'); 
$wordTest = secretWord(); 
function secretWord() { 
if (strlen($secret_word) < 9) { 
    echo "Secret word is too short!"; } 

if (strlen($secret_word) > 9) { 
    echo "Secret word is too long!"; } 

if (!preg_match("&#64", $secret_word)) { 
    echo "Secret word must contain &#64 sign"; } 

if (strlen($secret_word) == 9 && preg_match("&#64", $secret_word)){ 
    echo "$secret_word contains 9 characters and one sign.";} 

} 
?> 
<!doctype html> 
<html> 
<head> 
<meta charset="utf-8"> 
<link rel="stylesheet" type="text/css" href="q4.css"> 
<title>Untitled Document</title> 
</head> 

<body> 
<div class="header"> 
<header><h1>Secret Scroll Game</h1></header> 
</div> 

<div class="output"> 
<p><?php echo $wordTest(); ?></p> 

</div> 
<div class="link"> 
<a href="q4_index.html">Back To Homepage</a> 
</div> 
</body> 
</html> 
+3

http://php.net/manual/en/function.error-reporting.php –

+0

也许这是错误的,因为您正在测试html实体'&#64'而不是ASCII字符'@' –

+0

' preg_match(“/ @ /”,$ secret_word)'。但是你可以使用'if(strpos($ secret_word,'@')!== false)''。 –

回答

1

哎呀,我越是看我看错这里的代码有问题....请仔细阅读这个答案的底部...更

echo $wordTest();是问PHP要返回一个函数的结果,但函数没有被定义,你可能会打算在$ wordTest中添加一个没有括号的变量。

所以

变化

echo $wordTest();

echo $wordTest;

P.S:

你会如Fred-ii所暗示的,如果您已启用脚本的PHP错误报告,则可以非常轻松地发现此问题。 Research Error reporting on StackOverflow.


P.P.S:

你的函数是一个烂摊子,你的函数应该return一个值,而不是直接打印到屏幕上。所以,你需要return更换echo文本的所有 occurances荷兰国际集团一个变量,它是定义的文本,所以:

function secretWord() { 
if (strlen($secret_word) < 9) { 
    echo "Secret word is too short!"; } 

应该变成:

function secretWord() { 
if (strlen($secret_word) < 9) { 
    $var = "Secret word is too short!"; 
} 
... 
//etc. etc. do this for each text if statement... then: 
return $var; //give the text value back to were the 
//function was called from. 
} //this closes the function. 

这意味着,当你有:

$wordTest = secretWord(); 

$wordTest将等于由返回的值功能。 没有return$wordTest的值将始终为NULL


的更多信息:

[其中该值被定义,或不意味着]的$secret_word范围是所声明在函数内部,因此需要给这个值的函数来获得正确的响应。

所以:宣布你的功能,并将该变量在括号:

function secretWord($givenWord) { 

然后是功能重构中的所有变量称为$secret_word$givenWord然后之外的功能,你需要加密词传递给引用你的函数,所以:

$wordTest = secretWord($secret_word); 

echo secret_word($secret_word); 

或者因为你没有实际做其他任何与$wordTest变量你并不真的需要它,所以在HTML你可以做的只是:

<div class="output"> 
<p><?php echo secretWord(); ?></p> 

这将回应出任何功能返回 s。


而且$_POST输入将不会是HTML(特殊)字符,它们将在字符集的形式提交的,所以你当前的搜索模式正在寻找字符的字符串,将字符绝不会出现作为另一个角色的替代品。


您需要申请的每一个的更改应用到,我不是你重写整个代码为你在这里建议在代码中所有实体的变化。

请阅读关于PHP Variable ScopesPHP user-defined functions

+0

欣赏指导和输入。现在已经学习了2周。很多学习和学习。有点不同于js。仍然有一些调整做这个程序,但再次感谢! – allendks45

+0

@ allendks45这一切都在语法中,当我将JavaScript放在一起时,我遇到类似的语法结构问题。祝你好运:-) – Martin

+0

@ allendks45几个最后的笔记:使用PHP多字节字符串函数('mb_')查找,并尝试理解(即谷歌!)PHP面向对象的方法,它会使事情你的'函数'声明更具前瞻性。 :-) – Martin