2011-07-31 12 views
7

Estoy usando codeigniter, y tengo la siguiente función en mi modelo para dar puntos al usuario. Sin embargo, no funciona, sino que establece la columna de puntos en 0.Codeigniter, aumentar el valor de la base de datos por valor contenido en la variable

Así está escrito en el manual codeigniter. Por lo tanto no tengo ni idea de por qué no está funcionando ...

Gracias

function give_points($username,$points) 
{ 
    $this->db->set('points', 'points + $points'); 
    $this->db->where('username', $username); 
    $this->db->update('users'); 
    echo"done"; 
} 

Respuesta

10

Creo que tiene que decirle específicamente a CI no escapar del texto. No tengo una instalación IC útil para probar esto, pero creo que fue algo así como:

$this->db->set('points', 'points + ' . (int) $points, FALSE); 
1

No estoy seguro es la causa de su problema, pero que está utilizando comillas simples, en las siguientes líneas:

$this->db->set('points', 'points + $points'); 

Con esto, la cadena $points se inyectará tal cual, literalmente, en su consulta SQL; no se usará su valor.


Si desea $points a interpolar (por lo que su valor se pone en su lugar, en esa cadena), debe utilizar comillas dobles:

$this->db->set('points', "points + $points"); 


Para más información sobre variables interpolación, consulte la sección Variables parsing del Manual de PHP.

+0

Eso producse la consulta: UPDATE '' de los usuarios SET '= 'points' puntos + 1000' donde' nombre de usuario '= 'thomas' que no funciona ... ¿alguna otra idea? –

+0

Parece que el campo 'points' en la base de datos es un número entero, y está intentando acceder a él como una cadena: su consulta debería verse como' UPDATE users SET points = 'points + 1000' WHERE username = 'thomas''; ;; Tal vez tienes alguna forma de indicar eso a CI? No conozco a CI lo suficiente como para ayudar más, lo siento. –

0

Si existe la posibilidad, siempre verifique la consulta SQL creada; no sé cómo hacerlo con CI.

Sin embargo, su set() parece defectuoso.

$this->db->set('points', "points + $points"); 

Anteriormente, $points era parte de la cadena de , y no expandido en el contenido de $points, debido a que el uso de una comilla simple en lugar de una doble cita - ver la manual regarding strings en PHP.

$this->db->set('points', 'points + ' . (int) $points); 

Un código levemente mejor es la de arriba, ya que vence posible SQL injection, dependiendo de dónde proviene originalmente de $points.

+0

Ambas sugerencias producen la consulta: ACTUALIZAR 'usuarios' SET' points' = 'points + 1000' WHERE 'username' = 'thomas' Esta consulta no funciona ... Gracias –

+0

Debe verificar el manual de IC luego . Parece como si CI siempre pone la cadena dada en 'set()' en comillas, por lo que esto no puede funcionar de esa manera. – Shi

Cuestiones relacionadas