⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 manual_clients.html

📁 详细介绍了MYSQL的主要功能几一些代码
💻 HTML
📖 第 1 页 / 共 5 页
字号:
<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>‘&quot;’和</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,&quot;INSERT INTO test_table values(&quot;);
*end++ = '\'';
end += mysql_escape_string(end,&quot;What's this&quot;,11);
*end++ = '\'';
*end++ = ',';
*end++ = '\'';
end += mysql_escape_string(end,&quot;binary data: \0\r\n&quot;,16);
*end++ = '\'';
*end++ = ')';

if (mysql_real_query(&amp;mysql,query,(unsigned int) (end - query)))
{
   fprintf(stderr, &quot;Failed to insert row, Error: %s\n&quot;,
           mysql_error(&amp;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-&gt;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(&quot;field name %s\n&quot;, field-&gt;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 &lt; num_fields; i++)
{
   printf(&quot;Field %u is %s\n&quot;, 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 &lt; num_fields; i++)
{
    field = mysql_fetch_field_direct(result, i);
    printf(&quot;Field %u is %s\n&quot;, i, field-&gt;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 &lt; num_fields; i++)
    {
         printf(&quot;Column %u is %lu bytes in length.\n&quot;, 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 &lt; num_fields; i++)
   {
       printf(&quot;[%.*s] &quot;, (int) lengths[i], row[i] ? row[i] : &quot;NULL&quot;);
   }
   printf(&quot;\n&quot;);
}
<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(&amp;mysql,query_string))
{
    // error
}
else // query succeeded, process any data returned by it
{
    result = mysql_store_result(&amp;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(&amp;mysql) == 0)
        {
            // query does not return data
            // (it was not a SELECT)
            num_rows = mysql_affected_rows(&amp;mysql);
        }
        else // mysql_store_result() should have returned data
        {
            fprintf(stderr, &quot;Error: %s\n&quot;, mysql_error(&amp;mysql));
        }
    }
}
</pre>

<p>另一个选择是用<code>mysql_errno(&amp;mysql)</code>代替<code>mysql_field_count(&amp;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 + -