2012-06-14 16 views
6

¿Alguien sabe cómo usar SELECT WHERE IN en node-mysql?SELECCIONE DONDE IN en node-mysql

he probado el código de abajo, pero me sale el siguiente mensaje de error:

'You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''(`PHP`,`apache`)'' at line 1' 

Este es mi código:

whereIn = '('; 
for (var i in tagArray) { 
    if (i != tagArray.length - 1) { 
     whereIn += "`" + tagArray[i] + "`,";  
    }else{ 
     whereIn += "`" + tagArray[i] + "`"; 
    } 
} 
whereIn += ')'; 

console.log(whereIn); 

client.query(
    'SELECT tag_id FROM tag WHERE tag_name IN ?', 
    [whereIn], 
    function(err, result, fields) { 
     client.destroy(); 

     if (err) { 
      throw err; 
     } 

     console.log(result); 

     res.redirect('/'); 
    } 
); 
+2

¿No le encantan los mensajes de error de SQL? Soooo0o0o0oo helpful – lbstr

Respuesta

2

Es necesario citar sus cadenas, no use acentos abiertos.

whereIn = '('; 
for (var i in tagArray) { 
    if (i != tagArray.length - 1) { 
     whereIn += "'" + tagArray[i] + "',";  
    }else{ 
     whereIn += "'" + tagArray[i] + "'"; 
    } 
} 
whereIn += ')'; 
+0

Sí, los backticks no son para valores. –

+0

Lo he intentado ya, y obtengo esto, 'Tiene un error en su sintaxis de SQL; revise el manual que corresponde a su versión del servidor MySQL para la sintaxis correcta para usar cerca de '' (\ 'PHP \', \ 'apache \', \ 'Java \') '' en la línea 1 ' :( –

+0

Looks al igual que su consulta se escapa automáticamente de las comillas. ¿Existe una opción que NO se les escapará? – gcochard

12

usted tiene que utilizar IN (?) y NO IN ?.

Cualquier manipulación de cadenas puede dar como resultado una puerta trasera SQL INJECTION.

-1

una solución de trabajo:

client.query(
    'SELECT tag_id FROM tag WHERE tag_name IN ?', 
    [tagArray], 
    function(err, result, fields) { 
     client.destroy(); 

     if (err) { 
      throw err; 
     } 

     console.log(result); 

     res.redirect('/'); 
    } 
); 

No hay necesidad de ajustar manualmente tagArray entre comillas. Es escapado por el módulo mysql.

+1

Debe agregar corchetes a?: 'SELECT tag_id FROM tag WHERE tag_name IN (?)', –

1

Para una solución más segura que evita tener que escapar de valores, ¿usar? params como lo haría normalmente, pero cree los marcadores de posición param dinámicamente como este:

var inlist = ''; 
for(var i=0; i<ids.length; i++) { 
    inlist += '?,'; 
} 
inlist = inlist.substring(0,inlist.length-1); 

var sql = 'SELECT a, b, c FROM mytable WHERE id in (' + inlist + ')'; 

conn.query(sql, ids, function(err, rows) { 
    . . . 
}) 
Cuestiones relacionadas