Cómo lidiar con un apóstrofo al escribir en una base de datos MySQL [duplicate]
⏰ 7 minutos de lectura
Estoy recibiendo este error:
Tiene un error en su sintaxis SQL; consulte el manual que corresponde a la versión de su servidor MySQL para conocer la sintaxis correcta para usar cerca de ‘s’,’portal’,”,’offering’,’MSNBC’,’News’,”,’sports’,”, ‘MSN’, ‘Dinero’,”, ‘juegos’ en la línea 3
El único problema es que este error aparece al insertar datos que contienen un apóstrofe. Intenté cambiar el tipo de datos de VARCHAR a TEXTpero el resultado sigue siendo el mismo.
Traté de poner addslashes()
¿Cómo puedo solucionar esto?
$query=" INSERT INTO alltags
(id,tag1,tag2,tag3,tag4,tag5,tag6,tag7,tag8,tag9,tag10,tag11,tag12,tag13,tag14,tag15,tag16,tag17,tag18,tag19,tag20,tag21,tag22,tag23,tag24,tag25,tag26,tag27,tag28,tag29,tag30)
VALUES
('',mysql_real_escape_string($uniqkey[0]),mysql_real_escape_string($uniqkey[1]),mysql_real_escape_string($uniqkey[2]),mysql_real_escape_string($uniqkey[3]),mysql_real_escape_string($uniqkey[4]),mysql_real_escape_string($uniqkey[5]),mysql_real_escape_string($uniqkey[6]),mysql_real_escape_string($uniqkey[7]),mysql_real_escape_string($uniqkey[8]),mysql_real_escape_string($uniqkey[9]),mysql_real_escape_string($uniqkey[10]),mysql_real_escape_string($uniqkey[11]),mysql_real_escape_string($uniqkey[12]),mysql_real_escape_string($uniqkey[13]),mysql_real_escape_string($uniqkey[14]),mysql_real_escape_string($uniqkey[15]),mysql_real_escape_string($uniqkey[16]),mysql_real_escape_string($uniqkey[17]),mysql_real_escape_string($uniqkey[18]),mysql_real_escape_string($uniqkey[19]),mysql_real_escape_string($uniqkey[20]),mysql_real_escape_string($uniqkey[21]),mysql_real_escape_string($uniqkey[22]),mysql_real_escape_string($uniqkey[23]),mysql_real_escape_string($uniqkey[24]),mysql_real_escape_string($uniqkey[25]),mysql_real_escape_string($uniqkey[26]),mysql_real_escape_string($uniqkey[27]),mysql_real_escape_string($uniqkey[28]),mysql_real_escape_string($uniqkey[29])) ";
mysql_query($query) or die(mysql_error());
lo cambié a mysql_real_escape_string. ¿Es correcta esta sintaxis? Estoy recibiendo errores.
id es un auto_incremento, así que lo dejé en blanco
– usuario244333
30 de octubre de 2010 a las 2:48
Use PDO… resolverá dos problemas a la vez. php.net/pdo
– benjy
30 de octubre de 2010 a las 4:22
usuario229044
El proceso de codificación de datos que contienen caracteres que MySQL podría interpretar se denomina “escape”. Debes escapar de tus cuerdas con mysql_real_escape_string, que es una función PHP, no una función MySQL, lo que significa que debe ejecutarla en PHP antes de pasar su consulta a la base de datos. Tú deber escapar cualquier dato que entre en su programa desde una fuente externa. Cualquier dato que no se escape es un potencial inyección SQL.
Tienes que escapar tus datos antes de usted construye su consulta. Además, puede crear su consulta mediante programación utilizando las construcciones de bucle de PHP y range:
// Build tag fields
$tags="tag" . implode(', tag', range(1,30));
// Escape each value in the uniqkey array
$values = array_map('mysql_real_escape_string', $uniqkey);
// Implode values with quotes and commas
$values = "'" . implode("', '", $values) . "'";
$query = "INSERT INTO alltags (id, $tags) VALUES ('', $values)";
mysql_query($query) or die(mysql_error());
Conceptualmente, esto tiene mucho sentido. Todavía estoy tratando de incorporar tu código en el mío. Gracias por tu contribución
– usuario244333
30 de octubre de 2010 a las 3:26
@Karthik Lo importante es que te des cuenta de eso mysql_real_escape_string se ejecuta en PHP, antes de pasar sus datos a mysql_query. No estoy seguro de cómo OMG Ponies se equivocó tanto…
Usando mysql_real_escape_cadena es un enfoque más seguro para manejar caracteres para la inserción/actualización de SQL:
INSERT INTO YOUR_TABLE
VALUES
(mysql_real_escape_string($var1),
mysql_real_escape_string($var2))
Además, volvería a cambiar sus columnas de TEXTO a VARCHAR: la búsqueda, además de la indexación, funciona mucho mejor.
Actualización para su actualización
Siendo eso id es una columna de auto_incremento que puede:
déjelo fuera de la lista de columnas, para que no tenga que proporcionar un valor en la cláusula VALUES:
INSERT INTO alltags
(tag1,tag2,tag3,tag4,tag5,tag6,tag7,tag8,tag9,tag10,tag11,tag12,tag13,tag14,tag15,tag16,tag17,tag18,tag19,tag20,tag21,tag22,tag23,tag24,tag25,tag26,tag27,tag28,tag29,tag30)
VALUES
(mysql_real_escape_string($uniqkey[0]),mysql_real_escape_string($uniqkey[1]),mysql_real_escape_string($uniqkey[2]),mysql_real_escape_string($uniqkey[3]),mysql_real_escape_string($uniqkey[4]),mysql_real_escape_string($uniqkey[5]),mysql_real_escape_string($uniqkey[6]),mysql_real_escape_string($uniqkey[7]),mysql_real_escape_string($uniqkey[8]),mysql_real_escape_string($uniqkey[9]),mysql_real_escape_string($uniqkey[10]),mysql_real_escape_string($uniqkey[11]),mysql_real_escape_string($uniqkey[12]),mysql_real_escape_string($uniqkey[13]),mysql_real_escape_string($uniqkey[14]),mysql_real_escape_string($uniqkey[15]),mysql_real_escape_string($uniqkey[16]),mysql_real_escape_string($uniqkey[17]),mysql_real_escape_string($uniqkey[18]),mysql_real_escape_string($uniqkey[19]),mysql_real_escape_string($uniqkey[20]),mysql_real_escape_string($uniqkey[21]),mysql_real_escape_string($uniqkey[22]),mysql_real_escape_string($uniqkey[23]),mysql_real_escape_string($uniqkey[24]),mysql_real_escape_string($uniqkey[25]),mysql_real_escape_string($uniqkey[26]),mysql_real_escape_string($uniqkey[27]),mysql_real_escape_string($uniqkey[28]),mysql_real_escape_string($uniqkey[29])) ";
incluir id en la lista de columnas, lo que requiere que use cualquier valor en su lugar en la cláusula VALUES:
NULL
DEFAULT
Aquí hay un ejemplo que usa NULL como marcador de posición de identificación:
INSERT INTO alltags
(id,tag1,tag2,tag3,tag4,tag5,tag6,tag7,tag8,tag9,tag10,tag11,tag12,tag13,tag14,tag15,tag16,tag17,tag18,tag19,tag20,tag21,tag22,tag23,tag24,tag25,tag26,tag27,tag28,tag29,tag30)
VALUES
(NULL,mysql_real_escape_string($uniqkey[0]),mysql_real_escape_string($uniqkey[1]),mysql_real_escape_string($uniqkey[2]),mysql_real_escape_string($uniqkey[3]),mysql_real_escape_string($uniqkey[4]),mysql_real_escape_string($uniqkey[5]),mysql_real_escape_string($uniqkey[6]),mysql_real_escape_string($uniqkey[7]),mysql_real_escape_string($uniqkey[8]),mysql_real_escape_string($uniqkey[9]),mysql_real_escape_string($uniqkey[10]),mysql_real_escape_string($uniqkey[11]),mysql_real_escape_string($uniqkey[12]),mysql_real_escape_string($uniqkey[13]),mysql_real_escape_string($uniqkey[14]),mysql_real_escape_string($uniqkey[15]),mysql_real_escape_string($uniqkey[16]),mysql_real_escape_string($uniqkey[17]),mysql_real_escape_string($uniqkey[18]),mysql_real_escape_string($uniqkey[19]),mysql_real_escape_string($uniqkey[20]),mysql_real_escape_string($uniqkey[21]),mysql_real_escape_string($uniqkey[22]),mysql_real_escape_string($uniqkey[23]),mysql_real_escape_string($uniqkey[24]),mysql_real_escape_string($uniqkey[25]),mysql_real_escape_string($uniqkey[26]),mysql_real_escape_string($uniqkey[27]),mysql_real_escape_string($uniqkey[28]),mysql_real_escape_string($uniqkey[29])) ";
Yo quiero De Verdad recalque que no debe configurar sus columnas de esa manera.
Edité mi pregunta. ¿Hay algún problema con mi sintaxis?
– usuario244333
30 de octubre de 2010 a las 2:45
@Ponies: este código es realmente incorrecto. Investigaré quién te dio cuatro votos a favor y los mataré también. No puede mezclar llamadas a funciones PHP en una cadena SQL. Debe salir de la “cadena” y llamar a .mysql_real_escape(). por separado para cada variable.
– mario
30 de octubre de 2010 a las 3:26
@Ponies Por favor arregla esto. ¡Está mal en tantos niveles!
Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos.
Configurar y más información
id es un auto_incremento, así que lo dejé en blanco
– usuario244333
30 de octubre de 2010 a las 2:48
Use PDO… resolverá dos problemas a la vez. php.net/pdo
– benjy
30 de octubre de 2010 a las 4:22