特殊字符无法插入数据库

时间:2014-05-08 06:30:09

标签: php mysql wordpress text wordpress-plugin

我是php新手。我试图读取文本文件并逐行插入数据库。我的问题是一些特殊的字符插入查询不起作用 例如Côted.ä.d.y.DAB-sändare这些都在起作用。但是无法插入d'affaires。如果我删除d'affaires,则查询将执行,否则它将不会向数据库插入任何数据。用于reaf并插入数据库的php代码是

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);

更新
我在wordpress中创建插件时使用了此代码,然后特殊字符插入为“?”。在前面的代码中,工作文件是我做的代码更改是

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);

4 个答案:

答案 0 :(得分:4)

尝试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);

答案 1 :(得分:3)

最佳解决方案是从mysql_*升级到PDO或mysqli_*,因为这些允许您使用参数运行准备好的查询。但如果你不能这样做,你必须逃避数据:

    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."') ";
        }

    }

答案 2 :(得分:3)

首先,不要使用 mysql 扩展名。它已被正式弃用。

其次,使用带参数的预准备语句以避免SQL注入出现任何问题。

第三,确保您使用兼容的连接,表格和列编码/字符集。

例如,使用 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);
    }
}

答案 3 :(得分:1)

阅读完更新后,我认为问题出在桌面的整理和字符集上,执行此操作:

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