Cita: He probado con el tipo de campo: text, char y varchar y en los tres me da este mismo error
Estás perdiendo la perspectiva. El problema no es con el tipo de dato o la base de datos, porque tu mismo has dicho:
Cita: En cambio si abro la bd por ejemplo con el Navicat y introduzco directamente: "rebajas de hasta el 50%" la tabla no se queja.
Eso te debería dar la pauta que no es el tipo de campo, sino la forma en que ese valor le está llegando al MYSQL.
Y ya te han dicho:
Cita: échale un ojo a addslashes()
Si te fijas
en el manual de PHP, encontrarás esta explicación:
Cita: Devuelve una cadena con barras invertidas delante de los carácteres que necesitan escaparse en situaciones como consultas de bases de datos, etc. Los carácteres que se escapan son la comilla simple ('), comilla doble ("), barra invertida (\) y NUL (el byte NULL).
Un ejemplo de uso de la función addslashes() es cuando se introduce información en una base de datos. Por ejemplo, para insertar el nombre O'reilly en una base de datos, debe escaparse previamente. Es muy recomendado usar la función de escape de la misma Bade de Datos (DBMS) (por ejemplo mysqli_real_escape_string() para MySQL o pg_escape_string() para PostgreSQL), pero si la Base de Datos (DBMS) que se está usando no tiene una función de escape y usa la barra invertida \ para escapar caracteres especiales, puede utilizar esta función. Esto sólo será para obtener los datos en la base de datos, La barra invertida \ extra no será insertada. Si la directiva PHP magic_quotes_sybase tiene el valor on entonces las comillas simples de tipo 'se escapan añadiendo otra comilla simple adelante. '.
¿Te queda claro? Tu problema no es con MySQL, sino que no estás manejando correctamente la creación del valor para poder usarlo en una sentencia SQL.
Cuando no escapas el apóstrofe, este genera errores de interpretación de texto, porque en MySQL se usa para encerrar cadenas de texto, por esto, al usarlo dentro de un valor de cadena hace que se generen interrupciones de la misma, quedando el resto de la cadena comp arte de las cláusulas y generando un error sintáctico.
Por otro lado, el "%" es un caracter usado por MySQL como comodín en consultas de cadenas de texto, por lo que puede dar lugar a errores.
El hecho de que cuando creas la sentencia en el Navicat no te cause errores (y esto creo que no lo has razonado), es porque el Navicat tiene su propia forma de preparar la sentencia antes de enviarla al MySQL, donde gestiona este tipo de cosas y prepara la sentencia de modo tal que sea correctamente interpretada.
Lo que tienes que hacer tu es precisamente crear ese tipo de rutinas que Navicat ya tiene incorporadas.
Navicat, para que quede claro, no se conecta directamente al MySQL. Lo hace a través de una librería. No usa el MySQL, sino que se conecta a él. MySQL, como cualquier DBMS, es una caja cerrada que recibe y entrega datos, pero no permite a ningún programa acceder a su funcionamiento interno.