====== param ====== ~~NOTOC~~ ==See Also== [[v5:reference:connection:addq|addQ()]]\\ == Syntax == string param( string $name ) ===== Description ===== The function param returns a database-specific placeholder for a prepared query statement. This method is used with [[v5:userguide:learn_bind:bind_vars|bind variable SQL statement execution]], to produce injection resistant code. On RDBMS with positional (numbered) query parameters such as PostgreSQL, calling ''param()'' with a "falsy" value((equivalent to ''false''; read the //Converting to boolean// section in the [[https://www.php.net/manual/en/language.types.boolean.php|PHP manual]])) will reset the parameter counter, allowing to start building a new query without first executing the previous one. Note that calling ''param(false)'' **only** resets the counter, //without returning a placeholder//. This allows forcing a reset operation independently from building a query; the next invocation will return the first placeholder. Compare that with ''param(0)'' or ''param(%%''%%)'', which both resets **and** returns the first placeholder. This is illustrated in the examples below. ------------------------------ ===== Usage ===== This is an example of how to use param() to build SQL queries: $sql1 = 'SELECT * FROM accounts WHERE ' . 'name = ' . $db->param('account') . ' AND ' . 'total = ' . $db->param('amount'); // Reset param count as a standalone operation then build the query $db->param(false); $sql2 = 'SELECT * FROM accounts WHERE id = ' . $db->param('id'); // Reset param count with a "falsy" value while building the query $sql3 = 'SELECT * FROM accounts WHERE ' . 'name = ' . $db->param(0) . ' AND ' . 'status = ' . $db->param(1); See below for the code's output with various database drivers. ==== MySQL, IBM DB2 ==== $sql1: SELECT * FROM accounts WHERE name = ? AND total = ? $sql2: SELECT * FROM accounts WHERE id = ? $sql3: SELECT * FROM accounts WHERE name = ? AND status = ? ==== Oracle (oci8) ==== $sql1: SELECT * FROM accounts WHERE name = :account AND total = :amount $sql2: SELECT * FROM accounts WHERE id = :id $sql3: SELECT * FROM accounts WHERE name = :0 AND status = :1 ==== PostgreSQL ==== $sql1: SELECT * FROM accounts WHERE name = $1 AND total = $2 $sql2: SELECT * FROM accounts WHERE id = $1 $sql3: SELECT * FROM accounts WHERE name = $1 AND status = $2 Without the parameter reset, //$sql2// would be ''... id = $3'' and //$sql3// ''... name = $4 AND status = $5'', which would result in errors when calling [[v5:reference:connection:execute|]].