cara menangani tapisan tidak bekerja pada halaman pencarian slims

error code: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ‘:yearfrom and :yearuntil) and sb.items is not null and sb.biblio_id not in(se…’ at line 1

Solusi :

Buka file /slimsroot/lib/SearchEngine/SearchBiblioEngine.php

error ini muncul karena bagian SQL berikut masih terbaca mentah oleh MariaDB:

sb.publish_year between :yearfrom and :yearuntil

Padahal :yearfrom dan :yearuntil seharusnya diganti oleh nilai hasil binding. Artinya, pada bagian filter tahun, parameter binding tidak terbaca/ tidak diproses dengan benar oleh query engine yang sedang dipakai. Titik sumbernya ada pada bagian case ‘years’

bagian bermasalah

case 'years':
    list($from, $to) = explode(';', $query);
    $this->execute[':yearfrom'] = [$from, \PDO::PARAM_INT];
    $this->execute[':yearuntil'] = [$to, \PDO::PARAM_INT];
    $sql_criteria .= " (sb.publish_year between :yearfrom and :yearuntil) ";
    break;

erbaikan paling aman dan cepat

Karena nilai tahun adalah angka, lebih aman di-cast menjadi integer lalu dimasukkan langsung ke SQL. Ini menghindari masalah placeholder :yearfrom dan :yearuntil.

Ganti bagian case 'years' menjadi:

case 'years':
    $years = explode(';', $query);

    $from = isset($years[0]) ? (int) trim($years[0]) : 0;
    $to   = isset($years[1]) ? (int) trim($years[1]) : 0;

    if ($from > 0 && $to > 0) {
        if ($from > $to) {
            [$from, $to] = [$to, $from];
        }

        $sql_criteria .= " (CAST(sb.publish_year AS UNSIGNED) BETWEEN {$from} AND {$to}) ";
    }
    break;