No se pueden insertar caracteres especiales en la base de datos.

4 minutos de lectura

avatar de usuario
salini l

Soy nuevo en php. Estoy tratando de leer un archivo de texto e insertar datos línea por línea en la base de datos. Mi problema es que algunas consultas de inserción de caracteres especiales no funcionan
Por ejemplo Côte , d.ä. , d.y. , DAB-sändare todos estos están funcionando. pero no puedo insertar d'affaires. si elimino d'affaires entonces la consulta se ejecutará; de lo contrario, no insertará ningún dato en la base de datos. El código php que usé para extraer e insertar en la base de datos es

mysql_connect("localhost","root","");
    mysql_select_db("testdb");
    $query="INSERT INTO keywords (id, keyword) VALUES ";
    $handle = fopen("Ordlista.txt", "r");
    if ($handle) {
        $i=1;
        while (($line = fgets($handle)) !== false) {
            // process the line read.
           // echo $line.'<br>';

            if($i==1)
            {
            $query.=" ( NULL , '".$line."') ";
            $i++;
            }
            else {
                $query.=" ,( NULL , '".$line."') ";
            }

        }
        $query.=";";
     //   $qr=htmlspecialchars($query,ENT_QUOTES);
        echo $query;
        mysql_query($query);
    } else {
        echo 'error opening the file.';
        // error opening the file.
    } 
    fclose($handle);

ACTUALIZADO

He usado este código al crear un complemento en wordpress, luego los caracteres especiales se insertan como ‘?‘. En el código anterior, era un archivo de trabajo, el cambio de código que hice es

mysql_query("TRUNCATE TABLE $table");
//    $structure = "INSERT INTO $table (`id`, `keyword`) VALUES (NULL, 'test1'), (NULL, 'test2');"; // Keywords for Testing
//    $wpdb->query($structure);
   //read text file & insert to database start
   $query="INSERT INTO $table (id, keyword) VALUES ";
   $fllocation=PLG_URL.'/Ordlista.txt';
    $handle = fopen($fllocation, "r");
    if ($handle) {
        $i=1;
        while (($line = fgets($handle)) !== false) {
            // process the line read.
            if($i==1)
            {
            $query.=" ( NULL , '".mysql_real_escape_string($line)."') ";
            $i++;
            }
            else {
                $query.=" ,( NULL , '".mysql_real_escape_string($line)."') ";
            }
        }
        $query.=";";
        $wpdb->query($query);
       // echo $query;
       // mysql_query($query);
    } else {
        echo 'error opening the file.';
        // error opening the file.
    } 
    fclose($handle);

  • prueba mysql_real_escape_string()

    – Rakesh Sharma

    8 de mayo de 2014 a las 6:31

  • ¿Por qué no debería usar funciones mysql_* en PHP?

    – Phil

    8 de mayo de 2014 a las 6:31

  • Después de leer su actualización: ¿Cuál es el conjunto de caracteres y la clasificación de su tabla?

    – Sal00m

    8 de mayo de 2014 a las 7:04


  • @Sal00m Probé esto $wpdb->set_charset(‘utf8’); antes de insertar pero no funciona..

    – Salini L.

    8 de mayo de 2014 a las 7:10

  • La solución para el problema actualizado es $query.=” ( NULL , ‘”.mysql_real_escape_string(utf8_encode($line)).”‘) “;

    – Salini L.

    8 de mayo de 2014 a las 9:13

Pruebe mysql_real_escape_string();

mysql_connect("localhost","root","");
    mysql_select_db("testdb");
    $query="INSERT INTO keywords (id, keyword) VALUES ";
    $handle = fopen("Ordlista.txt", "r");
    if ($handle) {
        $i=1;
        while (($line = fgets($handle)) !== false) {
            // process the line read.
           // echo $line.'<br>';

            if($i==1)
            {
            $query.=" ( NULL , '".mysql_real_escape_string($line)."') ";
            $i++;
            }
            else {
                $query.=" ,( NULL , '".mysql_real_escape_string($line)."') ";
            }

        }
        $query.=";";
     //   $qr=htmlspecialchars($query,ENT_QUOTES);
        echo $query;
        mysql_query($query);
    } else {
        echo 'error opening the file.';
        // error opening the file.
    } 
    fclose($handle);

  • Si su problema se resuelve, no olvide aceptar esta pregunta como respuesta 🙂

    -Mohit Bumb

    8 de mayo de 2014 a las 6:41

La mejor solución sería actualizar desde mysql_* a DOP o mysqli_*, ya que te permiten ejecutar consultas preparadas con parámetros. Pero si no puede hacer eso, debe escapar de los datos:

    while (($line = fgets($handle)) !== false) {
        // process the line read.
       // echo $line.'<br>';
        $line = mysql_real_escape_string($line);

        if($i==1)
        {
        $query.=" ( NULL , '".$line."') ";
        $i++;
        }
        else {
            $query.=" ,( NULL , '".$line."') ";
        }

    }

Primero, no use el mysql extensión. Ha sido oficialmente desaprobado.

En segundo lugar, use una declaración preparada con parámetros para evitar problemas con la inyección de SQL.

En tercer lugar, asegúrese de estar utilizando una conexión compatible, codificación de tabla y columna/juego de caracteres.

Por ejemplo, usando mysqli

$con = new mysqli('localhost', 'root', '', 'testdb');
if ($con->connect_errno) {
    throw new Exception($con->connect_error, $con->connect_errno);
}
$con->set_charset('utf8');

$stmt = $con->prepare('INSERT INTO `keywords` (`keyword`) VALUES (?)');
if (!$stmt) {
    throw new Exception($con->error, $con->errno);
}
$stmt->bind_param('s', $keyword);

foreach (file('Ordlista.txt') as $keyword) {
    if (!$stmt->execute()) {
        throw new Exception($stmt->error, $stmt->errno);
    }
}

  • +1 para el ejemplo usando mysqli en lugar de las funciones obsoletas de mysql_*

    – Sal00m

    8 de mayo de 2014 a las 7:03

Después de leer su actualización, creo que el problema está en la intercalación y el conjunto de caracteres de su tabla, ejecute esto:

ALTER TABLE `keywords` CHARACTER SET = utf8 , COLLATE = utf8_unicode_ci ;

¿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