2012-06-14 14 views
6

Czy ktoś wie, jak używać SELECT WHERE IN w node-mysql?SELECT WHERE IN w node-mysql

Próbowałem poniższy kod, ale pojawia się następujący komunikat o błędzie:

'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' 

To jest mój kod:

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

Nie podoba Ci się komunikat o błędzie SQL? Soooo0o0o0oo helpful – lbstr

Odpowiedz

2

trzeba zacytować swoje struny, nie używać odwrócone, pojedyncze apostrofy.

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

Tak, backtricks nie są dla wartości. –

+0

Ive próbowałem już, i otrzymuję to, "Masz błąd w składni SQL; sprawdź instrukcję, która odpowiada twojej wersji serwera MySQL dla właściwej składni do użycia w pobliżu '' (\ 'PHP \', \ 'apache \', \ 'Java \') '' w linii 1 ' :( –

+0

Wygląda podobnie jak zapytanie automatycznie wymyka się cudzysłowów.Czy istnieje opcja, która nie będzie z nich uciec? – gcochard

12

Musisz użyć IN (?) i nie IN ?.

Dowolne manipulowanie ciągami znaków może spowodować utworzenie backdoora SQL INJECTION.

-1

Roztwór roboczy:

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('/'); 
    } 
); 

Nie trzeba ręcznie zawijać tagArray w cudzysłowach. Znika przez moduł mysql.

+1

Powinieneś dodać nawiasy do?: "SELECT tag_id FROM tag WHERE nazwa_znacznika IN (?)", –

1

Aby uzyskać bezpieczniejsze rozwiązanie, unikając konieczności ucieczki od wartości, użyj? podobne do normalnych czynności, ale dynamiczne tworzenie takich symboli zastępczych:

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) { 
    . . . 
}) 
Powiązane problemy