2014-05-08 11 views
5

Jestem nowy w php. Próbuję odczytać plik tekstowy i wstawić dane linii po linii do bazy danych. Mój problem polega na tym, że niektóre zapytania do wstawiania znaków specjalnych nie działają
Na przykład Côte, d.ä., d.y., DAB-sändare wszystkie te działają. Ale nie można wstawić d'affaires. Jeśli usuniemy d'affaires, zapytanie zostanie wykonane, w przeciwnym razie nie wstawi żadnych danych do bazy danych. Kod php Kiedyś reaf i wstawić do bazy danych jest

Znaki specjalne nie mogą być wstawiane do bazy danych

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

AKTUALIZACJA
Użyłem tego kodu podczas tworzenia wtyczki w wordpress następnie znaki specjalne wstawiasz jako „?”. W poprzednim kodzie został plik działa zmiana kodu i zrobić to

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

spróbować mysql_real_escape_string() –

+1

[Dlaczego nie powinienem używać funkcji mysql_ * w PHP?] (http://stackoverflow.com/questions/12859942/why-shouldnt-i-use-mysql-functions-in-php) – Phil

+0

Po przeczytaniu twoja aktualizacja: Jaki jest zestaw znaków i twój zestaw stół? – Sal00m

Odpowiedz

4

Spróbuj 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

jeśli twój problem został rozwiązany, proszę nie zapomnij przyjąć tego pytania jako odpowiedzi :) –

3

Najlepszym rozwiązaniem byłoby, aby uaktualnić mysql_* do PDO lub mysqli_*, ponieważ pozwalają one na uruchomienie przygotowanych zapytań z parametrami. Ale jeśli nie można tego zrobić, trzeba uciec dane:

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

Po pierwsze, nie należy używać mysql rozszerzenie. Został oficjalnie uznany za przestarzały.

Po drugie, użyj przygotowanej instrukcji z parametrami, aby uniknąć problemów z iniekcją SQL.

Po trzecie, upewnij się, że używasz kompatybilnego połączenia, kodowania tabeli/kolumny/zestawu znaków.

Na przykład, używając 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 dla przykładu używając mysqli zamiast przestarzałych funkcji mysql_ * – Sal00m

1

Po przeczytaniu aktualizację, myślę, że problem jest z zestawianie i charset swojego stołu, wykonać to:

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

Niestety nie działa – Salini