Szukanie wg wyrazów

0

Witam. Mam pewien problem z napisaniem zapytania do bazy.
Otóż, chcę otrzymać wynik taki, że:

  • wpisuję frazę np 4 słowa, skrypt szuka mi wyniki pasujące do któregokolwiek ze słowa.

Teraz znajoma mi teoria.
Rozbiję frazę na słowa. Policzę wyrazy. Pętla for o długości liczby wyrazów.
I tu napotykam problem. Powtarzana będzie formuła OR 'słowo[i+1]'
Jak tą pętlę zgrać z zapytaniem?

0

Nie wiem czy dobrze zrozumiałem: Jeśli chcesz rozbić to tak:

Kupie kredki.

[0] => 'kupie'
[1] => 'kredki'

I później wykonać zapytanie:

SELECT * FROM `table` WHERE `field` = "kupie" OR `field` = "kredki";

To robisz tako:

for($i=0; $i<count($tablica); $i++) {
	$tablica[$i] = '"' . mysql_real_escape_string($tablica[$i], $mysql_link) . '"';
}

W ten sposób wszystkie elementy w tablicy zostaną umieszczone w cudzysłowach i zabezpieczone przed wyjściem z nich. Później tylko:

$zapytanie = 'SELECT * FROM `table` '; //początek
$zapytanie .= 'WHERE `field` = ' . implode(' OR `field` = ', $tablica); //zawartość WHERE
$zapytanie .= ' ORDER BY `field2` DESC;'; //reszta zapytania

I zapytanie ułożone. Dość prosty sposób, ale nie mam innych pomysłów...

0
for($i=0; $i<count($tablica); $i++) {
	$tablica[$i] = '"' . mysql_real_escape_string($tablica[$i], $mysql_link) . '"';
}

Nie wiem czy dobrze myślę, zmienna $mysql_link to wykonanie zapytania $zapytanie ??:)

0

Nie, kliknij sobie w nazwę funkcji to będziesz miał dokładne informacje. Funkcja mysql_real_escape_string służy do zabezpieczania zapytania przed SQL Injection. Drugi argument to link do połączenia MySQL w którym chcesz wywołać zapytanie, czyli to co zwróci mysql_connect.

$link = mysql_connect(...); //pobieramy link
//...
mysql_real_escape_string(..., $link); //a tu podajemy do funkcji
//...
mysql_query(..., $link); //mysql_query też chce tego atrybutu
0

można też bez pętli:

$arr = explode(" ", "kupię kredki");
$query = "Select * from `tabela` where `pole` = '".implode("' OR `pole`='", $arr)."'";

// ups, nie doczytałem wątku, Monk już podał to rozwiązanie ;) Więc jeszcze jedno ode mnie:

$arr = explode(" ", "kupię kredki");
$query = "Select * from `tabela` where `pole` IN ('".implode("', '", $arr)."')";
0

lub

$tab    = explode (' ', 'ala ma kota');
$query  = 'SELECT field FROM table WHERE pole REGEXP (' . implode ('|',$tab) . ')';  
0
Demonical Monk napisał(a)

Nie wiem czy dobrze zrozumiałem: Jeśli chcesz rozbić to tak:

Kupie kredki.

[0] => 'kupie'
[1] => 'kredki'

I później wykonać zapytanie:

SELECT * FROM `table` WHERE `field` = "kupie" OR `field` = "kredki";

To robisz tako:

for($i=0; $i<count($tablica); $i++) {
	$tablica[$i] = '"' . mysql_real_escape_string($tablica[$i], $mysql_link) . '"';
}

W ten sposób wszystkie elementy w tablicy zostaną umieszczone w cudzysłowach i zabezpieczone przed wyjściem z nich. Później tylko:

$zapytanie = 'SELECT * FROM `table` '; //początek
$zapytanie .= 'WHERE `field` = ' . implode(' OR `field` = ', $tablica); //zawartość WHERE
$zapytanie .= ' ORDER BY `field2` DESC;'; //reszta zapytania

I zapytanie ułożone. Dość prosty sposób, ale nie mam innych pomysłów...

Niestety, Warning: mysql_real_escape_string() expects parameter 2 to be resource, null given in ......

0

@djgarsi, pokaż Twój kod

0
$search = htmlspecialchars($_POST['szukaj']);

$tablica = explode(" ", $search);

for($i=0; $i<count($tablica); $i++) {
        $tablica[$i] = '"' . mysql_real_escape_string($tablica[$i], $final) . '"';
}

$zapytanie = 'SELECT * FROM file '; //początek
$zapytanie .= 'WHERE name ='.implode(' OR name = ', $tablica); //zawartość WHERE
$zapytanie .= ' ORDER BY pobran DESC;'; //reszta zapytania 

$final = mysql_query($zapytanie) or Die ("Nie działa zapytanie końcowe");
0

Przeczytaj jeszcze raz drugi post DM.

0

http://php.net/manual/pl/function.mysql-real-escape-string.php

Kółko wsparcia dla nie umiejących z google korzystać?

Masz wyraźnie napisane dlaczego masz błąd z resource'em.

0
Demonical Monk napisał(a)

Drugi argument to link do połączenia MySQL w którym chcesz wywołać zapytanie, czyli to co zwróci mysql_connect.

$link = mysql_connect(...); //pobieramy link
//...
mysql_real_escape_string(..., $link); //a tu podajemy do funkcji
//...
mysql_query(..., $link); //mysql_query też chce tego atrybutu

Ludzie, nawet snippeta dałem...

0

Dobrze. a co jesli połączenie z bazą mam w postaci:

@mysql_connect("localhost", "user", "pass");
@mysql_select_db("baza");

w includowanym pliku na początku search.php ??

0
djgarsi napisał(a)

Dobrze. a co jesli połączenie z bazą mam w postaci:

@mysql_connect("localhost", "user", "pass");
@mysql_select_db("baza");

w includowanym pliku na początku search.php ??

No toż pisałem. Przerabiasz tak:

$link = @mysql_connect("localhost", "user", "pass");
@mysql_select_db("baza");

I zmienną $link dajesz jako drugi argument do mysql_real_escape_string.

0

Ok, mam już teraz postac kodu:

$link = @mysql_connect("localhost", "user", "pass");
@mysql_select_db("baza");

$search = htmlspecialchars($_POST['szukaj']);

$tablica = explode(" ", $search);

for($i=0; $i<count($tablica); $i++) {
        $tablica[$i] = '"' . mysql_real_escape_string($tablica[$i], $link) . '"';
}

$zapytanie = 'SELECT * FROM file '; //początek
$zapytanie .= 'WHERE name ='.implode(' OR name = ', $tablica); //zawartość WHERE
$zapytanie .= ' ORDER BY pobran DESC;'; //reszta zapytania 

$final = mysql_query($zapytanie, $link) or Die ("Nie działa zapytanie końcowe");

I nadal błąd.

EDIT: Dobra, już znalazłem błąd.:) Miałem inną zmienną o tej samej nazwie.:O
Ale nie obyło się dalej bez zgrztów.:) Jest 'jakiś' problem z zapytaniem

$zapytanie = 'SELECT * FROM file '; //początek
$zapytanie .= 'WHERE name ='.implode(' OR name = ', $tablica); //zawartość WHERE
$zapytanie .= ' ORDER BY pobran DESC;'; //reszta zapytania 

Bo zwraca mi błąd że nie działa zapytanie.

0

Ehh... Naucz się sam debugować.

$final = mysql_query($zapytanie, $link) or Die ("Nie działa zapytanie końcowe");

// zmień na

$final = mysql_query($zapytanie, $link) or Die ("SQL Error: " . mysql_error());
0

Ok. Ten błąd rozwiązałem. Jednak nadal coś musi byc z zapytaniem bo nie znajduje rekordów choć one są.

0

MySQL Error nic nie pokazuje? Daj kod który masz pod mysql_query...
Nauczcie się że z samego pisania "coś musi być bo nie działa" nawet wróżka nie pomoże.

0

Dokładnie, MySQL Error nic nie pokazuje. A kod ktory odpowiada za wyświetlanie wyników ma postać:

while($row_file=mysql_fetch_array($final))
{
$download_info_file = get_template('download_info_file.tpl');

$download_info_file = str_replace("{id}", $row_file['id'], $download_info_file);
$download_info_file = str_replace("{name}", $row_file['name'], $download_info_file);
$download_info_file = str_replace("{name_n}", namen($row_file['name']), $download_info_file);
$download_info_file = str_replace("{data}", $row_file['data'], $download_info_file);
$download_info_file = str_replace("{pobran}", $row_file['pobran'], $download_info_file);
$download_info_file = str_replace("{licencja}", $row_file['licencja'], $download_info_file);
$download_info_file = str_replace("{opis}", substr($row_file['opis'], 0, 200), $download_info_file);
$download_info_file = str_replace("{l_data}", $lang['dodano'], $download_info_file);
$download_info_file = str_replace("{l_pobran}", $lang['pobran'], $download_info_file);
$download_info_file = str_replace("{l_licencja}", $lang['licencja'], $download_info_file);

if($row_file["img"] == "")
{
$download_info_file = str_replace("{img}", "", $download_info_file);
}
else
{
$download_info_file = str_replace("{img}", $row_file['img'], $download_info_file);
}

echo $download_info_file;
}

if($ile_rek >= 0)
{

include('podzial.php');
}
}



$ce = get_template('center_end.tpl');
echo $ce;

Wydaje mi sie że ten kod jest poprawny bo przed zmianami zapytania działało.

0
$zapytanie = 'SELECT * FROM file '; //początek
$zapytanie .= 'WHERE name ='.implode(' OR name = ', $tablica); //zawartość WHERE
$zapytanie .= ' ORDER BY pobran DESC;'; //reszta zapytania

/* dodaj to: */ echo($zapytanie);

$final = mysql_query($zapytanie, $link) or Die ("Nie działa zapytanie końcowe");

Zobacz czy zapytanie ma poprawną formę.

0

Tak. Zapytanie jest ok i nawet po wrzuceniu do PMA też bezbłędnie.
Tak więc cholera wie co jest tu nie tak.:(

0

To w szablonie/wyświetlaniu błąd. Sprawdź czy nazwy pól są dobre. Id to nie to samo co id.

0

No tylko że do tej pory szablon nie zawierał żadnych błędów i nic w nim nie zmieniałem.:(

0

To debuguj var_dumpem wynik funkcji mysql_fetch_array i sprawdź czy dobrze do szablonu podpina.

0

Chyba jest ok bo otrzymałem bool(false).
Zresztą nie wiem bo pierwszy raz sie z tym spotykam.

0

Bool(false) nigdy nie jest dobrze... Jeśli wrzuciłeś tego dumpa przed lub w środku pętli while i masz taki wynik, to znaczy że $final też jest NULL, FALSE lub zawiera pusty wynik. Te kody są w jednym pliku czy w osobnych funkcjach?

0

No jest var_dump w pętli while.
Tak, cały czas rozmawiamy o jednym pliku.

0
echo(mysql_num_rows($final));

Co daje? Wstaw bezpośrednio po wykonaniu zapytania i w pętli while.

0

Nic nie zwróciło.

0

Tuż po wykonaniu zapytania nic nie zwraca? I nie ma błędu? Yyy...
No to teraz wachlarz ostateczności, na górze pliku dodaj sobie:

error_reporting(E_ALL);
ini_set('display_errors', 1);

Włączy tryb pedantyczny w raportowaniu błędów.

1 użytkowników online, w tym zalogowanych: 0, gości: 1