J'ai un tableau de chaînes. Lorsque j'utilise .toString () pour le produire, les guillemets ne sont pas conservés. Cela rend difficile la construction de la requête mysql en utilisant un "in". Considérer ce qui suit:
SELECT * FROM Table WHERE column IN ('item1','item2','item3','item4')
toString is returning: IN (item1,item2,item3,item4)
Il doit y avoir une solution simple que je néglige ici.
5 réponses
Les guillemets ne sont pas conservés car ils ne font pas réellement partie de la valeur de chaîne, ils sont juste nécessaires pour indiquer les littéraux de chaîne dans votre code.
Donc, n'utilisez pas toString()
. Au lieu de cela, une façon de procéder est la suivante:
var arr = ['item1','item2','item3','item4'];
var quotedAndCommaSeparated = "'" + arr.join("','") + "'";
// quotedAndCommaSeparated === "'item1','item2','item3','item4'"
La méthode Array.join () renvoie une chaîne qui est tout des éléments du tableau concaténés en une seule chaîne avec un séparateur (facultatif) entre chaque élément. Donc, si vous spécifiez un séparateur qui comprend les guillemets et les virgules, vous n'avez qu'à ajouter manuellement un devis de début et de fin pour le premier et le dernier élément (respectivement).
(Et s'il vous plaît dites-moi que vous n'utilisez pas JavaScript côté client pour former votre SQL.)
EDIT: pour autoriser un tableau vide, incluez une valeur par défaut pour la chaîne résultante, sinon (comme indiqué par missingno) la chaîne serait "''"
:
var newString = arr.length === 0 ? "" : "'" + arr.join("','") + "'";
// default for empty array here ---^^
(Il pourrait être plus approprié d'avoir un if (arr.length===0)
pour effectuer une autre action plutôt que d'exécuter l'instruction SELECT.)
Utilisez Array.map
pour encapsuler chaque élément avec des guillemets:
items.map(function(item) { return "'" + item + "'" }).join(',');
Le code devient plus simple avec les fonctionnalités ES6 - fonctions fléchées et chaînes de modèle (implémentées dans node.js 4.0 et versions supérieures):
items.map(i => `'${i}'`).join(',');
Vous pouvez également utiliser la liste blanche pour empêcher les injections SQL:
const validItems = new Set(['item1', 'item2', 'item3', 'item4']);
items
.filter(i => validItems.has(i))
.map(i => `'${i}'`)
.join(',')
La solution simple consiste à ajouter les citations vous-même
for(var i=0; i<items.length; i++){
items[i] = "'" + items[i] + "'";
}
var list_with_quotes = items.join(",");
Notez que j'ignore complètement les problèmes d'injection SQL ici.
let keys = ['key1','key2']
let keyWithQoutes = keys.map((it) => {return `'${it}'`})
let sql = `SELECT .... FROM ... WHERE id IN (${keyWithQoutes})`
console.log(sql)
Sortie: "SELECT .... FROM ... WHERE id IN ('key1', 'key2')"
Stockez les devis:
var names = ["'item1'","'item1'","'item3'"];
alert('IN (' + names[1] + ')'); // IN ('item1')
Questions connexes
De nouvelles questions
javascript
Pour des questions concernant la programmation dans ECMAScript (JavaScript / JS) et ses divers dialectes / implémentations (hors ActionScript). Veuillez inclure toutes les balises pertinentes dans votre question; par exemple, [node.js], [jquery], [json], etc.