php - simples - mysql guardar comilla simple
Escapar una comilla simple en PHP al insertar en MySQL (8)
Debería estar escapando cada una de estas cadenas (en ambos fragmentos) con mysql_real_escape_string()
.
http://us3.php.net/mysql-real-escape-string
La razón por la que tus dos consultas se comportan de manera diferente es probable porque tienes magic_quotes_gpc
activado (que debes saber que es una mala idea). Esto significa que las cadenas recopiladas de $ _GET, $ _POST y $ _COOKIES se escaparon para usted (es decir, "O''Brien" -> "O/'Brien"
).
Una vez que almacena los datos y luego los recupera, la cadena que obtiene de la base de datos no se escapará automáticamente. Recibirás "O''Brien"
. Por lo tanto, deberá pasarlo a través de mysql_real_escape_string()
.
Esta pregunta ya tiene una respuesta aquí:
- ¿Cómo puedo prevenir la inyección SQL en PHP? 28 respuestas
Tengo un problema desconcertante que parece que no puedo comprender ... Espero que alguien aquí pueda señalarme en la dirección correcta ...
Tengo dos declaraciones SQL: la primera ingresa información de un formulario en la base de datos. - el segundo toma datos de la base de datos ingresada anteriormente, envía un correo electrónico y luego registra los detalles de la transacción
¡El problema es que parece que una sola cotización está desencadenando un error de MySQL en la segunda entrada solamente! La primera instancia funciona sin problemas, pero la segunda instancia desencadena el mysql_error()
.
¿Los datos de un formulario se manejan de forma diferente a los datos capturados en un formulario?
Consulta # 1 - Esto funciona sin problemas (y sin escapar de la comilla simple)
$result = mysql_query("INSERT INTO job_log
(order_id, supplier_id, category_id, service_id, qty_ordered, customer_id, user_id, salesperson_ref, booking_ref, booking_name, address, suburb, postcode, state_id, region_id, email, phone, phone2, mobile, delivery_date, stock_taken, special_instructions, cost_price, cost_price_gst, sell_price, sell_price_gst, ext_sell_price, retail_customer, created, modified, log_status_id)
VALUES
(''$order_id'', ''$supplier_id'', ''$category_id'', ''{$value[''id'']}'', ''{$value[''qty'']}'', ''$customer_id'', ''$user_id'', ''$salesperson_ref'', ''$booking_ref'', ''$booking_name'', ''$address'', ''$suburb'', ''$postcode'', ''$state_id'', ''$region_id'', ''$email'', ''$phone'', ''$phone2'', ''$mobile'', STR_TO_DATE(''$delivery_date'', ''%d/%m/%Y''), ''$stock_taken'', ''$special_instructions'', ''$cost_price'', ''$cost_price_gst'', ''$sell_price'', ''$sell_price_gst'', ''$ext_sell_price'', ''$retail_customer'', ''".date(''Y-m-d H:i:s'', time())."'', ''".date(''Y-m-d H:i:s'', time())."'', ''1'')");
Pregunta n. ° 2: esto falla al ingresar un nombre con una comilla simple (es decir, O''Brien)
$query = mysql_query("INSERT INTO message_log
(order_id, timestamp, message_type, email_from, supplier_id, primary_contact, secondary_contact, subject, message_content, status)
VALUES
(''$order_id'', ''".date(''Y-m-d H:i:s'', time())."'', ''$email'', ''$from'', ''$row->supplier_id'', ''$row->primary_email'' ,''$row->secondary_email'', ''$subject'', ''$message_content'', ''1'')");
Deberías hacer algo como esto para ayudarte a depurar
$sql = "insert into blah blah....";
echo $sql;
Probablemente encontrará que la comilla simple se escapó con una barra invertida en la consulta de trabajo. Esto podría haber sido hecho automáticamente por php a través de la configuración magic_quotes_gpc, o tal vez lo hiciste tú mismo en alguna otra parte del código (las pestañas y las barras pueden ser funciones para buscar).
Para cualquiera que encuentre esta solución en 2015 y siga adelante ...
La función mysql_real_escape_string()
está en desuso a partir de PHP 5.5.0.
Ver: http://us3.php.net/mysql-real-escape-string
Advertencia
Esta extensión está en desuso a partir de PHP 5.5.0 y se eliminará en el futuro. En su lugar, se debe usar la extensión MySQLi o PDO_MySQL. Consulte también MySQL: elegir una guía de API y preguntas frecuentes relacionadas para obtener más información. Las alternativas a esta función incluyen:
mysqli_real_escape_string()
PDO::quote()
Puede hacer lo siguiente que escapa tanto a PHP como a MySQL.
<?
$text = ''<a href="javascript:window.open(///'http://www.google.com///');"></a>'';
?>
Esto reflejará a MySQL como
<a href="javascript:window.open(''http://www.google.com'');"></a>
¿Como funciona?
Sabemos que tanto los apóstrofes PHP como MySQL se pueden escapar con una barra invertida y luego apostrofar.
/'
Debido a que estamos usando PHP para insertar en MySQL, necesitamos PHP para escribir la barra invertida en MySQL para que también pueda escapar. Por lo tanto, usamos el carácter de escape PHP de backslash-backslash junto con backslash-apostrophe para lograr esto.
///'
Simplemente debe pasar la variable O datos dentro de "mysql_real_escape_string (trim ($ val))"
donde $ val = los datos que le preocupan.
Tienes un par de cosas peleando en tus cadenas.
- falta de citas correctas de MySQL (
mysql_real_escape_string()
) - posible ''cita mágica'' automática: compruebe su configuración de gpc_magic_quotes
- variables de cadena incrustadas, lo que significa que debe saber cómo PHP encuentra las variables correctamente
También es posible que el valor de una sola cotización no esté presente en los parámetros de la primera consulta. Su ejemplo es un nombre propio, después de todo, y solo la segunda consulta parece tratar con nombres.
Tuve el mismo problema y lo resolví así:
$text=str_replace("''","/'",$YourContent);
Probablemente haya una mejor manera de hacerlo, pero funcionó para mí y debería funcionar para usted también.