Guilherme Castelo
Guilherme Castelo

Reputation: 41

Call to a member function prepare() on a non-object

This code get an error: Fatal error: Call to a member function prepare() on a non-object in C:\xampp\htdocs\kohana\application\controllers\phactory2_test.php on line 16
It's the example from the Phactory guide: http://phactory.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);
        }
    }
}
?>

What is the possible cause?
Thank you

Edit: I found out the problem, Phactory::getConnection() is returning NULL for some reason

Upvotes: 0

Views: 1508

Answers (1)

train_fox
train_fox

Reputation: 1537

You must add bind_param before execute prepared statement.

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

This is on MySQL connection. For pdo you can add

print_r($stmt->errorInfo());

To find out what is your problem.

Upvotes: 1

Related Questions