2017-05-30 1 views
11

にwpdbクラスを使用して外部データベースへのアクセス。は、私は外部のデータベースに頼っており、この目的のためにwpdbクラスを使用しているのWordPressでカスタムページテンプレートを持っているワードプレス

これは私のコードです:これはそれを行うための正しい方法であれば

<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>> 
    <header class="entry-header"> 
     <?php the_title('<h1 class="entry-title">', '</h1>'); ?> 
    </header><!-- .entry-header --> 

<?php 

class StudentsDatabase 
{ 
    private $db; 
    public function __construct() { 
     try { 
      $this->db = new wpdb(DB_USER, DB_PASSWORD, 'students_db', DB_HOST); 
      $this->db->show_errors(); 
     } catch (Exception $e) { 
      echo $e->getMessage(); 
     } 
    } 
    public function getStudentById($student_id) 
    { 
     return $this->db->get_results("SELECT * FROM `students` WHERE id=$student_id"); 
    } 
    public function getSchoolByAreaCode($area_code) 
    { 
     return $this->db->get_results("SELECT * FROM `schools` WHERE area_code=$area_code;--"); 
    } 

} 
$Students_DB = new StudentsDatabase(); 
$student_one = $Students_DB->getStudentById(1); 
$school_one = $Students_DB->getSchoolByAreaCode(1); 

?> 
<div class="entry-content"> 
    <?php 

    //do something with $student_one and $school_one ... 

    the_content(); 

    ?> 
</div><!-- .entry-content --> 

まあ、私は思っていました。セキュリティ上、または「その他」は実際には賢明です。

これは、ページのテンプレート自体の内部から外部DBの呼び出しを行うためにちょっと大雑把な感じ。これらの関数をいくつかの外部ファイルに登録し、それをテンプレートの中で使うべきですか?

+0

私はこれをarea_codeまたはstudent_idの値として入力できますか? "ヌルか1 = 1;テーブルのユーザを落とす - ' "あなたのページに[bobby tables](https://xkcd.com/327/)が手を出す前に、入力が 'サニタイズされている'ことを確認してください。 – coderatchet

+0

@thenaglecodeそれらはすべてうまく消毒されています。私はちょうどコードの一部を投稿しました(しかし、懸念してくれてありがとうございます!) –

答えて

10

私が最も「クリーン」な方法は、あなたのテーマのAPIになるプラグインを実装することだと思います。もちろん、Wordpress(これまでのところ)が依存マネージャーから欠けているので、それがあなた自身の目的のためにのみテーマであるかどうかによって異なります。

まとめると - テーマ使用中、このAPIを。

+0

あなたの集計は本当にありませんでした。 - それぞれに異なるテーマと固有のカスタマイズがあるので、プラグインはこの場合かなりの解決策ではありません。これらのケースをカバーするには多くの時間と労力が必要です。 –

+0

これはほとんどありませんもし答えがどうすれば外部のDBにアクセスするのですか?答えはAPI経由ですOPのコードサンプルはぎこちないので、これは素晴らしい答えです! –

+0

@GonrasKarols - _は別のテーマを持っていますプラグインは抽象的な方法で共通のロジックを共有します - バグを修正すると、プラグインをアップグレードするだけで、コードの各インスタンスを置き換えることはありません。 – eRIZ

6

functions.phpテーマのファイルにclassの宣言などを入れてください。それとも、そこでも良く、require_once彼らは、テーマのassetsまたはincludesフォルダに入れて。 functions.php

-/theme/ 
    -/includes/classes/class-studentsDatabase.php 
    -functions.php 

define('TEMPLATE_PATH', get_template_directory()); 
require_once(TEMPLATE_PATH . '/includes/classes/class-studentsDatabase.php'); 

あなたがインスタンス化できるclass(ES)全体としてのテーマのために、またはあなたが今やっているように、テンプレートのページ(複数可)に必要に応じて。


安全性に関する限り、私は野生に送信される予定のテーマ内で安全にする必要のあるDB接続を避けるでしょう。

私は私はあなたがそのためにやっているものをフォローわからないんだけど、提示され、私はテーマ環境の外でそのビットを処理します。

また、あなたのユースケースを知らないと、テーマは外部APIを活用することができ、apiはセントラルサイトでそのDB接続を管理するwordpress wp-json apiになる可能性があります。

これは、認証とCRUDを処理し、潜在的なセキュリティ上の問題を軽減するエンドポイントに対して、GET/POSTのテーマを許可します。外部サイトのテーマは、返されたJSONを解析するだけで、それを超えるDBアクセスはありません。

+3

これは初心者のWP開発者の間でよくある誤解です。機能を追加する場合は、テーマではなくプラグインに入れてください。あなたがサイトの "見た目"を変更している場合は、あなたのテーマのfunctions.phpに入るはずです。このタイプのものは絶対にテーマに入れるべきではありません。 –

+0

@JimMaguire特定のテーマに関連する機能を構築する場合は、それをテーマのfunctions.phpに入れてみましょう。 WordPressのテーマは、サイトの外観を定義する単なるテーマです。 (少なくともこれが最後の2〜3年になったのです) – Avishay28

+0

あなたが示唆していることが意味を成す例を考えるのは難しいです。はい。もちろん、テーマの売り手はテーマに機能を入れて、あなたをロックして何かを売りたがっています。私はなぜそれをテーマに入れるのかと聞いてきます。それはあなたのオプションを制限し、何も得られません。 –

0

また、Wordpressで複数のDBを扱うためのより根本的な方法もあります。 wpdb Codex pageから次のように:

$のwpdbオブジェクトは、一度に任意の数のテーブルに1つのだけのデータベースに話すことができます。デフォルトではWordPressデータベースです。まれに、別のデータベースに接続する必要がある場合は、独自のデータベース接続情報を使用してwpdbクラスから独自のオブジェクトをインスタンス化する必要があります。多くのデータベースを持つ非常に複雑な設定の場合は、代わりにhyperdbの使用を検討してください。

Hyperdbは、複数のDBに役立つプラグインであり、コード構成についてのあなたの考えを置き換えます。

関連する問題