0

此代码出现错误:致命错误:在第 16 行的 C:\xampp\htdocs\kohana\application\controllers\phactory2_test.php 中的非对象上调用成员函数 prepare()
这是 Phactory 指南中的示例:http://phafactory.org/guide/#phpunit-example

<?php
include_once('/simpletest/autorun.php');
require_once ('/Phactory/lib/Phactory.php');

/**
  * This is the function we will test.
  * It should retrieve a user from the db by id,
  * and return that user's age.
  *
  * @param PDO $pdo
  * @param int $user_id
  * @return mixed The age of the user, or false if no user
  */
function getUserAge($pdo, $user_id)
{
    $stmt = $pdo->prepare("SELECT * FROM `users` WHERE `id` = ?");
    $stmt->execute(array($user_id));
    $user = $stmt->fetch();

    if(false === $user) {
        return false;
    }

    return $user['age'];
}

class UserTest extends UnitTestCase
{   
    public static function setUpBeforeClass()
    {
        // create a db connection and tell Phactory to use it
        $pdo = new PDO('mysql:host=127.0.0.1; dbname=testdb', 'root', '');
        Phactory::setConnection($pdo);

        /**
          * Normally you would not need to create a table here, and would use
          * an existing table in your test database instead.
          * For the sake of creating a self-contained example, we create
          * the 'users' table here.
          */
        $pdo->exec("CREATE TABLE `users` ( id INTEGER PRIMARY KEY, name TEXT, age INTEGER )");

        // reset any existing blueprints and empty any tables Phactory has used
        Phactory::reset();

        // define default values for each user we will create
        Phactory::define('user', array('name' => 'Test User $n', 'age' => 18));
    }

    public static function tearDownAfterClass()
    {
        Phactory::reset();

        // since we created a table in this test, we must drop it as well
        Phactory::getConnection()->exec("DROP TABLE `users`");
    }

    public function testGetUserAge()
    {
        // test that getUserAge() returns false for a nonexistent user
        $age = getUserAge(Phactory::getConnection(), 0);
        $this->assertFalse($age);

        // create 20 users, with ages from 1-20
        $users = array();
        for($i = 1; $i <= 20; $i++) 
        {
            // create a row in the db with age = $i, and store a Phactory_Row object
            $users[] = Phactory::create('user', array('age' => $i));
        }

        // test that getUserAge() returns the correct age for each user
        foreach($users as $user) 
        {
            // Phactory_Row provides getId() which returns the value of the PK column
            $user_id = $user->getId();

            $age = getUserAge(Phactory::getConnection(), $user_id);

            $this->assertEqual($user->age, $age);
        }
    }
}
?>

可能的原因是什么?
谢谢

编辑:我发现了问题, Phactory::getConnection() 出于某种原因返回 NULL

4

1 回答 1

1

您必须在执行准备好的语句之前添加 bind_param。

    $stmt = $pdo->prepare("SELECT * FROM `users` WHERE `id` = ?");
    $stmt->bind_param('i', $user_id);
    $stmt->execute();

这是在 MySQL 连接上。对于 pdo,您可以添加

print_r($stmt->errorInfo());

找出你的问题。

于 2015-03-19T10:48:03.667 回答