[PHP][MySQL]Wyświetlanie danych w wyszukiwarce

0

Witam wszystkich użytkowników tego forum
Mam problem.
Stworzyłem sobie wyszukiwarkę własnej witryny i mam problem z wyświetlaniem wyników.
Wyświetla je dobrze, ale chciałbym, aby po znalezieniu wyników kliknąć w interesujący mnie kod i przeniesie mnie do odpowiedniego artykułu.
Lecz tutaj nasuwa się problem. Nie bardzo wiem co przypisać do zmiennej $adres i zmiennej $id
Mógłby prosić o pomoc?
Z góry dziękuje

szukaj.php

<?php
session_start();
include('functions/filtr.php');
include('include/db.php');
echo '<h2>Wyniki wyszukiwania</h2>';
$_POST['wynik'] = trim(filtr($_POST['wynik'])); 
if(empty($_POST['wynik']))
{
echo 'Formularz został wypełniony niepoprawnie!<br /> Nie można wyświetlić wyników wyszukiwania!';
echo '<br /><br />';
}
else
{
$zapytanie = "SELECT home.tresc FROM home WHERE tresc LIKE '%{$_POST['wynik']}%'
UNION SELECT kontakt.tresc FROM kontakt WHERE tresc LIKE '%{$_POST['wynik']}%'
UNION SELECT oferta.tresc FROM oferta WHERE tresc LIKE '%{$_POST['wynik']}%'
UNION SELECT o_mnie.tresc FROM o_mnie WHERE tresc LIKE '%{$_POST['wynik']}%'
UNION SELECT portfolio.tresc FROM portfolio WHERE tresc LIKE '%{$_POST['wynik']}%'
UNION SELECT portfolio.nazwa FROM portfolio WHERE nazwa LIKE '%{$_POST['wynik']}%'
UNION SELECT portfolio.technologia FROM portfolio WHERE technologia LIKE '%{$_POST['wynik']}%'
UNION SELECT portfolio.adres_strony FROM portfolio WHERE adres_strony LIKE '%{$_POST['wynik']}%'
UNION SELECT reklama.tresc FROM reklama WHERE tresc LIKE '%{$_POST['wynik']}%'
UNION SELECT skrypty.tresc FROM skrypty WHERE tresc LIKE '%{$_POST['wynik']}%'
UNION SELECT skrypty.nazwa FROM skrypty WHERE nazwa LIKE '%{$_POST['wynik']}%'";
$idzapytania = mysql_query($zapytanie);
$oblicz = mysql_num_rows($idzapytania);
echo'Znaleziono: '.$oblicz.'<br /><br />';
for($x=0;$x<$oblicz;$x++)
{
$wiersz = mysql_fetch_array($idzapytania);
echo $x+1;
echo '. ';
$wyraz = explode(' ',substr($wiersz['tresc'], 50)); 
$wyrazy = substr($wiersz['tresc'], 0, 50).$wyraz[0];
$wyraz = $wyrazy;
$array = array('[url]','[/url]','[b]','[/b]','[i]','[/i]','[u]','[/u]','[small]','[/small]',
'[big]','[/big]','[p]','[/p]','[center]','[/center]','[color=([url]http://)?(.*?)\][/url]','[/color]','[size=([url]http://)?(.*?)\][/url]','[/size]','[img]','[/img]','[hr]','[/hr]');
$wyrazek = str_replace($array,'',$wyraz);
//odpowiada za wyświetlanie
echo '<a style="text-decoration: none;" href="/'.$adres.'/'.$id.'"><b>'.$wyrazek.'</b></a>';
//koniec wyświetlania
echo'<br /><br />';
}
}
mysql_close($connect);
?>

Pozdrawiam,
nansss

0
  1. Ten zapis ssie:
$zapytanie = "SELECT home.tresc FROM home WHERE tresc LIKE '%{$_POST['wynik']}%' [...]
  1. SQL INJECTION!
    Wystarczy że wpiszę w $_POST['wynik']:
    '; DROP TABLE home.tresc;
    I twoją tabelę trafi szlag [diabel]
    Musisz jakoś ochronić się przed takimi rzeczami.
0
Demonical Monk napisał(a)

Wystarczy że wpiszę w $_POST['wynik']:
'; DROP TABLE home.tresc;
I twoją tabelę trafi szlag [diabel]
Musisz jakoś ochronić się przed takimi rzeczami.

Bullshit, przeczytaj sobie dokumentację do mysql_query. Jest tam takie jedno, dość ważne zdanie które obala Twoją teorię. Ale przez UNION można już wyciągnąć ciekawe dane.

Co do problemu - zrób sobie

SELECT "home", home.tresc WHERE ...
UNION SELECT "inna_tabelka", inna_tabelka.tresc WHERE ...

I w najprostszy sposób wiesz z jakiej tabelki pobierać dane. Do tego jeszcze by się przydało jakieś id wyciągniętego z bazy dokumentu.

Wydaje mi się, że po prostu struktura bazy danych jest nieciekawa, prawdopodobnie starczyłaby jedna tabelka.

0

Z tej strony założyciel tematu

A widzicie na samym początku w 5 linijce filtrowanie $_POST?

nav napisał(a)

Co do problemu - zrób sobie

SELECT "home", home.tresc WHERE ...
UNION SELECT "inna_tabelka", inna_tabelka.tresc WHERE ...

I w najprostszy sposób wiesz z jakiej tabelki pobierać dane. Do tego jeszcze by się przydało jakieś id wyciągniętego z bazy dokumentu.

Zapytanie typu

SELECT "home", home.tresc WHERE ...

Wyrzuca błąd

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /a/b/c/d/szukaj.php on line 26

0

a tak, "home" as tableName, "inna" as tableName.

Swoja drogą to nie zapytanie wyrzuca taki błąd, a to, że mysql_query zwraca false i masz to gdzieś, przekazujesz wynik do mysql_num_rows itd. Błedem powinno rzucić mysql_query.

0

Że niby jak ma to zapytanie wyglądać?

0
$result = mysql_query($sql);
if (!$result) { exit(mysql_error()); }
0

Kto Cię uczył SQL'a ? SELECT home FROM tabela WHERE

0

Co tutaj może być źle? Nie wiem czemu ale nie przypisuje mi do adresu

<?php
session_start();
include('functions/filtr.php');
include('include/db.php');
echo '<h2>Wyniki wyszukiwania</h2>';
$_POST['wynik'] = trim(filtr($_POST['wynik'])); 
if(empty($_POST['wynik']))
{
echo 'Formularz został wypełniony niepoprawnie!<br /> Nie można wyświetlić wyników wyszukiwania!';
echo '<br /><br />';
}
else
{
$zapytanie = "SELECT tresc FROM home WHERE tresc LIKE '%{$_POST['wynik']}%'
UNION SELECT tresc FROM kontakt WHERE tresc LIKE '%{$_POST['wynik']}%'
UNION SELECT tresc FROM oferta WHERE tresc LIKE '%{$_POST['wynik']}%'
UNION SELECT tresc FROM o_mnie WHERE tresc LIKE '%{$_POST['wynik']}%'
UNION SELECT tresc FROM portfolio WHERE tresc LIKE '%{$_POST['wynik']}%'
UNION SELECT nazwa FROM portfolio WHERE nazwa LIKE '%{$_POST['wynik']}%'
UNION SELECT technologia FROM portfolio WHERE technologia LIKE '%{$_POST['wynik']}%'
UNION SELECT adres_strony FROM portfolio WHERE adres_strony LIKE '%{$_POST['wynik']}%'
UNION SELECT tresc FROM reklama WHERE tresc LIKE '%{$_POST['wynik']}%'
UNION SELECT tresc FROM skrypty WHERE tresc LIKE '%{$_POST['wynik']}%'
UNION SELECT nazwa FROM skrypty WHERE nazwa LIKE '%{$_POST['wynik']}%'
UNION SELECT id FROM home
UNION SELECT id FROM kontakt
UNION SELECT id FROM oferta
UNION SELECT id FROM o_mnie
UNION SELECT id FROM portfolio
UNION SELECT id FROM reklama
UNION SELECT id FROM skrypty
UNION SELECT adres FROM home
UNION SELECT adres FROM kontakt
UNION SELECT adres FROM oferta
UNION SELECT adres FROM o_mnie
UNION SELECT adres FROM portfolio
UNION SELECT adres FROM reklama
UNION SELECT adres FROM skrypty";
$idzapytania = mysql_query($zapytanie);
$oblicz = mysql_num_rows($idzapytania);
echo'Znaleziono: '.$oblicz.'<br /><br />';
for($x=0;$x<$oblicz;$x++)
{
$wiersz = mysql_fetch_array($idzapytania);
echo $x+1;
echo '. ';
$wyraz = explode(' ',substr($wiersz['tresc'], 50)); 
$wyrazy = substr($wiersz['tresc'], 0, 50).$wyraz[0];
$wyraz = $wyrazy;
$array = array('[url]','[/url]','[b]','[/b]','[i]','[/i]','[u]','[/u]','[small]','[/small]',
'[big]','[/big]','[p]','[/p]','[center]','[/center]','[color=(http://)?(.*?)\]','[/color]',
'[size=(http://)?(.*?)\]','[/size]','[img]','[/img]','[hr]','[/hr]');
$wyrazek = str_replace($array,'',$wyraz);
echo '<a style="text-decoration: none;" href="/'.$wiersz['adres'].'/'.$wiersz['id'].'"><b>'.$wyrazek.'</b></a>';
echo'<br /><br />';
}
}
mysql_close($connect);
?>
0

Nie można:
UNION SELECT id, adres FROM skrypty
?

0

Zastanawia mnie po co te UNION SELECT wszędzie. Poprawcie mnie jeśli się mylę, ale JOIN chyba szybsze ;)

0

@SebaZ: UNION i JOIN to co innego. UNION to suma dwóch zapytań, JOIN to łączenie wyników.

0

Nie bo wyrzuca błąd

0

Wyrzuca błąd, bo jest coś nie tak ze składnią zapewne. Słowo "bład" NIC NIE MÓWI! Treść błędu, już może.

A tamto powyższe zapytanie jest po prostu nielogiczne, w wyniku masz jedną(!) kolumnę, na początku ze znalezionymi wartościami, potem z id ze wszystkich tabelek (wszystkich id, nie tylko spełniających warunki) i adresami (analogicznie jak id).

Jak nic powinno być id, adres, tresc. Ale wtedy kazda tabelka musi miec takie kolumny.

0

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in

0

mysql_error()?

0

Już rozwiązane :)
Dzięki za wszelką pomoc :)

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