Estoy haciendo un programa donde el usuario ingresará datos en entradas en un sitio web. Esta información se retransmitirá al servidor mediante socket.io y se almacenará en una base de datos. Estoy usando esta biblioteca para acceder a MySQL desde Node.js. Por lo general, cuando el usuario ingresa los datos, está bien. Pero cuando los datos incluyen comillas simples, las cosas no funcionan. Aquí hay un ejemplo:
let data = "LET'S GO"; // this is the data that the user inputs // if it has single quotations in it, the code doesn't work // otherwise it does connection.getConnection(function(error, conn) { if (error) throw error; // if there's an error while connecting, throw it conn.query( `INSERT INTO table_name (column) VALUES ('${data}')`, // make query with this MySQL call function(err, result) { conn.release(); if (err) throw err; // if there's an error with the call, throw it. Usually where my error comes } ) }) Como se comentó en el código anterior, si la variable data tiene comillas simples, MySQL devolverá un error como el siguiente:
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 's go.' at line 1 Después de encontrarme inicialmente con este error, he estado buscando una solución. En esta página , dice usar mysql.escape() , connection.escape() o pool.escape() para eliminar este problema. He buscado en todas las soluciones de Stack Overflow, pero todas parecen apuntar a esto. El problema con esta solución es que los data se ingresan en la consulta de MySQL con dos comillas simples a su alrededor. Por lo tanto, la consulta se parece un poco a esto:
INSERT INTO table_name (column) VALUES (''DATA_HERE'')En vez de:
INSERT INTO table_name (column) VALUES ('DATA_HERE') Además, he analizado problemas similares con mysql.escape() , connection.escape() y pool.escape() , pero no han sido de ayuda porque la mayoría de ellos no tienen soluciones directas.
¿Hay alguna OTRA forma de escapar de estas comillas simples (apóstrafes), si aparecieran en los data que ingresa el usuario?
Gracias de antemano. Cualquier y toda ayuda es apreciada.
Bien, parece que encontré una respuesta. Mi query debe formatearse de manera similar a las prepared statements (gracias a @danblack por esto). Debe hacerse como tal:
conn.query( `INSERT INTO table_name (column) VALUES (?)`, [data], function(err, result) { conn.release(); if (err) throw err; } ) Reemplacé '${data}' con ? y, en el siguiente argumento de la función conn.query() , di el valor que ? debe ser reemplazado por.
Si hay más de un valor de datos que debe "escaparse" de manera similar, haría lo siguiente:
conn.query( `INSERT INTO table_name (column1, column2, column3) VALUES (?, ?, ?)`, [data1, data2, data3], function(err, result) { conn.release(); if (err) throw err; } )Si alguien más tiene una pregunta pendiente similar, espero que esto responda.
Nota: esta forma de "escapar" no solo funciona con declaraciones INSERT . Creo que se puede usar para todas las demás consultas.