Поиск в базе данных с другой кодировкой

0

У меня есть сайт с небольшим поиском script, где я использую кодировку utf-8. Теперь в моей базе данных mysql я использую charset latin1_swedish_ci. Когда я хочу искать что-то, что имеет буквы å, ä или ö, оно не возвращает никаких результатов, потому что в базе данных буква å = à ¥, ä = ä и ö = ö.

Решение этой проблемы будет означать, что поиск script заменяет эти буквы теми, которые понимает база данных.

Поэтому, когда мои пользователи ищут что-то, у которого есть буква å, он должен преобразовать его в Ã ¥ и вернуть правильные результаты.

Любая идея, как достичь этого?

Заранее спасибо

EDIT:
Добавлен script, который я пытаюсь изменить, но не повезло.
Любая идея о том, как изменить его так, чтобы он "преобразовывал" кодировку:

<?php  


// file for database connection
include('inc/db.inc.php');

// configuration file
include('inc/config.inc.php');

if(isset($_GET['p'])) {
  $page_number = $_GET['p'];
  $arraySearch = $_GET['terms'];
  $show_count = $_GET['count'];
  settype($page_number, 'integer');
}
$nospaces = substr($_GET['terms'],0,4);
  $offset = ($page_number - 1) * $records_number;
// check for an empty string and display a message.
if ($_GET['terms'] == "") {
  echo  '<div id="counter">ex. write &acute;here and&acute; or &acute;search&acute; without quotes.</div>';
// minim 3 characters condition
  } else if(strlen($_GET['terms']) < $limitchar) {
 echo '<div id="counter">'. $limitchar .' characters minimum</div>';
// no spaces in first 4 letters
  } else if(preg_replace('/[a-zA-Z0-9]/', '', $nospaces))  {
 echo '<div id="counter">Please use letters or numbers in first 4 characters</div>';
  } else  {

// explode search words into an array
  $arraySearch = explode(" ", $_GET['terms']);
// table fields to search
  $arrayFields = array(0 => $first_field, 1 => $second_field);
  $countSearch = count($arraySearch);
  $a = 0;
  $b = 0;
  $query = "SELECT * FROM $table_name WHERE (";
  $countFields = count($arrayFields);
  while ($a < $countFields)
  {
    while ($b < $countSearch)
    {
      $query = $query."$arrayFields[$a] LIKE '%$arraySearch[$b]%'";
      $b++;
      if ($b < $countSearch)
      {
        $query = $query." AND ";
      }
    }
    $b = 0;
    $a++;
    if ($a < $countFields)
    {
      $query = $query.") OR (";
    }
  }
  $query = $query.") LIMIT $offset, $records_number;";
  $search = mysql_query($query);


// get number of search results
  $arrayFields = array(0 => $first_field, 1 => $second_field);
  $countSearch = count($arraySearch);
  $a = 0;
  $b = 0;
  $query = "SELECT * FROM $table_name WHERE (";
  $countFields = count($arrayFields);
  while ($a < $countFields)
  {
    while ($b < $countSearch)
    {
      $query = $query."$arrayFields[$a] LIKE '%$arraySearch[$b]%'";
      $b++;
      if ($b < $countSearch)
      {
        $query = $query." AND ";
      }
    }
    $b = 0;
    $a++;
    if ($a < $countFields)
    {
      $query = $query.") OR (";
    }
  }
  $query = $query.")";
  $count_results = mysql_query($query);
  $numrows = mysql_num_rows($count_results);

// no results
if($numrows == 0) {
        echo '<div id="counter">No results found</div>';

// show results
} else {

echo '<div id="results">
<div id="results_top"><p><b>'. $_GET['terms'] .'</b> - '. $numrows .' results found</p></div>
';

while($row = mysql_fetch_assoc($search)) {

$urltitle = str_replace(" ","_", $row['title']);

echo '<div class="item">
<div class="details"><a href="http://www.onlinegamez.net/'.$urltitle.'-'.$row['id'].'.html" style="float:left;"><img src="http://www.onlinegamez.net/files/image/'.$row['icon'].'" width="90" height="65" alt="'.$row['title'].'"/></a><a href="http://www.onlinegamez.net/'.$urltitle.'-'.$row['id'].'.html" class="title">'.$row['title'].'</a><br />
'.$row['description'].'</div>
<div class="played"><span>'.$row['timesplayed'].'</span>
<p>played</p></div>
<div style="clear:both;"></div></div>'; 
}
// pagination
  $maxPage = ceil($numrows/$records_number);

  $nav = '';
for($page = 1; $page <= $maxPage; $page++) {
  if ($page == $page_number)     {
     $nav .= "$page";
  }
  else
  {
      $nav .= "<a href=\"javascript:htmlData('search.php','terms=".$_GET['terms']."&amp;p=$page')\">$page</a>";
  }
}

if ($page_number > 1) {

  $page = $page_number - 1;
  $prev = "<a href=\"javascript:htmlData('search.php','terms=".$_GET['terms']."&amp;p=$page')\">&laquo;</a>";

  $first = "<a href=\"javascript:htmlData('search.php','terms=".$_GET['terms']."&amp;p=1')\">First</a>";
}
else {
  $prev = '';
  $first = '';
}

if ($page_number < $maxPage) {
  $page = $page_number + 1;
  $next = "<a href=\"javascript:htmlData('search.php','terms=".$_GET['terms']."&amp;p=$page')\">&raquo;</a>";

  $last = "<a href=\"javascript:htmlData('search.php','terms=".$_GET['terms']."&amp;p=$maxPage')\">Last</a>";
}
else {
  $next = '';
  $last = '';
}
  echo $data;
echo "<div id=\"results_bottom\"><p>$first $prev $nav $next $last</p></div>
</div>";
    }
 }
?>
  • 1
    latin1_swedish_ci - это не набор символов, а сопоставление. Посмотрите Наборы символов и Сопоставления в целом для получения дополнительной информации о различиях.
  • 0
    Гамбо, правильно. Но, AFAIK, вы не можете использовать сопоставление latin1_swedish_ci с кодировкой utf8? Это неявно говорит нам, что он использует latin1 в качестве charset, верно?
Теги:
character-encoding

1 ответ

2
Лучший ответ

Прежде всего - почему вы используете разные кодировки?

Существует несколько способов атаковать вас, вы можете изменить кодировку при подключении;

set names 'utf8';
set character set 'utf8' collate 'utf8_swedish_ci';

Вы можете выполнить сопоставление на основе сопоставления;

select
    `field`
from
    `table`
where
    cast(`field` as char character set 'utf8') collate 'utf8_swedish_ci' = '$PHP_VARIABLE'

Или вы можете изменить charset на переменной в PHP;

$var_in_iso88591 = utf8_decode($var_in_utf8);

Посмотрите utf8_encode()/utf8_decode() и iconv()

  • 0
    Да, я знаю, это будет временное решение на данный момент. Спасибо большое за вашу помощь.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню