Foros del Web » Programando para Internet » PHP »

Pasar valor de consulta mysql a funcion

Estas en el tema de Pasar valor de consulta mysql a funcion en el foro de PHP en Foros del Web. Hola chicos. Estoy haciendo un módulo para Prestashop y una de las funcionalidades que quiero implementar es que, mediante una página de administración, me muestre ...
  #1 (permalink)  
Antiguo 28/10/2010, 03:01
Avatar de mahuro  
Fecha de Ingreso: abril-2006
Mensajes: 15
Antigüedad: 18 años, 6 meses
Puntos: 0
Pregunta Pasar valor de consulta mysql a funcion

Hola chicos.

Estoy haciendo un módulo para Prestashop y una de las funcionalidades que quiero implementar es que, mediante una página de administración, me muestre todo el contenido de una tabla y me permita modificar el registro.

Para ello he creado una consulta y recupero los resultados con mysql_fetch_assoc y los muestro con un <input> dentro de una tabla html.

Hasta aquí todo bien. El problema es que al pasar el valor de $_POST['campo'] a lña función que contiene el UPDATE de mysql SIEMPRE me devuelve el último valor recogido por la consulta.

Os pongo un ejemplo por si no me he explicado con claridad.

Función para modificar los datos:
Código:
public function modificarDatos(){

$consulta = "UPDATE "._DB_PREFIX_."incidences SET status='".$_POST['status']."' WHERE  id_incidence = ".$_POST['id_incidence'].";";
	
mysql_query($consulta);
}

Código:
$sql = "SELECT * FROM "._DB_PREFIX_."incidences INNER JOIN "._DB_PREFIX_."customer ON "._DB_PREFIX_."incidences.id_user = "._DB_PREFIX_."customer.id_customer ORDER BY ref_incidence DESC;";

$res = mysql_query($sql);
$result = $res; // <- utilizo $res o $result según qué función, por eso lo asigno como variable
$filas = mysql_fetch_assoc ($result);
$nres = mysql_num_rows($result);

//Asigno la función a una variable para aplicarla al boton y no tener problemas:
$modificame = $this->modificarDatos();

while ($filas) {
echo ('
<tr>
<td><input type="text" name="thisID" value="'.$filas['id_incidence'].'" size="4" /></td>
<td><input type="text" name="type" value="'.$filas['type'].'" size="5" /></td>
<td><input type="text" name="date" value="'.strftime('%d/%m/%Y', strtotime($filas['date'])).'" size="10" /></td>
<td><input type="text" name="customer" value="'.$filas['firstname'].' '.$filas['lastname'].'" /></td>
<td>
   <select name="status">
      <option for="status">'.$this->l($filas['status']).'</option>
      <option for="status"><hr /></option>
      <option for="status" value="'.$this->l('Unsolved').'">'.$this->l('Unsolved').'</option>
      <option for="status" value="'.$this->l('In Process').'">'.$this->l('In Process').'</option>
      <option for="status" value="'.$this->l('Solved').'">'.$this->l('Solved').'</option>
   </select>
</td>
<td><input type="text" name="title" value="'.$filas['title'].'" size="30"/></td>
<td><input type="text" name="ref_incidence" value="'.$filas['ref_incidence'].'"/></td>
<td>&nbsp;<input type="submit" name="submitMod" value="Cambiar" onclick="return $modificame" /></td>
				
</tr>
');
//finalizamos
$filas = mysql_fetch_assoc ($res);
}
// Si hemos modificado recargamos la página y consultamos de nuevo para visualizar los cambios:
if (isset($_POST['submitMod']) && ($_POST['submitMod'] != '')) {mysql_query($sql);}
El problema: $_POST['id_incidence'] no recoge el valor de cada $filas['id_incidence'], sino el último valor devuelto por la consulta.

¿Podéis decirme qué estoy haciendo mal?

Muchisisisismas gracias.
  #2 (permalink)  
Antiguo 28/10/2010, 03:18
 
Fecha de Ingreso: marzo-2010
Ubicación: Barcelona
Mensajes: 657
Antigüedad: 14 años, 8 meses
Puntos: 26
Respuesta: Pasar valor de consulta mysql a funcion

En vez de utilizar $filas = mysql_fetch_assoc ($result); y despues hacer el bucle while ($filas), hazlo todo junto, es decir: while ($filas = mysql_fetch_assoc ($result)) {

También una cosa que me he dado cuenta, utiliza mysql_num_rows() antes del mysql_fetch_assoc ().

Espero que te sirva de ayuda.
  #3 (permalink)  
Antiguo 28/10/2010, 04:23
Avatar de mahuro  
Fecha de Ingreso: abril-2006
Mensajes: 15
Antigüedad: 18 años, 6 meses
Puntos: 0
Respuesta: Pasar valor de consulta mysql a funcion

Gracias Vallu, pero no es eso.

Haciéndolo como tu mencionas solamente me devuelve un resultado (no todos como necesitito y me genera un error de Mysql de falta de registros en la base de datos).

Pero no hay problema. un colega me ha propuesto una solución al problema.

Problema: el sistema entiende que todos los registros mostrados forman parte del mismo formulario.

Solución: identificar de manera unívoca cada resultado.

De esta manera, la función que ejecuta la modificación quedaría así:
Código:
	public function modificarDatos(){
		global $error;
		
		if(isset($_POST['submitMod']) && $_POST['submitMod'] != ''){
			// echo("<pre>"); print_r($_POST); echo("</pre>");
			if($_POST["idIncidence"] > 0){
				$idIncidence = (int)$_POST["idIncidence"];
				$consulta = "
					UPDATE "._DB_PREFIX_."incidences SET 
						type = '".$_POST['type_'.$idIncidence]."', 
						status = '".$_POST['status_'.$idIncidence]."', 
						title = '".$_POST['title_'.$idIncidence]."'
					WHERE  id_incidence = ".$idIncidence."
				;";
				mysql_query($consulta);
				if (!mysql_query){
				$error .= ($consulta.'<br />');
				$error .= ('Error MySQL: '.mysql_error());
				}
			}
		}
	}
Y cada registro del formulario así:
Código:
while ($filas) {

		echo ('
				<tr>
					<td><input type="text" name="thisID_'.$filas['id_incidence'].'" value="'.$filas['id_incidence'].'" size="4" /></td>
					<td><input type="text" name="type_'.$filas['id_incidence'].'" value="'.$filas['type'].'" size="5" /></td>
					<td><input type="text" name="date_'.$filas['id_incidence'].'" value="'.strftime('%d/%m/%Y', strtotime($filas['date'])).'" size="10" /></td>
					<td><input type="text" name="customer_'.$filas['id_incidence'].'" value="'.$filas['firstname'].' '.$filas['lastname'].'" /></td>
					<td>
						<select name="status_'.$filas['id_incidence'].'">
							<option for="status">'.$this->l($filas['status']).'</option>
							<option for="status"><hr /></option>
							<option for="status" value="'.$this->l('Unsolved').'">'.$this->l('Unsolved').'</option>
							<option for="status" value="'.$this->l('In Process').'">'.$this->l('In Process').'</option>
							<option for="status" value="'.$this->l('Solved').'">'.$this->l('Solved').'</option>
						</select>
					</td>
					<td><input type="text" name="title_'.$filas['id_incidence'].'" value="'.$filas['title'].'" size="30"/></td>
					<td><input type="text" name="ref_incidence_'.$filas['id_incidence'].'" value="'.$filas['ref_incidence'].'"/></td>
					<td>&nbsp;<input type="submit" name="submitMod" value="Cambiar" onclick="this.form.idIncidence.value = '.$filas['id_incidence'].'; return true;" /></td>
				
				</tr>
			');
			//finalizamos
			$filas = mysql_fetch_assoc ($res);
			}
Para que cada submit pase el valor adecuado a la función he usado un poquito de javascript en el input submit:
Código:
onclick="this.form.idIncidence.value = '.$filas['id_incidence'].'; return true;"
Haaaala! Gracias por todo y espero os sirva (yo me he tirado una semana dándole vueltas y no encontraba la solución. Menos mal que me ha ayudado un colega)

Gracias Ramón ;)

Etiquetas: funcion, mysql, pasar
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:15.