Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用WordPress中的wpdb类访问外部数据库_Php_Wordpress - Fatal编程技术网

Php 使用WordPress中的wpdb类访问外部数据库

Php 使用WordPress中的wpdb类访问外部数据库,php,wordpress,Php,Wordpress,我在WordPress中有一个自定义页面模板,它依赖于外部数据库,并为此使用wpdb类 这是我的代码: <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>> <header class="entry-header"> <?php the_title( '<h1 class="entry-title">', '</h1>' );

我在WordPress中有一个自定义页面模板,它依赖于外部数据库,并为此使用wpdb类

这是我的代码:

<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调用感觉有点粗略。我应该在一些外部文件上注册这些函数,然后在模板中使用它们吗?

我认为最“干净”的方法是实现一个插件,它将成为主题的API。当然,这取决于它是否是一个仅用于您自己目的的主题,因为Wordpress(到目前为止)缺少依赖项管理器


总之,在主题中使用此API。

声明等放在主题的functions.php文件中。或者,更好的办法是,
在那里要求一次
它们,然后将它们放在主题的
资产
包含
文件夹中

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

define('TEMPLATE_PATH', get_template_directory());
require_once(TEMPLATE_PATH . '/includes/classes/class-studentsDatabase.php');
您可以将主题的
类作为一个整体实例化,也可以根据需要在模板页面上实例化,就像您现在所做的那样


就安全性而言,我会避免将需要安全的DB连接放在一个将被发送到野外的主题中

我不确定我是否遵循了您为此所做的工作,但正如所介绍的,我将在主题环境之外处理这一点

同样,在不了解您的用例的情况下,主题可以利用一个外部api,该api可以是一个wordpress wp json api,在中心站点管理数据库连接


这将允许主题
/
发布到处理身份验证和任何CRUD的端点,并缓解许多潜在的安全问题。外部站点上的主题将只解析返回的json,除此之外,没有任何DB访问权限。

Wordpress中还有更激进的方法来处理多个DB。wpdb提供如下信息:

$wpdb对象可以与任意数量的表通信,但一次只能与一个数据库通信;默认情况下,WordPress数据库。在极少数情况下,您需要连接到另一个数据库,您需要使用自己的数据库连接信息从wpdb类实例化自己的对象。对于具有许多数据库的极其复杂的设置,请考虑使用HydBB代替.< /P>
是一个插件,可以帮助多个DBs,并取代您对代码组织的过度思考。

我可以将其作为区域代码或学生id的值输入吗?“
null或1=1;删除表用户;--
”确保输入已“消毒”,然后再让他把手放在您的页面上。@然后重新编码它们都已消毒好,我刚刚发布了部分代码(:但是谢谢你的关注!我没有真正了解你的总结部分。无论如何,这种方法将用于数百个不同的网站-每个网站都有不同的主题和特定的自定义设置。因此,在这种情况下,插件不是一个很好的解决方案。它需要大量的时间和工作来涵盖所有这些情况。这不是最重要的优雅的答案,但它是100对。如果问题是如何访问外部数据库,答案是通过API。OP的代码示例乱七八糟,所以这是一个很好的答案!@GonrasKarols-有不同的主题和特定的自定义-这就是为什么它应该是一个插件;插件以抽象的方式共享一个公共逻辑-当你修复一个bug时,您只需升级一个插件,而不是替换每个代码实例。@eRIZ“一个插件将成为您主题的API”是什么意思-我的custom-page.php模板需要对插件进行API调用吗?还是相反?插件会将数据库信息传递到custom-page.php的正确部分?我觉得我遗漏了一些东西。您的插件提供了一个名为my_vendor_get_poll_data的方法,返回数组。您可以在主题,仅包装数据。将任何处理留给插件。这是初学者WP开发者的常见误解。如果要添加功能,它应该放在插件中,而不是主题中。如果要修改“外观”对于一个站点,它应该放在主题的functions.php中。这种类型的东西绝对不应该放在主题中。@JimMaguire如果你构建了与特定主题相关的功能,为什么不把它放在theme functions.php中呢?wordpress中的主题不仅仅是定义站点外观的“主题”。(至少这是过去2-3年的情况)很难想出一个你的建议有意义的例子。是的。当然,主题卖家把功能放在一个主题里,他们想把你锁在里面,卖给你一些东西。我想问你为什么把它放在一个主题里?它限制了你的选择,什么也得不到。重读它,我不得不站在吉姆一边。我是在评论分类declarations及其方法远离模板文件,在我对OP数据库连接位的评论中不够直接。这种方法是错误的,应该重新设计。我的“主题可以利用外部api”应该是“通过插件”附加到它。主题可能需要的任何功能都应该降级到模板文件的交付。如果OP试图通过主题创建和管理服务器->客户机关系,他只要求头痛。我不是说通过主题管理服务器-客户机关系-我只需要一些简单的get\u结果s()语句链接到外部数据库,结果会影响页面内容。没有什么太复杂的事情,只需要单向通信(从数据库到模板)。所以你的意思是,我应该构建一个插件来处理数据库连接和查询,并将数据发送到模板本身?