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


avatar de usuario
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…

    – usuario229044

    30 de octubre de 2010 a las 3:41

avatar de usuario
Dios mío ponis

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!

    – sakibmoon

    19/10/2014 a las 21:02

avatar de usuario
kijin

Ligera mejora de la respuesta de meagar:

EDITAR: meagar actualizó su publicación, por lo que su respuesta ahora es mejor.

$query = 'INSERT INTO alltags (id, ';

// append tag1, tag2, etc.
$query .= 'tag' . implode(', tag', range(1, 30)) . ") VALUES ('', ";

// escape each value in the uniqkey array
$escaped_tags = array_map('mysql_real_escape_string', $uniqkey);

// implode values with quotes and commas, and add closing bracket
$query .= "'" . implode("', '", $escaped_tags) . "')";

// actually query
mysql_query($query) or die(mysql_error());

  • +1 Me gusta la forma en que construyes la cadena de etiquetas; es tarde, y estoy cansado.

    – usuario229044

    30 de octubre de 2010 a las 3:54

Por favor, mire la respuesta de meagars. Este es el código correcto.

Si desea utilizar la función mysql_query() equivocada, debe dividir la cadena SQL de la siguiente manera:

mysql_query(
    "INSERT INTO whateever (col1,col2,col3,col4) VALUES ("
    . mysql_real_escape_string($col1) 
    . ","
    . mysql_real_escape_string($col2) 
    . ","       
    . mysql_real_escape_string($col3) 
    . ","
    . mysql_real_escape_string($col4) 
    . ")"
);

O como tiene una matriz, use la llamada de método inteligente para escapar todo a la vez:

$uniqkey = array_map("mysql_real_escape_string", $uniqkey);

mysql_query("USE THE ESCAPED ARRAY THEN DIRECTLY ('$uniqkey[0]', '$uniqkey[1]', '$uniqkey[2]', '$uniqkey[3]', ...");

¿Ha sido útil esta solución?

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
Privacidad