2017-08-06 25 views
0

私はこれに新しいです、そして、私はおそらく間違った方法でこの全体をやっていることを知っていますが、私はそれを理解しようと一日中してきました。私は、小さな構文コードをオンラインで練習するのではなく、自分の実際のプロジェクトをプログラミングすることに大きな違いがあることを認識しています。ですから、私はさまざまな変数/スコープをマージ/パスする方法についての経験が不足しています。より大きな絵の中にすべてを収める方法を理解することは、私にとっては全く別の話です。前もって感謝します。関数の結果をsqlに渡す

私がやろうとしているのは、「selectyacht」という関数を(viewhip.phpの)呼び出されている場所とは異なる場所に出力することです。出力データ(viewship.php内)は返された特定のフィールド(すべてではない)のみである必要があり、その結果はhtmlページ(テーブルではない)全体に散らばります。これに加えて、私はこの変数を持っています: "$ sqlstatement"(sqlconn.php)は、毎回接続関数を繰り返す必要がないので、関数の外に持ってきようとしています。私はグローバル変数を試してはいけませんでした。そしてそれは感謝して私にエラーを与えました。これは、より良い方法を見つけなければならないことを意味します。

基本的に私の闘争は、私は2つの要因に基づいて、この全体の事を構造化する方法を理解することにあります。sqlconn.phpにおける第2の条件文が異なるためとして、少なくとも、多くの場合、可能な限り 」と入力することができるようにするには

  • selectyacht "機能が将来登場する です。
  • sqlconn.php内の接続インスタンスが、さまざまな機能に何度も使用されるため、この関数の外部に存在することを許可します。
  • viewhip.phpで呼び出されている場所とは異なる場所にデータを戻します。これは、呼び出しがボタンの押下であり、表示される結果ではないためです。

これはおそらく非常に単純ですが、それでも私はそれを避けています。 P.P.このコードの一部は、自分の必要と合併しようとしているインターネット上の他のリソースからのコピー/ペーストです。


sqlconn.php

<?php 
    $servername = "XXXXXXXX"; 
    $username = "XXXXXXXX"; 
    $password = "XXXXXXXX"; 
    $dbname = "XXXXXXXX"; 

    // Instantiate the connection object 
    $dbconn = new mysqli($servername, $username, $password, $dbname); 

    // Check if the connection works or show an error 
    if ($dbconn->connect_error) { 
     die("Connection failed: " . $dbconn->connect_error); 
    } 

    // Create a query based on the ship's name 
    function selectyacht($shipname) { 
    global $sqlstatement; 
    $sqlstatement = "SELECT * FROM ships WHERE Name=" . "'" . $shipname . "'"; 
    } 
    // Put the sql statement inside the connection. 
    // Additional sql statements will be added in the future somehow from other functions 
    $query = $dbconn->query($sqlstatement); 

    // Return the data from the ship to be repeated as less as possible for each future function 
    if ($query->field_count > 0) { 
    while($data = $query->fetch_assoc()) { 
      return $data; 
     } 
    } 
    else { 
     echo "No data found"; 
    } 

    // Close the connection 
    $dbconn->close(); 
?> 

viewship.php

<html> 
<body> 
    <?php include 'sqlconn.php';?> 
    <!-- ship being selected from different buttons --> 
    <?php selectyacht("Pelorus");?> 
    <br> 
    <!-- This is the output result --> 
    <?php echo $data["Designer"];?> 
    <?php echo $data["Length"];?> 
    <?php echo $data["Beam"];?> 
    <?php echo $data["Height"];?> 
</body> 
</html> 

答えて

0

メイト、私は、私は1つの答えで全体のPHPのコーディング標準をカバーすることができるかどうかわからないが、私は意志少なくともあなたに指示してください。

まず、クラスとオブジェクト指向プログラミングについて学ぶ必要があります。件名自体は本ですが、調査する必要があるのは自動ロードです。これは、基本的に、関数コードを別のファイルに入れて、これらのファイルの1つで使用される関数を呼び出すときにサーバーにこれらのファイルを含めることを可能にします。この方法で、データベース接続を担当するコードとデータ操作(取得/更新/削除)を実行するコードを分割することができます。

第2に、mysqliをドロップし、PDOに移動します(またはComposerが何であるかを知るときはDBALにすることもできます)。私はインターネットがmysqliに基づいた例でいっぱいですが、この方法はちょうどそれが途中にあり、戻ってこないことを知っています。

次に、準備されたステートメントを使用します。これはセキュリティの問題です(SQLインジェクションについての説明を参照)。、今までにこのようなクエリに外部変数を置いてはいけません:平均意図に

"SELECT * FROM ships WHERE Name=" . "'" . $shipname . "'"; 

誰もが彼が例えばを望んでいるものは何でもするためにあなたのクエリを変更しますが、文字列を置くことが可能です。データベースを完全に消去してください。あなたのクエリはPDOでプリペアドステートメントを使用すると、次のようになります。

$stmt = $this->pdo->prepare("SELECT * FROM ships WHERE Name = :ship_name"); 
$stmt->bindValue(':ship_name', $shipname); 

今すぐあなたの構造に - あなただけのデータベース接続、あなたが例えば、あなたの関数が責任を持っているでしょうShips classの責任DB classを持つ必要があります。データを取り込むためのものです。 selectYacht関数を含むクラスへの引数としてデータベース接続を渡す(注入する)よりも、私が正しくあなたをあなたを理解していれば

「が呼び出されていた場所から別の場所にデータを返す」

についてはSingleton alternative for PHP PDO

は、実装がどのように見えるかの詳細についてはこちらをご覧ください船名を入力するためのフィールドとクリックした後にその詳細を表示するボタンがあります。あなただけの標準的なHTMLフォームを作成し、自分自身(または他のページ)にそれをリダイレクトボタンクリックでそれを提出 -

  • 標準フォーム:あなたはここに2つのオプションがあります。場合 - あなたはちょうどselectYachtはPOSTからの船名を取得し、selectYachtを機能させることを渡した後、ちょうどそれの結果(あなたがそれらを必要とする場所でフィールドごと)

  • AJAXフォームを印刷機能を使用した結果を表示したいと思いファイルであなたは正しい方向に私を置くためのJavaスクリプトで

+0

感謝をselectYacht機能と更新ページを使用する他のページにAJAXを経由して船名を表すフィールド値を送信する - あなたは、元のページをリロードせずにそれをやって好みます! – Alex

関連する問題