downloads | documentation | faq | getting help | mailing lists | licenses | wiki | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

mysqli_stmt::reset> <mysqli_stmt->param_count
Last updated: Fri, 13 Nov 2009

view this page in

mysqli_stmt::prepare

mysqli_stmt_prepare

(PHP 5)

mysqli_stmt::prepare -- mysqli_stmt_prepareSQL ステートメントを実行するために準備する

説明

オブジェクト指向型(メソッド)

mixed mysqli_stmt::prepare ( string $query )

手続き型:

bool mysqli_stmt_prepare ( mysqli_stmt $stmt , string $query )

null で終わる文字列で指定した SQL クエリを準備します。

パラメータマーカは、ステートメントの実行や行の取得の前に mysqli_stmt_bind_param()mysqli_stmt_bind_result() を使用して アプリケーション変数にバインドする必要があります。

パラメータ

stmt

手続き型のみ: mysqli_stmt_init() が返すステートメント ID。

query

クエリを表す文字列。単一の SQL 文で構成されている必要があります。

ひとつまたは複数のパラメータを SQL 文に含めることができます。 そのためには、適切な位置にクエスチョンマーク (?) を埋め込みます。

注意: ステートメントの最後にセミコロンや \g を追加してはいけません。

注意: パラメータのマーカは、それが SQL 文の適切な位置にある場合のみ 有効です。例えば INSERT 文の VALUES() リストの中 (行に登録するカラム値を指定する) や WHERE 句で列のデータと比較する値などが適切な位置の例です。
しかし、識別子 (テーブルやカラムの名前) や SELECT 文で選択する 項目の名前に指定したり、(等号 = のような) 二項演算子の両側にパラメータを指定したりすることはできません。 後者の制限は、パラメータの型が判断できなくなることによるものです。 また、パラメータのマーカを NULL と比較して ? IS NULL のようにすることもできません。 一般に、パラメータが使用可能なのはデータ操作言語 (DML) ステートメントであり、データ定義言語 (DDL) ステートメントでは 使用できません。

返り値

成功した場合に TRUE を、失敗した場合に FALSE を返します。

例1 オブジェクト指向型

<?php
$mysqli 
= new mysqli("localhost""my_user""my_password""world");

/* 接続状況をチェックします */
if (mysqli_connect_errno()) {
    
printf("Connect failed: %s\n"mysqli_connect_error());
    exit();
}

$city "Amersfoort";

/* プリペアドステートメントを作成します */
$stmt =  $mysqli->stmt_init();
if (
$stmt->prepare("SELECT District FROM City WHERE Name=?")) {

    
/* マーカにパラメータをバインドします */
    
$stmt->bind_param("s"$city);

    
/* クエリを実行します */
    
$stmt->execute();

    
/* 結果変数をバインドします */
    
$stmt->bind_result($district);

    
/* 値を取得します */
    
$stmt->fetch();

    
printf("%s is in district %s\n"$city$district);

    
/* ステートメントを閉じます */
    
$stmt->close();
}

/* 接続を閉じます */
$mysqli->close();
?>

例2 手続き型

<?php
$link 
mysqli_connect("localhost""my_user""my_password""world");

/* 接続状況をチェックします */
if (mysqli_connect_errno()) {
    
printf("Connect failed: %s\n"mysqli_connect_error());
    exit();
}

$city "Amersfoort";

/* プリペアドステートメントを作成します */
$stmt mysqli_stmt_init($link);
if (
mysqli_stmt_prepare($stmt'SELECT District FROM City WHERE Name=?')) {

    
/* マーカにパラメータをバインドします */
    
mysqli_stmt_bind_param($stmt"s"$city);

    
/* クエリを実行します */
    
mysqli_stmt_execute($stmt);

    
/* 結果変数をバインドします */
    
mysqli_stmt_bind_result($stmt$district);

    
/* 値を取得します */
    
mysqli_stmt_fetch($stmt);

    
printf("%s is in district %s\n"$city$district);

    
/* ステートメントを閉じます */
    
mysqli_stmt_close($stmt);
}

/* 接続を閉じます */
mysqli_close($link);
?>

上の例の出力は以下となります。

Amersfoort is in district Utrecht

参考

mysqli_stmt_init() - ステートメントを初期化し、mysqli_stmt_prepare で使用するオブジェクトを返す, mysqli_stmt_execute() - プリペアドクエリを実行する, mysqli_stmt_fetch() - プリペアドステートメントから結果を取得し、バインド変数に格納する, mysqli_stmt_bind_param() - プリペアドステートメントのパラメータに変数をバインドする, mysqli_stmt_bind_result() - 結果を保存するため、プリペアドステートメントに変数をバインドする mysqli_stmt_close() - プリペアドステートメントを閉じる.



mysqli_stmt::reset> <mysqli_stmt->param_count
Last updated: Fri, 13 Nov 2009
 
add a note add a note User Contributed Notes
mysqli_stmt::prepare
ndungi at gmail dot com
22-Apr-2009 09:25
The `prepare` , `bind_param`, `bind_result`, `fetch` result, `close` stmt cycle can be tedious at times. Here is an object that does all the mysqli mumbo jumbo for you when all you want is a select leaving you to the bare essential `preparedSelect` on a prepared stmt. The method returns the result set as a 2D associative array with the `select`ed columns as keys. I havent done sufficient error-checking and it also may have some bugs. Help debug and improve on it.

I used the bible.sql db from http://www.biblesql.net/sites/biblesql.net/files/bible.mysql.gz.

Baraka tele!

============================

<?php

class DB
{
    public
$connection;
   
   
#establish db connection
   
public function __construct($host="localhost", $user="user", $pass="", $db="bible")
    {
       
$this->connection = new mysqli($host, $user, $pass, $db);
                 
        if(
mysqli_connect_errno())
        {
            echo(
"Database connect Error : "
           
. mysqli_connect_error($mysqli));
        }   
    }
   
   
#store mysqli object
   
public function connect()
    {
        return
$this->connection;
    }

   
#run a prepared query
   
public function runPreparedQuery($query, $params_r)
    {
       
$stmt = $this->connection->prepare($query);
       
$this->bindParameters($stmt, $params_r);

        if (
$stmt->execute()) {
            return
$stmt;
        } else {
            echo(
"Error in $statement: "
                     
. mysqli_error($this->connection));
            return
0;
        }
       
    }

 
# To run a select statement with bound parameters and bound results.
 # Returns an associative array two dimensional array which u can easily 
 # manipulate with array functions.
 
   
public function preparedSelect($query, $bind_params_r)
    {
       
$select = $this->runPreparedQuery($query, $bind_params_r);
       
$fields_r = $this->fetchFields($select);
       
        foreach (
$fields_r as $field) {
           
$bind_result_r[] = &${$field};
        }
       
       
$this->bindResult($select, $bind_result_r);
       
       
$result_r = array();
       
$i = 0;
        while (
$select->fetch()) {
            foreach (
$fields_r as $field) {
               
$result_r[$i][$field] = $$field;
            }
           
$i++;
        }
       
$select->close();
        return
$result_r;   
    }
   
   
   
#takes in array of bind parameters and binds them to result of
    #executed prepared stmt
   
   
private function bindParameters(&$obj, &$bind_params_r)
    {
       
call_user_func_array(array($obj, "bind_param"), $bind_params_r);
    }
   
    private function
bindResult(&$obj, &$bind_result_r)
    {
       
call_user_func_array(array($obj, "bind_result"), $bind_result_r);
    }
   
   
#returns a list of the selected field names
   
   
private function fetchFields($selectStmt)
    {
       
$metadata = $selectStmt->result_metadata();
       
$fields_r = array();
        while (
$field = $metadata->fetch_field()) {
           
$fields_r[] = $field->name;
        }

        return
$fields_r;
    }
}
#end of class
 
#An example of the DB class in use

$DB = new DB("localhost", "root", "", "bible");
$var = 5;
$query = "SELECT abbr, name from books where id > ?" ;
$bound_params_r = array("i", $var);

$result_r = $DB->preparedSelect($query, $bound_params_r);

#loop thru result array and display result

foreach ($result_r as $result) {
    echo
$result['abbr'] . " : " . $result['name'] . "<br/>" ;
}

?>
kontakt at arthur minus schiwon dot de
16-Jun-2008 02:22
If you wrap the placeholders with quotation marks you will experience warnings like "Number of variables doesn't match number of parameters in prepared statement" (at least with INSERT Statements).
mhradek AT gmail.com
15-May-2008 11:06
A particularly helpful adaptation of this function and the call_user_func_array function:

// $params is sent as array($val=>'i', $val=>'d', etc...)

function db_stmt_bind_params($stmt, $params)
{
    $funcArg[] = $stmt;
    foreach($params as $val=>$type)
    {
        $funcArg['type'] .= $type;
        $funcArg[] = $val;
    }
    return call_user_func_array('mysqli_stmt_bind_param', $funcArgs);
}

Thanks to 'sned' for the code.
lukaszNOSPAMPLEASE at epas dot pl
15-Jan-2008 03:15
i've got some bad news for you guys if you haven't found out already.
the trick with mysqli_next_result() only prevents having the connection dropped after a stored procedure call.
apparently you can bind parameters for a prepared stored procedure call, but you'll get messed up records from mysqli_stmt_fetch() after mysqli_stmt_bind_result(), at least when the stored procedure itself contains a prepared statement.
a way to avoid data corruption could be specifying the CLIENT_MULTI_STATEMENTS flag in mysqli_real_connect(), if it wasn't disabled entirely (for security reasons, as they say). another option is to use mysqli_multi_query(), but then you can't bind at all.
st dot john dot johnson at gmail dot com
04-Jun-2007 03:59
In reference to what lachlan76 said before, stored procedures CAN be executed through prepared statements as long as you tell the DB to move to the next result before executing again.

Example (Five calls to a stored procedure):

<?php
for ($i=0;$i<5;$i++) {
 
$statement = $mysqli->stmt_init();
 
$statement->prepare("CALL some_procedure( ? )");

 
// Bind, execute, and bind.
 
$statement->bind_param("i", 1);
 
$statement->execute();
 
$statement->bind_result($results);

  while(
$statement->fetch()) {
   
// Do what you want with your results.
 
}

 
$statement->close();

 
// Now move the mysqli connection to a new result.
 
while($mysqli->next_result()) { }
}
?>

If you include the last statement, this code should execute without the nasty "Commands out of sync" error.
lachlan76 at gmail dot com
29-Nov-2006 04:59
Do not try to use a stored procedure through a prepared statement.

Example:

<?php
$statement
= $mysqli->stmt_init();
$statement->prepare("CALL some_procedure()");
?>

If you attempt to do this, it will fail by dropping the connection during the next query.  Use mysqli_multi_query instead.

Example:

<?php
$mysqli
->multi_query("CALL some_procedure()");
do
{
 
$result = $mysqli->store_result();

  
// Do your processing work here 
 
 
$result->free();
} while(
$mysqli->next_result());
?>

This means that you cannot bind parameters or results, however.
andrey at php dot net
07-Oct-2005 12:35
If you select LOBs use the following order of execution or you risk mysqli allocating more memory that actually used

1)prepare()
2)execute()
3)store_result()
4)bind_result()

If you skip 3) or exchange 3) and 4) then mysqli will allocate memory for the maximal length of the column which is 255 for tinyblob, 64k for blob(still ok), 16MByte for MEDIUMBLOB - quite a lot and 4G for LONGBLOB (good if you have so much memory). Queries which use this order a bit slower when there is a LOB but this is the price of not having memory exhaustion in seconds.

mysqli_stmt::reset> <mysqli_stmt->param_count
Last updated: Fri, 13 Nov 2009
 
 
show source | credits | sitemap | contact | advertising | mirror sites