2016-03-28 14 views
-1

私は、基本的なMVC構造を使用している小さなウェブサイトを持っています。 データベースに2つの値を挿入するコードをいくつか持っていますが、新しいデータを表示するには、通常はページを更新するか、別のページに移動してから戻る必要があります。私はこの仕事をするためにJQuery/Ajaxを使う必要があるが、PHP関数を使ってそれを行う方法を本当に理解していないことを理解しています。データを送信し、ページを更新せずに表示

問題のコードは以下の通りです:

PHPの機能:ユーザーが表示されること

<?php 
session_start(); 
require_once('../Config/config.php'); 

class Readings 
{ 
    public $dbconn; 

    public function __construct() 
    { 
     $database = new Database(); 
     $db = $database->dbConnection(); 
     $this->dbconn = $db; 
    } 

    public function enterElecReadings($eUsage) 
    { 
     try 
     {  
      $estmt = $this->dbconn->prepare(" 
       INSERT INTO elec_readings 
        (ElecUsage, DateAdded, AccountNumber) 
       VALUES 
        (:eUsage, NOW(), :accNum)"); 
      $estmt->bindparam(":eUsage", $eUsage); 
      $estmt->bindparam(":accNum", $_SESSION['user_session']); 
      $estmt->execute(); 
      return $estmt; 
     } 
     catch(PDOException $e) 
     { 
      echo $e->getMessage(); 
     } 
    } 

    public function getElecReadings(){ 
     try { 
      $stmt = $this->dbconn->prepare("SELECT ElecUsage, DateAdded FROM elec_readings WHERE AccountNumber = '" . $_SESSION['user_session'] . "'"); 
      $stmt->execute(); 
      return $stmt; 
     } catch (Exception $e) { 

     } 
    } 
} 

?> 

ページ:

if(isset($_POST['btn-submitElecUsage'])) 
    { 
     $eUsage = strip_tags($_POST['txtElecUsage']); 

     try { 
      if($newReading->enterElecReadings($eUsage)){  
       $elecNotif[] = "Reading successfully entered."; 
      } 
     } catch (Exception $e) { 
      echo $e->getMessage(); 
     } 
    } 

<div class="elecUsage"> 
     <form id="elecRead" method="POST"> 
      <h2>Electricity Usage</h2> 

      <?php 
      if(isset($elecError)) 
      { 
       foreach($elecError as $elecError) 
       { 
        ?> 
        <div class="alert alert-danger"> 
         <?php echo $elecError; ?> 
        </div> 
        <?php 
       } 
      } 

      if(isset($elecNotif)) 
      { 
       foreach($elecNotif as $elecNotif) 
       { 
        ?> 
        <div class="alert alert-danger"> 
         <?php echo $elecNotif; ?> 
        </div> 
        <?php 
       } 
      } 
      ?> 

      Please enter your latest electricity meter reading: 
      <br> 
      <input type="text" name="txtElecUsage" required/> 
      <br> 
      <input type="submit" name="btn-submitElecUsage" value="Submit"/> 

     </form> 


     <br> 
     Your previous Electricity meter readings: 
     <br> 

     <div id="previousElecReadings"> 
      <br> 

      <table class="tableElec" > 
       <thead> 
        <tr> 
         <th>Usage</th> 
         <th>Date Added</th>  
        </tr> 
       </thead> 
       <?php 
       foreach ($elec_readings as $elec_reading): ?> 
       <tbody> 
        <tr> 
         <td><?php echo $elec_reading['ElecUsage']; ?></td> 
         <td><?php echo $elec_reading['DateAdded']; ?></td> 
        </tr> 
        <?php 
        endforeach; 
        ?> 
       </tbody> 
      </table> 
     </div> 
    </div> 

コントローラクラス:

<?php 
require_once('../Model/readingsModel.php'); 
require_once('../Tool/DrawTool.php'); 

$newReading = new Readings(); 
// instantiate drawing tool 
$draw = new DrawTool(); 
// parse (render) appliance view 
$renderedView = $draw->render('../View/meterReadings.php', array('elec_readings' => $newReading->getElecReadings()), 
    array('gas_readings' => $newReading->getGasReadings())); 

echo $renderedView; 

?> 

として、私は上記です。挿入がうまくいきます。しかし、私は、データをリフレッシュするのではなく、即座に表示したいのです。

アイデア?

ありがとうございました

+0

ajax(jQueryなど)の例を検索しましたか?そこにはたくさんのことがあります。 – Rasclatt

+0

@Rasclatt私はそれを理解することができないか、機能を働かせることはできません。 – resontant81

+0

あなたが試したことを投稿してください。あなたが逃したシンプルなものがあったかもしれません。 – Rasclatt

答えて

0

純粋なPHPでは、ページを更新せずに実行できません。だからAJAXを使う!

ここで少し例

<html> 
    <head> 
     <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.min.js"></script> 
    </head> 
    <body> 
     <input type="text" id="name"/> 
     <input type="submit" id="submit" value="Send"><br/><br/> 
     <div id="response"><div> 

     <script> 
     $(document).ready(function(){ 
      $('#submit').click(function(e){ 
       e.preventDefault(); 
       var value = $('#name').val(); 
       if (value != ''){ 
        $.ajax({ 
         type: "POST", 
         url: "your_process_file.php", 
         data: { name:value }, 
         success: function(data){ 
          $('#response').html(data); 
         }, 
         fail: function(data){ 
          $('#response').html('There is an error!'); 
         } 
        }); 
       } 
      }); 
     }); 
     </script> 
    </body> 
</html> 

だとyour_process_file.phpは、次のようになります。

$name = $_POST['name']; 
$stmt = $db->prepare('SELECT * FROM tblName WHERE name=?'); 
$stmt->execute([$name]); 
while ($row = $stmt->fetch()){ 
    echo $row['col1'],' ',$row['col2'],' ',$row['colN']; 
} 

そして、あなたは、dbテーブルでいくつかのデータを持っていると仮定すると:

id名アドレス

1 abcアドレス1

あなたがテキストボックスに書くとき

2デフその後

をADDRESS2、FEは、テーブルからABC行全体は、ページを更新せずに<div id="response"></div>の内側に返されます。

OBS:私はテストしなかったので、コードにいくつかのエラーがあると仮定します。

+0

nswerしかし、私は関数を持つモデルクラスを使用しています。 Ajaxファイルでそれをどのように呼び出すのですか? – resontant81

+0

@ resontant81そのクラスには何がありますか?いくつかのコードを表示する... –

+0

データを挿入して選択するための完全なクラスを含めるためにオリジナルの投稿を編集しました – resontant81

1

すべては実際にはブラウザのように動作し、バックグラウンドではそのページに当たっています。データをコールバックするかどうかを選択することもできますが、ブラウザがそのページにアクセスしたように、他のページのように扱うことができます。これはちょうどハックカットアンドペーストであるが、これはおそらく近い:(あなたの最初のページが呼ばれているもの)

のindex.php:

<!-- use the id to target the form --> 
    <form id="elecRead" method="POST"> 
     <h2>Electricity Usage</h2> 
     <!-- You just have an empty container where your ajax will return --> 
     <div id="errors"></div> 
     Please enter your latest electricity meter reading: 
     <br> 
     <input type="text" name="txtElecUsage" required/> 
     <br> 
     <input type="submit" name="btn-submitElecUsage" value="Submit"/> 

    </form> 
    ...etc... 

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.min.js"></script> 

    <script> 
    // When page is done loading 
    $(document).ready(function(){ 
     // When this particular form is submitted 
     $('#elecRead').submit(function(e){ 
      // Stop normal refresh of page 
      e.preventDefault(); 
      // Use ajax 
      $.ajax({ 
       // Send via post 
       type: 'post', 
       // This is your page that will process the update 
       // and return the errors/success messages 
       url: "page2.php", 
       // This is what compiles the form data 
       data: $(this).serialize(), 
       // This is what the ajax will do if successfully executed 
       success: function(response){ 
        // It will write the html from page2.php into an 
        // element with the id of "errors", in our case 
        // it's a div 
        $('#errors').html(response); 
       }, 
       // If the ajax is a failure, this will pop up in the console. 
       error: function(response){ 
        console.log(response); 
       } 
      }); 
     }); 
    }); 
    </script> 

page2.php(処理ページ):

<?php 
// Page two just contains the processing of the update 
// so include everything that you need to do that 
session_start(); 
require_once(__DIR__.'/../Config/config.php'); 
require_once(__DIR__.'/../Model/readingsModel.php'); 
// Check for the post 
if(isset($_POST['btn-submitElecUsage'])){ 
     // Create the instance of your class that does the update and error 
     // handling/rendering 
     $newReading = new Readings(); 
     $eUsage = strip_tags($_POST['txtElecUsage']); 

     try { 
      if($newReading->enterElecReadings($eUsage)){  
       $elecNotif[] = "Reading successfully entered."; 
      } 
     } catch (Exception $e) { 
      echo $e->getMessage(); 
     } 
    } 
// I am just using a buffer, but you don't need it 
ob_start(); 
    // I presume this variable is on an included page, I don't see it 
    // anywhere but if you include the same stuff as your initial page, 
    // it should show up here fine 
    if(isset($elecError)){ 
     foreach($elecError as $elecError){ 
      ?> 
      <div class="alert alert-danger"> 
       <?php echo $elecError; ?> 
      </div> 
      <?php 
     } 
    } 

    if(isset($elecNotif)){ 
     foreach($elecNotif as $elecNotif){ 
      ?> 
      <div class="alert alert-danger"> 
       <?php echo $elecNotif; ?> 
      </div> 
      <?php 
     } 
    } 

$data = ob_get_contents(); 
ob_end_clean(); 
// Just print the contents of the page and your ajax on page 1 
// will take this content and place it in the <div id="errors"><div> 
die($data); 
関連する問題