Ardenexal
Ardenexal

Reputation: 543

mysqli php sql statement does not execute

I have the strangest problem and I can figure out what is happening. There are no error being displayed and I've var_dumped $stmt and for will just not return anything.

The test data that i am trying to retrieve is correct and when i try the statement manually through phpmyadmin it would perfectly so I'm stumped any ideas?

$sql = "SELECT UserID,Password FROM Account WHERE ProfileName = ? OR  Email = ? LIMIT 1";
$stmt = $conn->prepare($sql);
$username = strtolower($username);
$stmt->bind_param('ss', $username, $username);
$stmt->bind_result($userID, $dbPassword);
$stmt->execute();
$stmt->fetch();

Upvotes: 1

Views: 645

Answers (1)

MrCode
MrCode

Reputation: 64526

The bind_result() call must be done after execute() not before.

Change to:

$stmt->bind_param('ss', $username, $username);
$stmt->execute();
$stmt->bind_result($userID, $dbPassword);
$stmt->fetch();

From the Manual:

Note that all columns must be bound after mysqli_stmt_execute() and prior to calling mysqli_stmt_fetch().

Also, you can narrow down the problem by checking if prepare() succeeded and then subsequently if there are any rows:

if($stmt = $conn->prepare($sql))
{
    $stmt->bind_param('ss', $username, $username);
    $stmt->execute();
    $stmt->bind_result($userID, $dbPassword);

    if($stmt->num_rows > 0)
    {
        $stmt->fetch();
    }
    else
    {
         echo 'Query succeeded, but no rows found!';
    }
}
else
{
    echo "Prepare failed: (" . $conn->errno . ") " . $conn->error;
    // use trigger_error() not echo in production, after development
}

If prepare() fails, it means there is a either a connection error, syntax error or missing table/field name in the query.

Upvotes: 2

Related Questions