2016-03-27 14 views
0

Basit bir kelime için kullanıcı girdisini sınamak için basit bir oyun beklendiği gibi çalışmıyor. Koşullar değerlendirildiğinde hiçbir şey ekrana geri gönderilmez. Eminim bu basit bir problemdir, ancak buradaki soruların/cevapların çoğu aradığımdan daha karmaşıktır.Neden gizli kelime işlevim düzgün çalışmıyor

Çalıştığım şey budur. Kullanıcıdan tam olarak 9 karakterden oluşan bir kelime girmesini isteyin ve @ sembolünü içermelidir. Tüm klavye karakterleri de canlı. Gerekirse, gereksinimin karşılanmadığı veya başarı sağlanamadığı takdirde kullanıcıya eko yapın.

<?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

Belki de yanlıştır, çünkü ASCII karakterinin yerine @ html varlığını sınamaktasınız '' '' –

+0

' preg_match ("/ @ /", $ secret_word). Ama eğer '' (strpos ($ secret_word, '@')! == false '' komutunu kullanabilirsiniz. –

cevap

1

Tanrım, daha ben

echo $wordTest();

PHP soran daha ben ... Bu cevap dibine okuyunuz .... Burada soru koduyla yanlış bkz olduğunu bak Bir işlevin sonucunu döndürmek için, ancak işlev tanımlanmamışsa, bunun yerine ekli parantezleri olmayan değişkeni $ wordTest değişkenine eklemeyi düşünebilirsiniz.

Yani

Değişim

echo $wordTest();

echo $wordTest;

için P.S.:

Verirsin Fred-ii'nin ima ettiği gibi, betikinizde PHP hatası raporlamasını etkinleştirdiyseniz, bunu kolayca keşfetmiş olmalısınız.


Research Error reporting on StackOverflow. P.P.S:

İşleviniz bir felaket, sizin fonksiyon return bir değer, ekrana direkt baskı olmamalıdır. Yani böylece, tanımlanmış metindir bir değişken ing return ile echo metnin tüm oluşumlara değiştirmeniz gerekiyor:

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

haline gelmelidir: Bunun anlamı

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. 

bu da sahip olduğunda:

$wordTest = secretWord(); 

$wordTesttarafından döndürülen değerine eşit olacaktır Oişlevi. return olmadan, $wordTest değeri her zaman NULL olacaktır.


fazla bilgi: Bu vermek gerekir böylece

[bu değer tanımlı olmadığını veya anlam] $secret_word kapsamı, sen beyan işlevi içinde değil olduğunu Doğru cevabı almak için fonksiyona değer.

Yani: işlevinizi bildirmek ve parantez içinde değişken yerleştirin:

function secretWord($givenWord) { 

Sonra işlev Refactor içine $givenWord için $secret_word denilen tüm değişkenler. Sonra fonksiyonun dışında, bunu referans ederek işlevine gizli kelimeyi geçmesi gerekiyor:

$wordTest = secretWord($secret_word); 

veya Alternatif

echo secret_word($secret_word); 

aslında yapmıyorsunuz çünkü $wordTest değişkenine sahip bir başka değişkene ihtiyacınız yoksa yout HTML'de bunu yapabilirsiniz:

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

s işlevinin ne olursa olsun yankılanacaktır.


Ayrıca $_POST girişler HTML (özel) karakterleri, bunlar karakter-set böylece mevcut arama paterni karakter dizesi arıyor, form gönderilen edildiğini olur karakterler olacak olmayabilir olacak , başka bir karakterin yerine asla görünmez.


Değişikliklerin, senin için tüm kodu yeniden yazmayı değilim için geçerli kod tüm varlıklara burada önerilen değişikliklerin her uygulamak gerekecektir.

Lütfen PHP Variable Scopes ve PHP user-defined functions adreslerini okuyun.

+0

Kılavuz ve girişi takdir edin. Bunu 2 hafta boyunca öğrendim. Öğrenmek ve çalışmak için çok şey var. js'den biraz farklı. Hala bu program için yapılacak bazı düzeltmeler var ama tekrar teşekkürler! – allendks45

+0

@ allendks45 hepsi sözdiziminde, javascript'i bir araya getirdiğimde benzer sözdizimsel yapı sorunlarım var. Onunla iyi şanslar :-) – Martin

+0

@ allendks45 son notları bir çift: PHP çok baytlı dize fonksiyonları ('mb_') kullanarak aramak ve ayrıca anlamak ve anlamak (yani google!) PHP Object Orientated yaklaşımı, gibi şeyler yapacak '' 'işlevinin beyanı daha geleceğe dönük. :-) – Martin