php-doc-en/reference/mysqli/mysqli_stmt/prepare.xml

221 lines
6.6 KiB
XML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<refentry xml:id="mysqli-stmt.prepare" xmlns="http://docbook.org/ns/docbook">
<refnamediv>
<refname>mysqli_stmt::prepare</refname>
<refname>mysqli_stmt_prepare</refname>
<refpurpose>Prepares an SQL statement for execution</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<para>&style.oop;</para>
<methodsynopsis role="oop">
<modifier>public</modifier> <type>bool</type><methodname>mysqli_stmt::prepare</methodname>
<methodparam><type>string</type><parameter>query</parameter></methodparam>
</methodsynopsis>
<para>&style.procedural;</para>
<methodsynopsis role="procedural">
<type>bool</type><methodname>mysqli_stmt_prepare</methodname>
<methodparam><type>mysqli_stmt</type><parameter>statement</parameter></methodparam>
<methodparam><type>string</type><parameter>query</parameter></methodparam>
</methodsynopsis>
<para>
Prepares a statement for execution.
The query must consist of a single SQL statement.
</para>
<para>
The statement template can contain zero or more question mark
(<literal>?</literal>) parameter markers—also called placeholders.
The parameter markers must be bound to application variables using
<function>mysqli_stmt_bind_param</function> before executing the statement.
</para>
<note>
<para>
In the case where you pass a statement to
<function>mysqli_stmt_prepare</function> that is longer than
<literal>max_allowed_packet</literal> of the server, the returned
error codes are different depending on whether you are using MySQL
Native Driver (<literal>mysqlnd</literal>) or MySQL Client Library
(<literal>libmysqlclient</literal>). The behavior is as follows:
</para>
<itemizedlist>
<listitem>
<para>
<literal>mysqlnd</literal> on Linux returns an error code of 1153.
The error message means <quote>got a packet bigger than
<literal>max_allowed_packet</literal> bytes</quote>.
</para>
</listitem>
<listitem>
<para>
<literal>mysqlnd</literal> on Windows returns an error code 2006.
This error message means <quote>server has gone away</quote>.
</para>
</listitem>
<listitem>
<para>
<literal>libmysqlclient</literal> on all platforms returns an error code
2006. This error message means <quote>server has gone
away</quote>.
</para>
</listitem>
</itemizedlist>
</note>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
&mysqli.stmt.description;
<varlistentry>
<term><parameter>query</parameter></term>
<listitem>
<para>
The query, as a string. It must consist of a single SQL statement.
</para>
<para>
The SQL statement may contain zero or more parameter markers
represented by question mark (<literal>?</literal>) characters
at the appropriate positions.
</para>
<note>
<!-- Copied from https://dev.mysql.com/doc/c-api/8.0/en/mysql-stmt-prepare.html -->
<para>
The markers are legal only in certain places in SQL statements.
For example, they are permitted in the <literal>VALUES()</literal>
list of an <literal>INSERT</literal> statement (to specify column
values for a row), or in a comparison with a column in a
<literal>WHERE</literal> clause to specify a comparison value.
</para>
<para>
However, they are not permitted for identifiers (such as table or
column names), or to specify both
operands of a binary operator such as the <literal>=</literal> equal
sign. The latter restriction is necessary because it would be
impossible to determine the parameter type. In general, parameters are
legal only in Data Manipulation Language (DML) statements, and not in
Data Definition Language (DDL) statements.
</para>
</note>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
&return.success;
</para>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<example>
<title><methodname>mysqli_stmt::prepare</methodname> example</title>
<para>&style.oop;</para>
<programlisting role="php">
<![CDATA[
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
$city = "Amersfoort";
/* create a prepared statement */
$stmt = $mysqli->stmt_init();
$stmt->prepare("SELECT District FROM City WHERE Name=?");
/* bind parameters for markers */
$stmt->bind_param("s", $city);
/* execute query */
$stmt->execute();
/* bind result variables */
$stmt->bind_result($district);
/* fetch value */
$stmt->fetch();
printf("%s is in district %s\n", $city, $district);
]]>
</programlisting>
<para>&style.procedural;</para>
<programlisting role="php">
<![CDATA[
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
$city = "Amersfoort";
/* create a prepared statement */
$stmt = mysqli_stmt_init($link);
mysqli_stmt_prepare($stmt, "SELECT District FROM City WHERE Name=?");
/* bind parameters for markers */
mysqli_stmt_bind_param($stmt, "s", $city);
/* execute query */
mysqli_stmt_execute($stmt);
/* bind result variables */
mysqli_stmt_bind_result($stmt, $district);
/* fetch value */
mysqli_stmt_fetch($stmt);
printf("%s is in district %s\n", $city, $district);
]]>
</programlisting>
&examples.outputs;
<screen>
<![CDATA[
Amersfoort is in district Utrecht
]]>
</screen>
</example>
</refsect1>
<refsect1 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><function>mysqli_stmt_init</function></member>
<member><function>mysqli_stmt_execute</function></member>
<member><function>mysqli_stmt_fetch</function></member>
<member><function>mysqli_stmt_bind_param</function></member>
<member><function>mysqli_stmt_bind_result</function></member>
<member><function>mysqli_stmt_get_result</function></member>
<member><function>mysqli_stmt_close</function></member>
</simplelist>
</para>
</refsect1>
</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->