PHP - ejecutar multiples updates en una sola consulta

   
Vista:

ejecutar multiples updates en una sola consulta

Publicado por efren (22 intervenciones) el 24/04/2015 04:08:58
Hola amigos, escribo por aqui en busca de ayuda, y si alguien me puede ayudar se que sn ustedes.

tengo el siguiente ejercicio en problema ya que estoy intentando realizar un update multiple en una sola.

estoy enviando por medio de ajax las variables estas variables contienen los ID de la tabla mysql con esos ID hago un while para obtner ciertos campos los cuales llevo en un array. pero a la misma ves quiero hacer un update a un campo en la tabla donde el ID sea los ID que recoja la variable enviada en ajax.

logro hacer el update, pero me lo hace la cantidad igual al numero de ID recogidos me explico estoy intentando hacer esto.

tengo lo siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
Tabla : oferts
campo : ID
campo: rest ( es un numero ejemplo 200 )
 
ejecuto :
 
include('config.php');
$jsondata = array();
//$auctions=$_POST['clave']; // esta la variable que recibo con ajax la cual contiene esto:
 
$auctions = '3&4&5&6&'; // son los ID , actualmente recibo 4 pero puede variar ser mas o ser menos.
 
 
$extraer=explode("&", $auctions);
$arr =($extraer);
 
$id = $arr;
 
if( is_array($id) ) {
        $id = array_map('intval', $id);
        $querywhere = "WHERE `ID` IN (" . implode( ',', $id ) . ")";
    } else {
        $id = intval($id);
        $querywhere = "WHERE `ID` = " . $id;
    }
 
 
 
 
 
 
$very2 = mysql_query( "SELECT * FROM `oferts` " . $querywhere ) or die(mysql_error());
$result = mysql_num_rows($very2);
while ($obj = mysql_fetch_object($very2)) {
    $arr2 = array('ID' => $obj->id,
                   'T' => $obj->time,
                   'R' => $obj->rest,
                   'OF' => $obj->ofertante,
 
 
        );
 
 
 
 
      $restar="UPDATE oferts SET rest = rest - '1' '". $querywhere;
      mysql_query($restar,$con) or die('Error. '.mysql_error());
 
// pero resulta que en ves de restarme uno me resta es la cantidad de id recibidos, 
//ejemplo actualemnte recibo 4 ID (3,4,5,6) en la variable que envia ajax y este UPDATE me resta 4
 //en vez de uno, si recibo 6 ID en la variable me resta 6. y no entiendo como hacer que solo
 //me reste 1 en cada uno de los ID recibidos.
 
 
   $jsondata[]['A']=$arr2;
 
 
}
 
 
echo json_encode($jsondata,JSON_FORCE_OBJECT);
exit();

espero puedan ayudarme amigos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alberto

ejecutar multiples updates en una sola consulta

Publicado por Alberto (222 intervenciones) el 24/04/2015 10:23:25
Hola...

Veo correctamente implementada la función explode() ya que con ella te permitirá separar tu cadena de acuerdo a tus necesidades, sin embargo, el resto del código se me hace no tan funcional para lo que tu necesitas, con gusto te explico del porque lo veo de esa manera...

1.- Los ID ya los tienes recuperados con un formato especifico; es decir, implementas un separador para determinar donde termina y donde empieza un ID nuevo, hasta ahí todo esta perfecto por lo que solo necesitas separarlos de la forma correcta que tu usas, sin embargo, la función explode(), te devuelve todos los valores dentro de un arreglo por lo tanto si quieres acceder a un valor especifico dentro de el tendrías que usar la forma normal de acerlo $variable[index]. Ahora bien, si necesitas todos los valores de ese arreglo entonces tienes que recorrerlos mediante un bucle, para ello necesitas saber el tamaño del arreglo por lo tanto puedes usar la función count($arreglo), la cual te devolverá el total de elementos que tiene dicho arreglo.

2.- Como tu necesitas trabajar con todos sus ID es sentido común que entonces tengas que recuperar todos sus valores por lo cual necesitas recorrerlo...

1
2
3
for($i = 0; $i < count($extraer); $i++){
	echo $extraer[$i];
}

Conforme lo vas recorriendo entonces vas haciendo la consulta correspondiente a ese id para recuperar sus valores correspondientes.

3.- Cuando ejecutas la consulta con la funcion mysql_query() automáticamente te esta devolviendo un arreglo por lo que meter el arreglo dentro de otro arreglo solamente hace mas ineficiente tu aplicación, en esta parte únicamente es cuestión de jugar con la columna y/o columnas que vamos a editar.

1
2
3
while($row = mysql_fetch_array($result)){
	echo $row['id'];
}

4.- Posteriormente, solamente es cuestión de que por cada registro que recuperes hagas nuevamente una ejecución de consulta pero con la actualización correspondiente, ya que por lo visto solamente sería cuestión de aplicar una resta.

5.- Si solamente piensas aplicar una resta de acuerdo al ID correspondiente, no crees que es muy extremo realizar una consulta sabiendo que el ID lo tienes ya dentro de un arreglo mediante el explode(), por lo tanto al recorrer dicho arreglo solo es cuestión de ir pasando el ID a su condición WHERE para que ejecute la resta correspondiente, y de esta manera lo que haces en múltiples consultas a tu base de datos lo puedes hacer en un solo paso.

1
2
3
4
5
6
$variable = "3&4&5&6";
$extraer = explode("&",$variable);
for($i = 0; $i < count($extraer); $i++){
	$sql = "UPDATE tabla SET campo = campo - 1 WHERE id = '".$extraer[$i]."'";
	$result = mysql_query($sql,$conexion);
}

Sin mas que comentar, cualquier duda y/o inconveniente, aquí estamos. Suerte!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

ejecutar multiples updates en una sola consulta

Publicado por efren (22 intervenciones) el 25/04/2015 21:58:24
Saludos, gracias por responder amigo, te explico xq hago el while para imprimir en json con ajax, de este arreglo no estoy obteniendo el id para hacer el update, ya que si ves lo tengo conjugado en la variable $querywhere

el update debo de hacerlo dentro del while ya que este se debe de ejecutar con if condicional es decir
1
2
3
4
5
if($obj['rest'] <1){
 
// hago el update restando 1 a cada uno de los ID.
 
}

ya logre hacerlo aplicando un (for) como indicastes

gracias por tu ayuda
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar