7

This query is supposed to insert a new user into the 'users' table

$user = DB::getInstance()->insert('users', array(
        'username' => 'jim',
        'password' => 'pass',
        'salt' => 'salt'
       )
);

Corresponding insert()

public function insert($table, $fields = array())
{
    if (count($fields)) {
        $keys   = array_keys($fields);
        $values = null;
        $x      = 1;
        foreach ($fields as $field) {
            $values .= "?";
            if ($x < count($fields)) {
                $values .= ', ';
            }
            $x++;
        }
        $sql = "INSERT INTO users (`" . implode('`,`', $keys) . "`) VALUES ({$values})";
        echo $sql;
        if($this->queryDB($sql,$fields)){
            echo "its good";
            return true;
        }else{
            echo "bad query";
        }
    }
    return false;
}

Attempting to bind query an array of values ($param) as the second parameter of bind_param function

    $stmt = $this->mysqli->prepare($pattern);
    $stmt->bind_param("sss", $param);
    $stmt->execute();

This code keeps returning "mysqli_stmt::bind_param(): Number of elements in type definition string doesn't match number of bind variables" error.

I have also tried call_user_func_array, but keep getting the same error. What ami I doing wrong?

2 Answers 2

13

As of PHP 5.6, you can use the splat operator ...

$stmt->bind_param("sss", ...$param);
Sign up to request clarification or add additional context in comments.

2 Comments

adding a "..." retirns the following error "Cannot unpack array with string keys". I have also tried call_user func_array with no success.
Assuming the fields are in the right order, you can use array_values($param)
2

If you can't get the splat operator to work you may have to update your PHP version to be at least PHP 5.6 in order to pass an array like this:

bind_param("sss", ...$array); 

check your version on linux with:

php --version

I updated mine on Centos 7 to PHP 7.2 and this solved my issue.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.