Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use mysqli prepared statements?

I am trying out prepared statements, but the below code is not working. I am getting the error:

Fatal error: Call to a member function execute() on a non-object in /var/www/prepared.php on line 12

<?php

    $mysqli = new mysqli("localhost", "root", "root", "test");
    if ($mysqli->connect_errno) {
        echo "Failed to connect to MySQL: " . $mysqli->connect_error;
    }

    $stmt = $mysqli->prepare("INSERT INTO users (name, age) VALUES (?,?)");

    // insert one row
    $stmt->execute(array('one',1));

    // insert another row with different values
    $stmt->execute(array('two',1));
?>

Also, do I need to use mysqli for prepared statements? Can anyone point me to a complete example on prepared statements from connection to insertion to selection with error handling?

like image 382
aWebDeveloper Avatar asked Mar 09 '12 05:03

aWebDeveloper


People also ask

How do mysqli prepared statements work in PHP?

In plain English, this is how MySQLi prepared statements work in PHP: Prepare an SQL query with empty values as placeholders (with a question mark for each value). Bind variables to the placeholders by stating each variable, along with its type. Execute query. The four variable types allowed:

What are the advantages of using pre-prepared statements in MySQL?

Prepared statements are very useful against SQL injections, because parameter values, which are transmitted later using a different protocol, need not be correctly escaped. If the original statement template is not derived from external input, SQL injection cannot occur. The following example uses prepared statements and bound parameters in MySQLi:

Does prepared statement work with PHP PDO?

But it requires additional steps and functions to execute query which sometimes confuse most of the php beginners. PHP provides MYSQLi procedural, MYSQLi OOP and PHP PDO to perform database operation like select, insert, update and delete. Prepared Statement works with all three of them.

What is a prepared statement in SQL?

A prepared statement is a feature used to execute the same (or similar) SQL statements repeatedly with high efficiency.


Video Answer


2 Answers

From the mysqli::prepare docs:

The parameter markers must be bound to application variables using mysqli_stmt_bind_param() and/or mysqli_stmt_bind_result() before executing the statement or fetching rows.

bind_param docs.

i.e.:

$name = 'one';
$age  = 1;

$stmt = $mysqli->prepare("INSERT INTO users (name, age) VALUES (?,?)");

// bind parameters. I'm guessing 'string' & 'integer', but read documentation.
$stmt->bind_param('si', $name, $age);

// *now* we can execute
$stmt->execute();
like image 60
mathematical.coffee Avatar answered Sep 28 '22 03:09

mathematical.coffee


Also do I need to use mysqli for prepared statement. Can anyone point me to a complete example on prepared statement from connection to insertion to selection with error handling

You can also use PDO which I much prefer. In fact, it looks like you're confusing PDO and Mysqli in your code example.

$db = new PDO($dsn, $user, $pass);
$stmt = $db->prepare("INSERT INTO users (name, age) VALUES (?,?)");
$stmt->execute(array($name1, $age1));
$stmt->execute(array($name2, $age2));

Unlike with mysqli you don't have to call a separate binding function, although that feature is available if you prefer/want/need to use it.

Another fun thing about PDO is named placeholders which can be much less confusing in complex queries:

$db = new PDO($dsn, $user, $pass);
$stmt = $db->prepare("INSERT INTO users (name, age) VALUES (:name,:age)");
$stmt->execute(array(':name' => $name1, ':age' => $age1));
$stmt->execute(array(':name' => $name2, ':age' => $age2));
like image 41
prodigitalson Avatar answered Sep 28 '22 03:09

prodigitalson