mysql_real_escape_string está siendo ignorado

Realmente agradecería cualquier ayuda que pueda obtener con esto.

Tengo problemas reales con un formulario y parece que no puedo hacer que mysql_real_escape_string funcione en absoluto.

Estoy usando MySQL 5.5 con PHP y para probarlo, he creado un formulario simple que Magic Quotes no está activado en absoluto.

Usando este formulario:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>
<form name="event_ad" action="test.php" method="post">
    <table>
    <tr>
        <td>Event Name:</td>
        <td><input name="event_name" type="text" size="90" /></td>
    </tr>
    <tr>
        <td>Start Date:</td>
        <td><input name="start_date" type="text" size="90" /></td>
    </tr>
    <tr>
        <td colspan="2" align="center"><input name="Submit" type="submit" id="Submit" value="Add New Event" /></td>
    </tr>
    </table>
</form>
</body>
</html>

Luego, los datos se ingresan en la tabla usando test.php

<?php
    mysql_connect("localhost","username","password") or die(mysql_error());
    mysql_select_db("databasename") or die(mysql_error());

    $name = $_POST['event_name'];
    $sdate = $_POST['start_date'];
    $name = mysql_real_escape_string($name);

    $sql = "INSERT INTO tblevents (event_name, event_date) VALUES ('" . $name . "','" . $sdate . "')";

    mysql_query($sql);

    echo "success";
?>

(los detalles de la conexión cambiaron)

Cuando ingreso el nombre del evento O'Rielly "Smith", se inserta en la tabla MySQL como O'Rielly "Smith"

No hay barras invertidas, no hay escapatoria en absoluto.

Realmente he buscado en Internet tratando de resolver esto, pero parece que funciona para todos los demás.

¿Estoy malinterpretando algo fundamental aquí? Agradecería mucho si alguien pudiera guiarme en la dirección correcta.

Esta es mi primera publicación en este foro, y el html y el formato del código no parecen ser los mismos que en la mayoría de los foros que he visitado, y no se puede obtener una vista previa, así que espero que todo salga bien.

Gracias de antemano a cualquiera que ofrezca ayuda. Saludos Al.

preguntado el 03 de mayo de 12 a las 15:05

Olvídese de mysql_real_escape_string. Use mysqli o PDO y argumentos enlazados en su lugar. -

¿Cómo sabes que eso es lo que está haciendo? ¿Estás haciendo eco? $name? -

Lo siento, no responde a su pregunta, pero le recomiendo cambiar a algo similar a PDO. Las funciones de Mysql están en desuso a partir de la versión 5.4 de PHP. -

Además, si uso lo siguiente como nombre de evento: blah blah \n "" se inserta directamente en la tabla y puedo verlo exactamente como si usara phpMyAdmin para mirar la tabla. Pensé que ese era el tipo de cosas que se suponía que mysql_real_escape_string debía detener al agregarle barras diagonales. -

Por favor, aprende primero qué es escapar. Es mejor que sepas lo que usas para lo que es. -

5 Respuestas

Esto es por diseño, no debería ver ninguna entrada escapada en su tabla. Es solo para insertar. Mediante el uso mysql_real_escape_string, su consulta parece

INSERT INTO tblevents (event_name, event_date) VALUES ('O\'Rielly \"Smith\"','1.4.2001')";

donde estas barras invertidas se aseguran de no romper el apóstrofe

MySQL "elimina" todas las barras diagonales inversas hasta que se escapan con una barra invertida :)

contestado el 03 de mayo de 12 a las 15:05

+1. Los datos escapados son solo para el analizador de consultas. El objetivo es obtener datos reales en la tabla. - Brad

Gracias Martín. Esa es exactamente la información que había estado buscando, pero curiosamente, no pude encontrar eso en ninguna parte. Ahora entiendo mucho mejor cómo funciona esto. Salud. - Almeister9

Si te gusta más mi respuesta, acéptala marcándola a la izquierda. Gracias - Martin.

Cuando ingreso el nombre del evento O'Rielly "Smith", se inserta en la tabla MySQL como O'Rielly "Smith"

Eso es lo que se supone que debe suceder.

El escape hace que los datos pasen por la consulta para que los datos originales terminen en la base de datos. El propósito no es agregar caracteres adicionales a sus datos almacenados, es evitar que los caracteres con un significado especial rompan su SQL.

contestado el 03 de mayo de 12 a las 15:05

Piensa en escapar como el equivalente a envolver papel en un regalo de cumpleaños.

Escapa los datos para que cualquier carácter especial en los datos pierda su significado especial durante el proceso de transferencia. Una vez que están "dentro" del sistema de destino (página html, registro de la base de datos, etc...), ya no es necesario escapar, ya que el lugar donde podrían haber afectado el proceso ya no existe.

Lo mismo con el regalo envuelto: una vez que se recibe el regalo, ya no necesita el papel de regalo, por lo que se retira.

contestado el 03 de mayo de 12 a las 15:05

Ha funcionado bien.

La eliminación de la mysql_real_escape_string evitará que se inserten los datos.

contestado el 03 de mayo de 12 a las 15:05

Estoy empezando a entender ahora, pero desafortunadamente, si elimino mysql_real_escape_string, los datos aún se insertan en la tabla, sin importar qué tan afuera estén los datos. Por eso me estoy confundiendo. - Almeister9

$name = $_POST['event_name'];
$sdate = $_POST['start_date'];


$db = new mysqli("localhost", "username", "password", "databasename");

$query = "INSERT INTO tblevents (event_name, event_date) VALUES (?, ?)";
$statement = $db->prepare($query);
$statement->bind_param("ss", $name, $sdate);

$statement->execute();
$statement->close();

$db->close();

(He omitido la comprobación de errores para la conexión)

contestado el 03 de mayo de 12 a las 15:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.