php – Call to a member function bind_param() on a non-object-ThrowExceptions

Exception or error:

I am trying to bind a variable in this prepared statement, but i keep receiving the error:

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

The function is called, and variables are passed to it. When i change the function to just echo the variable, the variable prints on the page fine, but if i try to bind it here i receive the error. can anyone help?


function check($username){
$DBH = getDBH();
$qSelect = $DBH->prepare("SELECT * FROM users WHERE username = ?");
$qSelect->bind_param("s", $username);

i know the function is not completely written here, but that shouldn’t be a problem. I don’t understand why i am receiving this error.

How to solve:

as the error-message says, $qSelect seems to be not an object. try to debug this by using var_dump($qSelect); right after your prepare-call. also check if getDBH() returns what you need.

sounds like the prepare-call fails (don’t know why) and so it returns falsefalse is not an object, so you can’t call bind_param() on that.

EDIT: you havn’t given the info, but it looks like you’re using PHP’s PDO. In that case, take a look at the documentation.

If the database server successfully
prepares the statement, PDO::prepare()
returns a PDOStatement object. If the
database server cannot successfully
prepare the statement, PDO::prepare()
returns FALSE or emits PDOException
(depending on error handling).

You should configure your server to return those PDO-Exceptions, which would tell you why the prepare call fails.


Well, one reason prepare() can fail is if the sql statement sent to it is not valid in the current DB.

prepare() will then return false.

Eg – if the table name is not correct or one or more field in the query does not exist.


i’m using the mysqli approach as well and got the same error when I created another instance of mysqli before closing the first instance. So its important to use close() before starting the same piece of code. For example:

$DBH = getDBH();
$qSelect = $DBH->prepare("SELECT * FROM users WHERE username = ?");
$qSelect->bind_param("s", $username);
$qSelect->close();  // <--- use close before calling the same function( wich contains $DBH code) again;


It appears that prepare is quite dumb. It doesn’t rely query entirely into the MySQL side, by this, I mean, if in your query, you have a table that happens to have the same name of a keyword, say “user”, “order”, …, it just doesn’t recognize it as a table, but rather as what the keyword commands actually do, so the query turns out to be a mess and the prepare just fail.

To fix this is simple, you have to type it in the “correct” way adding “`” in both sides of the table name. Example:

`user`, `order`, `...`

It’s correct, yet, I find it silly from prepare to have this behavior.


I am trying to help other people with little experience in PHP like me.

In my case, this error occurred because I had an SQL syntax error. The console stack trace did not show the problem.

When I fixed the SQL, the error was gone.


Check the permissions of the user in database. User without “insert” permission causes “Call to a member function bind_param() on a non-object” message error too, when trying to insert.

Leave a Reply

Your email address will not be published. Required fields are marked *