2016-06-30 15 views
0

関数を使用してフォームのポストを検証し、データベースに挿入したいと考えています。 私はそれを関数に入れないで行うことができましたが、入力フィールドを検証せずに挿入する関数に入れました。 おかげで、ここでは) は私のコードです:カスタム関数を使用してポストデータをPHPで検証する方法

<?php 
     function validate_post(){ 
      global $link; 

      if (isset($_POST['submit'])) {   
       $error = array(); 

       if (!isset($_POST['cat_title']) || empty($_POST['cat_title'])) { 
        $error[] = "field cannot be empty"; 
       } else { 
        //check if a name only contains letters and whitespace 
        if (!preg_match("/^[a-zA-Z]*$/", $_POST['cat_title'])) { 
         $cat_err = "Only letters and whitespace allowed"; 
        } 
       } 
       //if no errors found 
       if (empty($error) && empty($cat_err)) { 
        $cat_title = htmlentities($_POST['cat_title']); 
        $sql = "INSERT INTO categories(cat_title)VALUES('$cat_title')"; 
        $insert = mysqli_query($link, $sql); 
        confirm_query($insert); 
        if (mysqli_affected_rows($link) == 1) { 
         $post_info = "Category has been added"; 
         redirect("categories.php"); 
        } else { 
         $post_info = "Adding category failed"; 
        } 
       } else { 
        $post_info = "Field cannot be empty"; 
       } 
      }  
     } 
    ?> 

<?php validate_post(); ?><!-- call validate_post function--> 
<!-- ADD CATEGORY FORM --> 
<form action="" method="post"> 
<?php 
    if(isset($post_info))echo $post_info."<br>"; 
    if(isset($cat_err))echo $cat_err."\n" ?> 
    <div class="form-group"> 
     <label for="cat_tile">Categories</label> 
     <input type="text" class="form-control" name="cat_title" id="cat_tile"/> 
    </div> 
    <div class="form-group"> 
     <input type="submit" class="btn btn-primary" value="+ Add Category" name="submit" > 
    </div> 
</form> 
+2

データは、関数に掲載されていませんが、..あなたは、例えば、参照によって関数に '$ _POST'からのデータを渡す必要が役立ちます – Matt

+0

は、ポストデータを関数に渡します。 –

+3

'$ _POST'は、それを関数に渡す必要のないグローバル変数です(関数のfoo($ bar){if(isset($ bar)それを機能の中で使うこと。 – Aron

答えて

-1

<?php 
    function validate_post(){ 
     global $link; 

     if (isset($_POST['submit'])) { 
      $cat_err = ""; 
      if (!isset($_POST['cat_title']) || empty($_POST['cat_title']) || $_POST['cat_title']=="") { 
       $cat_err = "field cannot be empty"; 
      } else { 
       //check if a name only contains letters and whitespace 
       if (!preg_match("/^[a-zA-Z]*$/", $_POST['cat_title'])) { 

        $cat_err = "Only letters and whitespace allowed"; 
       } 

      } 

      //if no errors found 
      if ($cat_err=="") { 
       $cat_title = htmlentities($_POST['cat_title']); 
        $sql = "INSERT INTO categories(cat_title)VALUES('$cat_title')"; 
        $insert = mysqli_query($link, $sql); 
        confirm_query($insert); 
        if (mysqli_affected_rows($link) == 1) { 
         $cat_err = "Category has been added"; 
         redirect("categories.php"); 
        } else { 
         $cat_err = "Adding category failed"; 
        } 

      } else { 
       $cat_err = "Field cannot be empty"; 
      } 
      return $cat_err; 
     } 
    } 
    ?> 
    <?php $data=validate_post();echo $data;?><!-- call validate_post function--> 
    <!-- ADD CATEGORY FORM --> 
    <form action="" method="post"> 

     <div class="form-group"> 
      <label for="cat_tile">Categories</label> 
      <input type="text" class="form-control" name="cat_title" id="cat_tile"/> 
     </div> 
     <div class="form-group"> 
      <input type="submit" class="btn btn-primary" value="+ Add Category" name="submit" > 
     </div> 

    </form> 
-2

の$ _POST配列に渡すようにしてください:

if (isset($_POST['submit'])){ 
    validate_post($_POST) 
} 

function validate_post($post_array) { 
    // your code here 
} 

マットが最初にこのことを示唆したが、ここでは、あなたがそれを行うだろうかです。

-2

あなたのコードを使って、これはあなたがその機能のために必要とするものです。

<?php 
function validate_post($link, $data=[]) {   
    $error = array(); 

    if (!isset($data['cat_title']) || empty($data['cat_title'])) { 
     $error[] = "field cannot be empty"; 
    } else { 
     //check if a name only contains letters and whitespace 
     if (!preg_match("/^[a-zA-Z]*$/", $data['cat_title'])) { 
      $cat_err = "Only letters and whitespace allowed"; 
     } 
    } 
    //if no errors found 
    if (empty($error) && empty($cat_err)) { 
     $cat_title = htmlentities($data['cat_title']); 
     $sql = "INSERT INTO categories(cat_title)VALUES('$cat_title')"; 
     $insert = mysqli_query($link, $sql); 
     confirm_query($insert); //This is another function you created??? 
     if (mysqli_affected_rows($link) == 1) { 
      $post_info = "Category has been added"; 
      redirect("categories.php"); 
     } else { 
      $post_info = "Adding category failed"; 
     } 
    } else { 
     $post_info = "Field cannot be empty"; 
    } 
} 

if (isset($_POST['submit'])) { 
    include 'dbfile.php'; // Containing your db link variable if that is how you've done it 
    validate_post($link, $_POST); // Usually you need to pass your database link by reference also rather than by global. 
} 

?> 

--html section-- 
-1

機能は情報を返しません。エラーを返すように指示してから、エラーを返す必要があります。関数内でメッセージが整理される方法を再構成する必要がありますが、要点は

return $error;をvalidate関数の最後に追加します。あなたのページのボディに続いて

:だから

<?php $errors = validate_post(); ?><!-- call validate_post function--> 
<!-- ADD CATEGORY FORM --> 
<form action="" method="post"> 
    <?php 
    foreach($errors as $error) 
    { 
    echo $error; 
    } 
    ?> 
    <div class="form-group"> 

、アイテムを処理、その後、単一のアレイにすべてのメッセージを保存する配列を返すために、あなたの検証機能を変更します。

関数内で宣言された変数は、その関数のスコープ内にのみ存在します。関数内の$post_infoは、関数外の$post_infoとの関係はありません。コードの下

+0

*編集* - これが不思議に反応したコメントは削除されました... *彼は関数の配列として '$ error'を宣言しました。私が '$ errors = validate_post();'を定義した方法は間違っていません。関数のスコープ外の変数は、関数のスコープ内の変数と関係がありません。 – Wade

関連する問題