oracle 调用未定义的方法CodeIgniter\Database\OCI8\Connection::_prepare()

lc8prwob  于 2023-01-01  发布在  Oracle
关注(0)|答案(1)|浏览(112)

我正在使用Codeigniter 4和Oracle。在我的控制器中,我有以下代码:

<?php

namespace App\Controllers;

class Home extends BaseController
{
    public function index()
    {

        $this->db = \Config\Database::connect();
        

        $query = "select * from test";

        $this->db->_prepare($query);
        $this->db->_execute();
        

        echo "<table border='1'>\n";
        $ncols =$this->db->getFieldCount();
        echo "<tr>\n";
        for ($i = 1; $i <= $ncols; ++$i) {
            $colname = $this->db->getFieldNames($s, $i);
            echo "  <th><b>".htmlspecialchars($colname,ENT_QUOTES|ENT_SUBSTITUTE)."</b></th>\n";
        }
        echo "</tr>\n";

        while (($row = $this->db->fetchAssoc()) != false) {
            echo "<tr>\n";
            foreach ($row as $item) {
                echo "<td>";
                echo $item!==null?htmlspecialchars($item, ENT_QUOTES|ENT_SUBSTITUTE):"&nbsp;";
                echo "</td>\n";
            }
            echo "</tr>\n";
        }
        echo "</table>\n";

    }
}

此代码返回错误:第一个月
方法CodeIgniter\数据库\OCI8\连接正在返回oci_connect结果
我该怎么做呢?

gopyfrb3

gopyfrb31#

错误:
Call to undefined method CodeIgniter\Database\OCI8\Connection::_prepare()
解释:

上面的错误很明显,你试图调用_prepare(...)方法,而这个方法在CodeIgniter\Database\OCI8\Connection类中并不存在。

溶液:
<?php

namespace App\Controllers;

use CodeIgniter\Database\Query;

class Home extends BaseController
{
    public function index()
    {
        $db = db_connect();

        // Prepare the Query
        $preparedQuery = $db->prepare(static function ($db) {
            return (new Query($db))->setQuery('SELECT * FROM test WHERE 1=?');
        });

        $resultInterface = $preparedQuery->execute(1);
        $preparedQuery->close();

        $fieldNames = $resultInterface->getFieldNames();
        $fieldCount = $resultInterface->getFieldCount();
        $resultSet = $resultInterface->getResultArray();

        echo "<table border='1'>\n";

        echo "<tr>\n";
        foreach ($fieldNames as $fieldName) {
            echo "  <th><b>"
                . htmlspecialchars(
                    $fieldName,
                    ENT_QUOTES | ENT_SUBSTITUTE
                )
                . "</b></th>\n";

        }
        echo "</tr>\n";

        foreach ($resultSet as $row) {
            echo "<tr>\n";

            foreach (range(0, $fieldCount - 1) as $fieldIndex) {
                echo "<td>";
                echo !empty($row[$fieldNames[$fieldIndex]])
                    ? htmlspecialchars(
                        $row[$fieldNames[$fieldIndex]],
                        ENT_QUOTES | ENT_SUBSTITUTE
                    )
                    : "&nbsp;";
                echo "</td>\n";

            }
            echo "</tr>\n";
        }

         echo "</table>\n";

    }
}

准备查询
使用prepare()方法可以轻松地完成此操作。此方法只需要一个参数,即返回查询对象的闭包。查询对象由任何 "final" 类型的查询自动生成,包括insert、update、delete、replace、get。使用查询生成器运行查询是处理此操作最简单的方法。查询并不实际运行。值并不重要,因为它们从来没有被应用过,而是作为占位符。这将返回一个PreparedQuery对象:
如果不想使用查询生成器,可以手动创建Query对象,并使用问号表示值占位符:
执行查询
准备好查询后,可以使用execute()方法实际运行查询。可以在查询参数中传递所需数量的变量。传递的参数数量必须与查询中占位符的数量匹配。传递参数的顺序还必须与原始查询中占位符的顺序相同:
获取字段计数()
查询返回的FIELDS(列)数。请确保使用查询结果对象调用该方法:
获取字段名称()
返回一个数组,其中包含查询返回的字段(列)的名称。请确保使用查询结果对象调用该方法:

相关问题