2013-02-06 23 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

私がしたいのは、単一のエラーを表示することです。ユーザーが数字を入力すると、入力が唯一の場合にtrueを返すのではなく、 letters .. – alte

+0

このパターンは入力文字列と一致します。 '+'付きの変数は、文字が1文字以上ある限り、任意の数の文字以外の文字を含む文字列と一致します。 –

+0

@alte、john - 私の間違いを訂正しました。 – sourcecode

1

くれ[a-zA-Z]パターンが良いものであると一致しない文字をチェックする一般的な考えを正しい答えを与えています。

ただし、これを機能させたい場合は、if条件の「不」部分が間違った場所にあります。今あなたが持っているのは、のいずれかの文字がfnameの大文字または小文字のラテン文字であることを確認するだけです。

あなたがパターンにロジックの「ない」の部分をプッシュする:

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

このチェックをfname内の任意の文字は、あなたがやろうとしているされているもの、ラテン文字でない場合。

編集:あなたの新しいアップデートには別のテストもあります(これはソースコードの更新された回答からのものですが、ここではさまざまな答えからいくつかのテストがあります)。しかし、あなたの更新された投稿は、あなたの問題が本当に名前をテストするためのパターンではないことを明確にしています。

あなたのコードは次のようになります。else句だけすぐに前に来るifに依存していること

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

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

else { 
    /* insert into database */ 
} 

fnameが空であるかどうかをチェックします。つまり、チェック結果がfnameの文字とは関係なく、空でないときはいつでもデータベースに挿入します。

これを修正する簡単な方法は、elseifに2回目のifを変更することです。これにより、3つの条件がすべて連鎖するため、最後のelseブロックは、の両方が、印刷エラーメッセージが表示されなかった以前の条件のの場合にのみ発生します。

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

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

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

それは私のために働いていません...あなたが言ったようにエラーは表示されていません... – alte

+0

投稿したコードは正確ですあなたのスクリプトにありますか?あなたの投稿されたコードに構文エラーがあります: 'else'節の閉じ括弧はdo somethingのコメントの一部として隠されています。 –

+0

私は全体のコードを再度投稿しました – alte

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

reference

5

あなたはちょうどあなたがctype_alpha()を使用することができます確認したいが、あなたは、あなたが可能性の入力を受け入れることを選択ので、もし文字のみをACCEPT にしたいと述べている場合:

確認後
$fname=preg_replace('/[^a-z]/i','',$fname); 

良く

+0

ありがとうございます。ユーザーが望むものを送信できるようにするよりも、望ましくない文字を削除する方が良いでしょう。 – alte

+0

これは、私はこのアプローチが好きです!すべての悪いものを取り除き、それがウェブアプリのタイプのものならクライアント側のjsで検証してください。 – stefgosselin

1

コードにはいくつかの問題があります。あなたが抱えている問題は、おそらく同じPHPファイルでフォームとその処理があることでしょう。それは可能ですが、別のアプローチが必要です。スターターにとっては、それらを分けるほうが良いでしょう。

投稿されたコードでは、フォームが送信されていないときに、PHPプロセッサがフォームデータを処理しようとしました。今すぐ$fnameは未定義なので、テストは常に失敗します。

テストも間違っています。現在は、$fnameに少なくとも1文字が含まれているかどうかを確認するだけです。たとえば、​​は、$fnameが1つ以上のAscii文字で構成されていることをテストします。

+0

私はフォームとphpを同じページに持っています。なぜなら、submitが押されたときにのみPHPを実行させたからです。実際には、ここにコードを投稿するときにその部分を含めなかった...テストパートのために、私がやろうとしていることです。私の目的は、数字があるかどうかをチェックするのではなく、数字があれば入力を拒否することです。 – alte

関連する問題