PHP PDO поиск с совпадением с умлаутс не работает - PullRequest
0 голосов
/ 29 июня 2019

Я хочу запросить записи с совпадением с формой MariaDB (InnoDB, utf8mb4_unicode_ci).

Он работает с поисковым термином без умляутов, а код SQL работает даже с умляутами в phpmyadmin. Если я использую умлаутс, я получаю пустой массив обратно.

// DB connection
$dboptions = array('charset=utf8mb4'); // with and without: no difference
$pdo = new PDO("mysql:host=$dbservername;dbname=$dbname", $dbusername, $dbpassword, $dboptions);

// Call
$pdo->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );
$statement = $pdo->prepare(
"   SELECT
        Date(a_timestamp) AS thedate,
        count(a_timestamp) AS counted,
        a_comb_f
    FROM `$dbtable`
    WHERE Year(a_timestamp) >= '$chartyear'
    AND MATCH (a_comb_f) AGAINST ('+Müller' IN BOOLEAN MODE)
    GROUP BY thedate
    ORDER BY thedate
");
$statement->execute();
$result = $statement->fetchAll();
var_dump($result);

Результат для Müller:

array(0) {} не работает!

Результат для Example:

это работает!

thedate    | counted | a_comb_f
2008-08-20 | 1       | Test Example Test

Чистый SQL прекрасно работает в phpmyadmin и т. Д.

SELECT
        Date(a_timestamp) AS thedate,
        count(a_timestamp) AS counted,
        a_comb_f
    FROM `dbs4`
    WHERE Year(a_timestamp) >= '$chartyear'
    AND MATCH (a_comb_f) AGAINST ('+Müller' IN BOOLEAN MODE)
    GROUP BY thedate
    ORDER BY thedate

Результат:

работает!

Фон:

InnoDB, utf8mb4_unicode_ci
a_comb_f   Index   varchar(1000)   utf8mb4_unicode_ci

Обновление 1

Indizes
Schlüsselname   Typ Unique  Gepackt Spalte  Kardinalität    Kollation   Null    Kommentar
a_comb_f    FULLTEXT    Nein    Nein    a_comb_f    141798      Nein

Запрошенный столбец имеет индекс FULLTEXT.

Update2

Я не нашел никакого решения, поэтому я попробовал mysqli вместо PDO, и он работает!

$conn = new mysqli($dbservername, $dbusername, $dbpassword, $dbname);
if ($conn->connect_error) {
    die("Connection Error " . $conn->connect_error);
}
if (!$conn->set_charset("utf8mb4")) {
    printf("Error loading utf8mb4: %s\n", $conn->error);
    exit();
}

$sql = 
"   SELECT
        Date(a_timestamp) AS thedate,
        count(a_timestamp) AS counted,
        a_comb_f
    FROM `$dbtable`
    WHERE Year(a_timestamp) >= '$chartyear'
    AND MATCH (a_comb_f) AGAINST ('+Müller' IN BOOLEAN MODE)
    GROUP BY thedate
    ORDER BY thedate
";
$result = mysqli_query($conn, $sql);
$result = mysqli_fetch_all($result, MYSQLI_ASSOC);

Кто-нибудь может сказать мне, почему он работает с MySQL, а не с PDO?


PS: я знаю, что код содержит уязвимости (инъекция sql). Это только для тестирования на localhost.

1 Ответ

0 голосов
/ 30 июня 2019

Если вы работаете с PDO, вам нужно установить кодировку в DNS (имя источника данных):

$pdo = new PDO("mysql:host=$dbservername;dbname=$dbname;charset=utf8mb4", $dbusername, $dbpassword, $dboptions);
                                                        ^^^^^^^^^^^^^^^

Удалить строку:

$dboptions = array('charset=utf8mb4');
...