2014-05-08 2 views
5

Im new to php. Я пытаюсь читать текстовый файл и вставлять данные из строки в базу данных. Моя проблема заключается в том, что некоторые специальные запросы на ввод символов не работают
Например, Côte, d.ä., d.y., DAB-sändare все они работают. Но can not insert d'affaires. Если я удалю d'affaires, тогда запрос будет выполнен, иначе он не будет вставлять данные в базу данных. Код PHP я использовал для REAF и вставки в базу данных является

Специальные символы не могут быть вставлены в базу данных

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

попробовать mysql_real_escape_string() –

+1

[Почему я не должен использовать функции mysql_ * в PHP?] (http://stackoverflow.com/questions/12859942/why-shouldnt-i-use-mysql-functions-in-php) – Phil

+0

После прочтения ваше обновление: что такое кодировка и сопоставление ваших Таблица? – Sal00m

ответ

4

Try 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); 
+0

если ваша проблема решена, пожалуйста, не забудьте принять этот вопрос как ответ :) –

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

    } 
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); 
    } 
} 
+0

+1 для примера с использованием mysqli вместо устаревших mysql_ * функций – Sal00m

1

После прочтения вашего обновления, я думаю, что проблема с подборкой и кодировкой вашей таблицы, выполнить это:

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

жаль, что не работает – Salini

Смежные вопросы