Script Cautare dupa oricare cuvant din textul cautat

Discutii despre script-uri si coduri PHP-MySQL, precum si lucru cu XML in PHP.
Avatar utilizator
trif
Mesaje:500

Script Cautare dupa oricare cuvant din textul cautat

Buna ziua, am o mica problema si nu stiu cum sa o rezolv si am mare nevoie de a o rezolva.
Am un script:

Cod: Selectaţi tot

// Credentials
$dbhost = "localhost";
$dbname = "";
$dbuser = "";
$dbpass = "";

//    Connection
global $tutorial_db;

$tutorial_db = new mysqli();
$tutorial_db->connect($dbhost, $dbuser, $dbpass, $dbname);
$tutorial_db->set_charset("utf8");

//    Check Connection
if ($tutorial_db->connect_errno) {
    printf("Connect failed: %s\n", $tutorial_db->connect_error);
    exit();
}

/************************************************
    Search linkality
************************************************/

// Define Output HTML Formating
$html = '';
$html .= '<li class="result">';
$html .= '<a target="_blank" href="urlString">';
$html .= '<h3>nameString</h3>';
$html .= '<h4>linkString</h4>';
$html .= '<h3>pret</h3>';
//$html .= '<h3>moneda</h3>';
$html .= '</a>';
$html .= '</li>';

// Get Search
$search_string = preg_replace("/[^A-Za-z0-9]/", " ", $_POST['query']);
$search_string = $tutorial_db->real_escape_string($search_string);

// Check Length More Than One Character
if (strlen($search_string) >= 1 && $search_string !== ' ') {
    // Build Query
    $query = 'SELECT * FROM produse WHERE denumire LIKE "%'.$search_string.'%"';

    // Do Search
    $result = $tutorial_db->query($query);
    while($results = $result->fetch_array()) {
        $result_array[] = $results;
    }

    // Check If We Have Results
    if (isset($result_array)) {
        foreach ($result_array as $result) {

            // Format Output Strings And Hightlight Matches
            $display_link = $result['link'];
            $display_pret = 'Pret: '.$result['pret'].' '.$result['moneda']; 
            //$display_moneda = ' '.$result['moneda'];
            $display_name = preg_replace("/".$search_string."/i", "<b class='highlight'>".$search_string."</b>", $result['denumire']);
            $display_url = $result['link'];

            // Insert Name
            $output = str_replace('nameString', $display_name, $html);

            // Insert link
            $output = str_replace('linkString', $display_link, $output);
            
            // Insert pret
            $output = str_replace('pret', $display_pret, $output);
            
            // Insert moneda
            //$output = str_replace('moneda', $display_moneda, $output);

            // Insert URL
            $output = str_replace('urlString', $display_url, $output);

            // Output
            echo($output);
        }
    }else{

        // Format No Results Output
        $output = str_replace('urlString', 'index.php', $html);
        $output = str_replace('nameString', '<b>Nu s-a gasit produsul cautat. Scrie alte cuvinte</b>', $output);
        //$output = str_replace('linkString', 'Incearca ', $output);

        // Output
        echo($output);
    }
}
Rezultatul este la pagina: vmag.biz/cautare/

Acest script merge dar nu cum as dori eu.
De exemplu am produsele acestea:

Cod: Selectaţi tot

MDR1425-Manseta tensiometru MORETTI cu 2 tuburi, pentru adulti obezi.
MDR125-Manseta tensiometru MORETTI cu 2 tuburi, cosciala (picior), cu scai
MDR1436-Manseta tensiometru MORETTI cu un tub, pentru adulti, cu carlig
Si eu cand caut:
mdr 2 moretti sa imi afiseze aceste produse.
Scriptul pe care il am eu trebuie sa scriu in ordinea in care sunt si daca scriu alt cuvant care este in titlul produsului imi zice ca nu este podusul respectiv. cum as putea sa modific sau unde as putea gasi un script care ar face asa ceva. Multumesc aticipat.
Cu stima Trif
M-am hotarat!
De ce sa fiu trist?
Oricum nu intereseaza pe nimeni...!
Mai bine sunt fericit si ii enervez pe toti cu fericirea mea!
http://www.cantaricrestine.ro
---> cu stima Trif

MarPlo Mesaje:4343
Incearca sa inlocuiesti linia de cod:

Cod: Selectaţi tot

$query = 'SELECT * FROM produse WHERE denumire LIKE "%'.$search_string.'%"';
Cu acest cod:

Cod: Selectaţi tot

// gets an array with words from %search_string, with more than 2 characters
$search_string_ar = array_filter(explode(' ',$search_string), function($elm){
  $elm = trim($elm);
  if(strlen($elm) > 2) return $elm;
});
$search_string_ar = array_values($search_string_ar);    // reorder index key from 0
$patern_src = '([^ ]*'. implode('|', $search_string_ar) .'[^ ]*)';
$query = "SELECT * FROM produse WHERE denumire REGEXP '$patern_src'";
 

trif Mesaje:500
Buna ziua,
Am pus acel cod dar acum merge aiurea, ii dau sa caute ceva si imi zice ca nu am produse, cand exista acel produs. Am mai tot cautat si pe net dar nimic.

Am mai incercat acest script primit de la tine si merge daca scriu exact fraza cautata, dar daca caut un cuvant din, nu imi mai merge ci ramane rezulatele exact cum sunt pana la terminarea frazei scrise.
Ce as putea sa fac? Multumesc anticipat.
Cu stima Trif
M-am hotarat!
De ce sa fiu trist?
Oricum nu intereseaza pe nimeni...!
Mai bine sunt fericit si ii enervez pe toti cu fericirea mea!
http://www.cantaricrestine.ro
---> cu stima Trif

MarPlo Mesaje:4343
Nu stiu, mai mult de atat nu ma pricep.
Ce poti sa faci?
1. Depaneaza script-ul, vezi ce comanda pt SQL e in variabila $query (cu echo $query;), poti testa apoi acel sir in phpmyadmin, vezi ce rezultate da, daca trebuie il modifici pana obtii cu vrei, apoi te gandesti si faci ca si in php sa rezulte in $query comanda de care esti multumit ca merge in phpmyadmin.

2. Sau poti apela la programatori php mai experimentati care iti fac si modifca scripturi pe bani (gasesti pe phpromania.net/).

trif Mesaje:500
Salut,
Am o mica problema, atunci cand caut ceva imi tine cont de tipul de litere (MARI si mici). cum modific codul de la tine ca sa il fac ca sa nu tina cont de tipul de litere?
Multumesc anticipat. Cu stima trif
M-am hotarat!
De ce sa fiu trist?
Oricum nu intereseaza pe nimeni...!
Mai bine sunt fericit si ii enervez pe toti cu fericirea mea!
http://www.cantaricrestine.ro
---> cu stima Trif

MarPlo Mesaje:4343
Din cate stiu, setarile standard in mysql nu fac diferenta intre literele mici si mari la select, problema apare invers, cand se vrea aceasta diferentiere, care se obtine prin crearea tabelului cu setare pentru caractere in binary format. Probabil asa ai tabelul /coloanele definite.

1. La crearea tabelului ar trebui un format de caractere (COLLATE) case-insensitive (cu "_ci" la sfarsit).
Exemplu:

Cod: Selectaţi tot

CREATE TABLE `nume_tabel` (
  `col1`  INT() PRIMARY KEY NOT NULL,
  `col2`  VARCHAR(188) DEFAULT '',
  `col3` INT(8) UNSIGNED DEFAULT 1
) CHARACTER SET utf8 COLLATE utf8_general_ci
2. Sau modifici linia in codul dat mai sus cu aceasta:

Cod: Selectaţi tot

$query = "SELECT * FROM produse WHERE LOWER(denumire) REGEXP '". strtolower($patern_src) ."'";