📄 manual_clients.html
字号:
<h4>20.4.12.3 错误</h4>
<p>无。 </p>
<p> </p>
<h3><a NAME="mysql_escape_string" HREF="manual_toc.html#mysql_escape_string">20.4.13<code>
mysql_escape_string()</code></a></h3>
<p><code>unsigned int mysql_escape_string(char *to, const char *from, unsigned int length)</code>
</p>
<h4>20.4.13.1 说明</h4>
<p>把在<code>from</code>中的字符串编码为在一条SQL语句中可以发给服务器的转义的SQL字符串,将结果放在<code>to</code>中,
并且加上一个终止的空字节。编码的字符是<code>NUL</code>(ASCII 0)、<samp>‘\n</samp>’、<samp>‘\r’</samp>、<samp>‘\’</samp>、<samp>‘'’</samp>、<samp>‘"’和</samp>Control-Z(见<a HREF="manual_Reference.html#Literals">7.1 文字:如何写字符串和数字</a>)。</p>
<p>由<code>from</code>指向的字符串必须是<code>length</code>个字节长。你必须分配<code>to</code>的缓冲区至少<code>length*2+1</code>个字节长。(在更坏的情况,每个字符可能需要使用2个字节被编码,并且你需要为终止空字节的空间)
当<code>mysql_escape_string()</code>返回时,<code>to</code>的内容将是空字符终止的字符串。返回值是编码后的字符串的长度,不包括终止空字符。
</p>
<h4>20.4.13.2 范例</h4>
<pre>char query[1000],*end;
end = strmov(query,"INSERT INTO test_table values(");
*end++ = '\'';
end += mysql_escape_string(end,"What's this",11);
*end++ = '\'';
*end++ = ',';
*end++ = '\'';
end += mysql_escape_string(end,"binary data: \0\r\n",16);
*end++ = '\'';
*end++ = ')';
if (mysql_real_query(&mysql,query,(unsigned int) (end - query)))
{
fprintf(stderr, "Failed to insert row, Error: %s\n",
mysql_error(&mysql));
}
</pre>
<p>例子中所用的<code>strmov()</code>函数被包括在<code>mysqlclient</code>库中且功能类似于<code>strcpy()</code>,但是返回一个指向空终止的第一个参数的指针。
</p>
<h4>20.4.13.3 返回值</h4>
<p>放进<code>to</code>的值的长度,不包括终止空字符。</p>
<h4>20.4.13.4 错误</h4>
<p>无。</p>
<p> </p>
<h3><a NAME="mysql_fetch_field" HREF="manual_toc.html#mysql_fetch_field">20.4.14<code>
mysql_fetch_field()</code></a></h3>
<p><code>MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result)</code> </p>
<h4>20.4.14.1 说明</h4>
<p>返回作为一个<code>MYSQL_FIELD</code>结构的一个结果集合的一个列的定义。重复调用这个函数在结果集合中检索所有关于列的信息。当没有剩下更多的字段时,<code>mysql_fetch_field()</code>返回<code>NULL</code>。</p>
<p>在每次你执行一个新的<code>SELECT</code>查询,<code>mysql_fetch_field()</code>被重置(reset)以返回有关第一列的信息。由<code>mysql_fetch_field()</code>返回的字段也受调用<code>mysql_field_seek()</code>的影响。</p>
<p>如果你调用<code>mysql_query()</code>在一张表上执行一个<code>SELECT</code>,但是没调用<code>mysql_store_result()</code>,如果你调用<code>mysql_fetch_field()</code>询问一个<code>BLOB</code>字段的长度,<strong>MySQL</strong>返回缺省BLOB长度(8K字节)。(选择8K的长度是因为<strong>MySQL</strong>不知道<code>BLOB</code>的最大长度。这应该在某个时候是它可配置)
一旦你已经检索了结果集合,<code>field->max_length</code>包含了在特定查询中对于该列最大值的长度。</p>
<h4>20.4.14.2 返回值</h4>
<p>当前列的<code>MYSQL_FIELD</code>结构。如果没有列剩下,<code>NULL</code>。</p>
<h4>20.4.14.3 错误</h4>
<p>无。</p>
<h4>20.4.14.4 范例</h4>
<pre>MYSQL_FIELD *field;
while((field = mysql_fetch_field(result)))
{
printf("field name %s\n", field->name);
}
<a NAME="IDX737"></a> </pre>
<h3><a NAME="mysql_fetch_fields" HREF="manual_toc.html#mysql_fetch_fields">20.4.15<code>
mysql_fetch_fields()</code></a></h3>
<p><code>MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result)</code> </p>
<h4>20.4.15.1 说明</h4>
<p>返回一个结果集合的所有<code>MYSQL_FIELD</code>结构的数组。每个结构提供结果结合中一列的字段定义。
</p>
<h4>20.4.15.2 返回值</h4>
<p>一个结果集合的所有<code>MYSQL_FIELD</code>结构的一个数组。</p>
<h4>20.4.15.3 错误</h4>
<p>无。 </p>
<h4>20.4.15.4 范例</h4>
<pre>unsigned int num_fields;
unsigned int i;
MYSQL_FIELD *fields;
num_fields = mysql_num_fields(result);
fields = mysql_fetch_fields(result);
for(i = 0; i < num_fields; i++)
{
printf("Field %u is %s\n", i, fields[i].name);
}
</pre>
<h3><a NAME="mysql_fetch_field_direct" HREF="manual_toc.html#mysql_fetch_field_direct">20.4.16<code>
mysql_fetch_field_direct()</code></a></h3>
<p><code>MYSQL_FIELD *mysql_fetch_field_direct(MYSQL_RES *result, unsigned int fieldnr)</code>
</p>
<h4>20.4.16.1 说明</h4>
<p>给定在一个结果集合中的一个列的字段编号<code>fieldnr</code>,返回作为<code>MYSQL_FIELD</code>结构的列的字段定义。你可以使用这个函数检索任意列的义。<code>fieldnr</code>的值应该在从0到<code>mysql_num_fields(result)-1</code>范围内。</p>
<h4>20.4.16.2 返回值</h4>
<p>指定列的<code>MYSQL_FIELD</code>结构。 </p>
<h4>20.4.16.3 错误</h4>
<p>无。 </p>
<h4>20.4.16.4 范例</h4>
<pre>unsigned int num_fields;
unsigned int i;
MYSQL_FIELD *field;
num_fields = mysql_num_fields(result);
for(i = 0; i < num_fields; i++)
{
field = mysql_fetch_field_direct(result, i);
printf("Field %u is %s\n", i, field->name);
}
<a NAME="IDX739"></a> </pre>
<h3><a NAME="mysql_fetch_lengths" HREF="manual_toc.html#mysql_fetch_lengths">20.4.17<code>
mysql_fetch_lengths()</code></a></h3>
<p><code>unsigned long *mysql_fetch_lengths(MYSQL_RES *result)</code> </p>
<h4>20.4.17.1 说明</h4>
<p>返回在结果集合内的当前行的列长度。如果你计划拷贝字段值,这个长度信息对优化也是有用的,因为你可以避免调用<code>strlen()</code>。另外,如果结果集合中包含二进制数据,你<em>必须</em>使用这个函数确定数据的大小,因为<code>strlen()</code>对包含空字符的任何字段返回不正确的结果。
</p>
<p>空列和包含<code>NULL</code>的列的长度值是零。为了看清如何区分这两种情况,见<code>mysql_fetch_row()</code>的说明。</p>
<h4>20.4.17.2 返回值</h4>
<p>表示每列大小的无符号长整数的一个数组(不包括任何终止空字符)。如果出现一个错误,<code>NULL</code>。
</p>
<h4>20.4.17.3 错误</h4>
<p><code>mysql_fetch_lengths()</code>只对结果集合的当前行有效。如果你在调用<code>mysql_fetch_row()</code>之前或在检索出在结果中的所有以后,它返回<code>NULL。</code></p>
<h4>20.4.17.4 范例</h4>
<pre>MYSQL_ROW row;
unsigned long *lengths;
unsigned int num_fields;
unsigned int i;
row = mysql_fetch_row(result);
if (row)
{
num_fields = mysql_num_fields(result);
lengths = mysql_fetch_lengths(result);
for(i = 0; i < num_fields; i++)
{
printf("Column %u is %lu bytes in length.\n", i, lengths[i]);
}
}
<a NAME="IDX740"></a> </pre>
<h3><a NAME="mysql_fetch_row" HREF="manual_toc.html#mysql_fetch_row">20.4.18<code>
mysql_fetch_row()</code></a></h3>
<p><code>MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)</code> </p>
<h4>20.4.18.1 说明</h4>
<p>检索一个结果集合的下一行。当在<code>mysql_store_result()</code>之后使用时,如果没有更多的行可见所时,<code>mysql_fetch_row()</code>返回<code>NULL</code>。当在<code>mysql_use_result()</code>之后使用时,当没有更多的行可检索时或如果出现一个错误,<code>mysql_fetch_row()</code>返回<code>NULL。</code></p>
<p>在行中值的数量由<code>mysql_num_fields(result)</code>给出。如果<code>row</code>保存了从一个对用<code>mysql_fetch_row()</code>调用返回的值,指向该值的指针作为<code>row[0]</code>到<code>row[mysql_num_fields(result)-1]</code>来存取。在行中的<code>NULL</code>值由<code>NULL</code>指针指出。</p>
<p>在行中字段值的长度可以通过调用<code>mysql_fetch_lengths()</code>获得。空字段和包含<code>NULL</code>的字段长度都是
0;你可以通过检查该值的指针区分他们。如果指针是<code>NULL</code>,字段是<code>NULL</code>;否则字段是空的。</p>
<h4>20.4.18.2 返回值</h4>
<p>下一行的一个<code>MYSQL_ROW</code>结构。如果没有更多的行可检索或如果出现一个错误,<code>NULL。</code></p>
<h4>20.4.18.3 错误</h4>
<dl COMPACT="mysql_fetch_row">
<dt><code>CR_SERVER_LOST</code> </dt>
<dd>对服务器的连接在查询期间失去。 </dd>
<dt><code>CR_UNKNOWN_ERROR</code> </dt>
<dd>发生一个未知的错误。 </dd>
</dl>
<h4>20.4.18.4 范例</h4>
<pre>MYSQL_ROW row;
unsigned int num_fields;
unsigned int i;
num_fields = mysql_num_fields(result);
while ((row = mysql_fetch_row(result)))
{
unsigned long *lengths;
lengths = mysql_fetch_lengths(result);
for(i = 0; i < num_fields; i++)
{
printf("[%.*s] ", (int) lengths[i], row[i] ? row[i] : "NULL");
}
printf("\n");
}
<a NAME="IDX741"></a> </pre>
<h3><a NAME="mysql_field_count" HREF="manual_toc.html#mysql_field_count">20.4.19<code>
mysql_field_count()</code></a></h3>
<p><code>unsigned int mysql_field_count(MYSQL *mysql)</code> </p>
<p>如果你正在使用一个比3.22.24早<strong>MySQL</strong>版本,你应该使用<code>unsigned
int mysql_num_fields(MYSQL *mysql)</code>。 </p>
<h4>20.4.19.1 说明</h4>
<p>返回在连接上的最近查询的列的数量。 </p>
<p>这个函数一般用在<code>mysql_store_result()</code>返回<code>NULL</code>时(这样你没有结果设置指针)。在这种情况中,你能调用<code>mysql_field_count()</code>确定<code>mysql_store_result()</code>是否应该产生了一个非空的结果。这允许一个客户程序执行正确的操作,而不必知道查询是否是一条<code>SELECT</code>(或类<code>SELECT</code>)语句。下面显示的例子说明这怎样可以做到。
</p>
<p>见<a HREF="manual_Clients.html#NULL_mysql_store_result">20.4.51 为什么在<code>mysql_query()</code>返回成功后,<code>mysql_store_result()</code>有时返回<code>NULL?</code></a>。</p>
<h4>20.4.19.2 返回值</h4>
<p>在结果集合中表示字段数量字的一个无符号整数。 </p>
<h4>20.4.19.3 错误</h4>
<p>无。 </p>
<h4>20.4.19.4 范例</h4>
<pre>MYSQL_RES *result;
unsigned int num_fields;
unsigned int num_rows;
if (mysql_query(&mysql,query_string))
{
// error
}
else // query succeeded, process any data returned by it
{
result = mysql_store_result(&mysql);
if (result) // there are rows
{
num_fields = mysql_num_fields(result);
// retrieve rows, then call mysql_free_result(result)
}
else // mysql_store_result() returned nothing; should it have?
{
if(mysql_field_count(&mysql) == 0)
{
// query does not return data
// (it was not a SELECT)
num_rows = mysql_affected_rows(&mysql);
}
else // mysql_store_result() should have returned data
{
fprintf(stderr, "Error: %s\n", mysql_error(&mysql));
}
}
}
</pre>
<p>另一个选择是用<code>mysql_errno(&mysql)</code>代替<code>mysql_field_count(&mysql)</code>调用。在这种情况中,你直接检查来自<code>mysql_store_result()</code>的一个错误而非从<code>mysql_field_count()</code>值来推断语句是否是一个<code>SELECT</code>。</p>
<p><a NAME="IDX742"></a> </p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -