31

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?

//CALL FROM PAGE ONE check($username); //FUNCTION ON PAGE 2 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.

2
  • 3
    var_dump($qSelect) to check if it is what you think it is. Commented Dec 20, 2010 at 8:43
  • Some $stmt before this need close(). Like $stmt.close(); or $qSelect.close(); PS. var_dump($qSelect); write nothing interesting, only true mysqli connection Commented Sep 10 at 7:59

6 Answers 6

73

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.

Sign up to request clarification or add additional context in comments.

1 Comment

Thank you. This helped me after a long bout of trying to figure out my error. As usual, just a little nothing error causes the most trouble.
24

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 false - false 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.

2 Comments

yeah its qSelect is returning bool(false) but this doesnt make any sense because i have a function that is practically the same and it works fine.
Hm. I was also in the situation of having a function that is practically the same. Turns out, I had copied-and-pasted it in order to add a field. But I forgot the comma before the new field! Stupid mistake, but it just goes to show that it might just be a typing error on your part.
17

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; 

1 Comment

and if he uses such function many times, i think, he should use reset() instead of close(), and move prepare() outside of funcion, for example, into constructor, an put statement into property like this: $this->qSelect .
2

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.

Comments

2

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.

1 Comment

I found I was missing the column in the DB that I was referencing in the query.
1

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.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.