Ver Mensaje Individual
  #1 (permalink)  
Antiguo 16/09/2008, 09:13
feral
 
Fecha de Ingreso: septiembre-2007
Mensajes: 184
Antigüedad: 16 años, 7 meses
Puntos: 4
Instrucciones predefinidas con la biblioteca mysqli

La blibioteca mysqli admite el uso de instrucciones predefinidas. A parte de que evitan radicalmente las inyecciones sql cuentan con otras ventajas.
Primero voy a mostrar un codigo que funciona correctamente haciendo uso de esta tecnica y despues voy a mostrar otro en el que tengo problemas y necesitaria ayuda.

Supongamos que tenemos un documento php que sirve para procesar los datos enviados por el usuario desde una pagina con formulario.
El objetivo de este documento php es insertar una fila nueva en una tabla de la base de datos con los diferentes valores aportados por el usuario.
Dentro del documento php, los comandos que ejecutarian esta insercion de la fila en la tabla son los siguientes;

Código PHP:
... 
 @ 
$db = new mysqli ('localhost''usuario''clave''b_datos');
if (
mysqli_connect_errno()) 
  {
     echo 
'Error: No fue posible conectarse a la base de datos.';
     exit;
  }

  
$query "insert into nombre_de_tabla values (?, ?, ?, ?)";
  
$stmt $db->prepare($query);
  
$stmt->bind_param ("sssd"$cadena1$cadena2$cadena3$numeral);
  
$stmt->execute();
  echo 
$stmt->affected_rows.' linea insertada correctamente en la tabla.';
  
$stmt->close(); 
... 
Este codigo me funciona y se logra el objetivo de insertar una fila en la tabla deseada y posteriormente mostrar el mensaje en pantalla de "1 linea insertada correctamente en la tabla".

El problema me surge cuando quiero utilizar una tecnica similar en vez de para vincular parametros , hacerlo con resultados en consultas de tipo select.

Por ejemplo, supongamos que tenemos un documento xhtml con un formulario utilizado para buscar dentro de una base de datos. Este formulario tendria un menu despegable para refinar la busqueda en una columna concreta de la tabla y un input="text" para recoger la palabra(s) de busqueda tecleada por el usuario.
El documento php que se encarga de procesar el formulario mostraria en pantalla en orden numerico los resultados.

La tabla productos contendria las columnas producto, marca, isbn y precio. En el menu despegable habria un valor a elegir que coincidiria con producto, marca o isbn que se pasaria como variable $columna , junto con las palabras introducidas por el usuario en el campo de texto que se pasaria como variable $busqueda.

Código PHP:
...
  @ 
$db = new mysqli('localhost''usuario''clave''b_datos');
  
  if (
mysqli_connect_errno()) 
  {
     echo 
'Error: No hay conexion.';
     exit;
  }
  
   
$query "select * from productos where ".$columna." like '%".$busqueda."%'";
   
$stmt $db->query($query);
   
$num_resultados $stmt->num_rows;
  

  echo 
'<p>Numero de productos encontrado : '.$num_resultados.'</p>';


  for (
$i=0$i <$num_results$i++)
  {
   
$stmt->bind_result ($producto$marca$isbn$precio);
   
$stmt->execute();
   
$row $stmt->fetch();

     echo 
'<p>'.($i+1).'. Producto: ';
     echo 
$row['producto'];
     echo 
'<br />Marca: ';
     echo 
$row['marca']);
     echo 
'<br />ISBN: ';
     echo 
$row['isbn']);
     echo 
'<br />Precio: ';
     echo 
$row['price'];
     echo 
'</p>';
  }

  
$stmt->close(); 
... 

Este codigo genera el numero correcto de coincidencias pero me muestra el mensaje de error siguiente;
Fatal error: Call to undefined method mysqli_result::bind_result() in C:\Program Files\url\www\resultadoss.php on line 67, ademas de no generar en pantalla los resultados de la consulta.

No estoy seguro si $stmt = $db->query($query); es el metodo correcto a usar en este caso, ni del orden correcto de las 3 primeras lineas del bucle for
y tampoco estoy seguro si este formato "echo $row['producto'];" devolveria los datos correctos ni si es necesario colocar interrogantes como en el ejemplo de codigo anterior. Tampoco estoy seguro si esto es debido en parte a un bug de mysqli que afecta a la plataforma windows.

Estoy corriendo en local windows/apache la version php 5.2.0. y mysql 5.0.27-community-log y soy nuevo con la programacion php asi que toda ayuda que pueda indicarme fallos sera bienvenida y si alguien me podria dar la solucion correcta se lo agradeceria mucho.