<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision: 297028 $ -->
<!-- EN-Revision: 297028 Maintainer: jesus_cova Status: ready -->
<refentry xml:id="function.mysql-affected-rows" xmlns="http://docbook.org/ns/docbook">
 <refnamediv>
  <refname>mysql_affected_rows</refname>
  <refpurpose>Obtiene el número de filas afectadas en la anterior operación de MySQL</refpurpose>
 </refnamediv>

 <refsect1 role="description">
  &reftitle.description;
  <methodsynopsis>
   <type>int</type><methodname>mysql_affected_rows</methodname>
   <methodparam choice="opt"><type>resource</type><parameter>link_identifier</parameter></methodparam>
  </methodsynopsis>
  <para>
   Obtiene el número de filas afectadas por la última consulta INSERT, UPDATE, REPLACE
   o DELETE asociada con <parameter>link_identifier</parameter>.  
  </para>
 </refsect1>

 <refsect1 role="parameters">
  &reftitle.parameters;
  <para>
   <variablelist>
    &mysql.linkid.description;
   </variablelist>
  </para>
 </refsect1>

 <refsect1 role="returnvalues">
  &reftitle.returnvalues;
  <para>
   Devuelve el número de filas afectadas en caso de éxito, y -1 si la última consulta
   fallo.
  </para>
  <para>
   Si la consulta anterior fue DELETE con ninguna clausula WHERE, todos
   los registros han sido borrados de la tabla pero ésta función
   devolverá cero con una versión anterior a MySQL 4.1.2.
  </para>
  <para>
   Al utilizar UPDATE, MySQL no va a actualizar las columnas donde el nuevo valor es el
   mismo que el anterior. Esto crea la posibilidad que  
   <function>mysql_affected_rows</function> no pueda equivaler en realidad al número
   de filas encontradas, solamente el número de filas que estuvo literalmente afectada por
   la consulta.
  </para>
  <para>
   La declaración REPLACE primero borra el registro con la misma clave primaria
   y luego inserta el nuevo registro. Esta función devuelve el número de
   registros borrados mas el número de registros insertados.
  </para>
 </refsect1>

 <refsect1 role="examples">
  &reftitle.examples;
  <para>
   <example>
    <title>Ejemplo de <function>mysql_affected_rows</function></title>
    <programlisting role="php">
<![CDATA[
<?php
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$link) {
    die('No pudo conectar: ' . mysql_error());
}
mysql_select_db('mydb');

/* Debería devolver el número correcto de registros borrados */
mysql_query('DELETE FROM mytable WHERE id < 10');
printf("Registros borrados: %d\n", mysql_affected_rows());

/* con una clausula WHERE que nunca es verdad, debería devolver 0 */
mysql_query('DELETE FROM mytable WHERE 0');
printf("Registros borrados: %d\n", mysql_affected_rows());
?>
]]>
    </programlisting>
    &example.outputs.similar;
    <screen>
<![CDATA[
Registros borrados: 10
Registros borrados: 0
]]>
    </screen>
   </example>
  </para>
  <para>
   <example>
    <title>Ejemplo de <function>mysql_affected_rows</function> al utilizar transacciones</title>
    <programlisting role="php">
<![CDATA[
<?php
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$link) {
    die('No pudo conectar: ' . mysql_error());
}
mysql_select_db('mydb');

/* Actualizar registros */
mysql_query("UPDATE mytable SET used=1 WHERE id < 10");
printf ("Registros actualizados: %d\n", mysql_affected_rows());
mysql_query("COMMIT");
?>
]]>
    </programlisting>
    &example.outputs.similar;
    <screen>
<![CDATA[
Registros actualizados: 10
]]>
    </screen>
   </example>
  </para>
 </refsect1>

 <refsect1 role="notes">
  &reftitle.notes;
  <note>
   <title>Transacciones</title>
   <para>
    Si se usa transacciones, es necesario llamar
    <function>mysql_affected_rows</function> después de la consulta INSERT, UPDATE, o
    DELETE, no después del COMMIT.
   </para>
  </note>
  <note>
   <title>Declaraciones SELECT</title>
   <para>
    Para conocer el número de filas devueltas por un SELECT, se puede usar
    usar <function>mysql_num_rows</function>.
   </para>
  </note>
  <note>
   <title>Cascada de Claves Foráneas</title>
   <para>
     <function>mysql_affected_rows</function> no cuenta la filas afectadas
     implícitamente aunque a través del uso de ON DELETE CASCADE and/or ON UPDATE CASCADE
     en las restricciones de las claves foráneas.
   </para>
  </note>
 </refsect1>

 <refsect1 role="seealso">
  &reftitle.seealso;
  <para>
   <simplelist>
    <member><function>mysql_num_rows</function></member>
    <member><function>mysql_info</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
-->
​
