Cautare pe site in mai multe tabele

Discutii despre script-uri si coduri PHP-MySQL, precum si lucru cu XML in PHP.
cadou
Mesaje: 328

Cautare pe site in mai multe tabele

Salut marplo !
Am creat acest cod de cautare pe site, dar am mici probleme cu el :
1. De exemplu daca caut un cuvant ce se afla si in tabela de programe si in tabela de intrebari , nu imi arata amandoua rezultate ....
2. La rezultate la programe, nu am link unic pentru fiecare program in parte asa cum am la intrebari sau la firma, dar am vazut ca se poate face cumva (cred ca in java, cu scroll), adica la fiecare div am o denumire + un id unic pentru fiecare div, dar nu stiu cum sa fac acest scroll direct la fisierul selectat, iar acesta selectat sa fie cumva semnalizat ... o culoare schimbata, o bordura ceva ... gen cum este la facebook la comentarii, te duce direct la comentariul selectat din notificari si e semnalizat acolo cumva ca sa iti dai seama ca e vorba de el !

Cod: Selectaţi tot

<?php include('conectare.php');
if($_POST) 
{
$search = $_POST['searchword'];

$programe = $dbh->query("SELECT COUNT(*) FROM `programe` WHERE `descriere` like '%$search%' ORDER BY RAND() LIMIT 8")->fetch(PDO::FETCH_NUM);
$rezprograme = $programe[0];

$firme = $dbh->query("SELECT COUNT(*) FROM `firme` WHERE `denumire` like '%$search%' ORDER BY RAND() LIMIT 8")->fetch(PDO::FETCH_NUM);
$rezfirme = $firme[0];

$intrebari = $dbh->query("SELECT COUNT(*) FROM `intrebari` WHERE `intrebare` like '%$search%' ORDER BY RAND() LIMIT 8")->fetch(PDO::FETCH_NUM);
$rezintrebari = $intrebari[0];

// asociere rezultate //
$rowprograme = $dbh->query("SELECT * FROM `programe` WHERE `denumire` like '%$search%' ORDER BY RAND() LIMIT 8");
$rowfirme = $dbh->query("SELECT * FROM `firme` WHERE `denumire` like '%$search%' ORDER BY RAND() LIMIT 8");
$rowintrebari = $dbh->query("SELECT * FROM `intrebari` WHERE `intrebare` like '%$search%' ORDER BY RAND() LIMIT 8");

if($rezprograme == 0 AND $rezfirme == 0 AND $rezintrebari == 0)
{ ?>
<div class="display_box" align="left" style="color:red;">
     <center>
         Fara rezultate. <br>
         <b>Sfat: Scrie corect sau este posibil sa nu existe momentan pe site ceea ce cauti!</b>
     </center>
</div><?php }
else {
// daca se gaseste ceva in programe //
if($rezprograme > 0) {
    while ($search = $rowprograme->fetch(PDO::FETCH_ASSOC)){
$final = str_ireplace($_POST['searchword'], '<b>'.ucwords($_POST['searchword']).'</b>', ''.ucwords($search['denumire']).''); ?>
<a href="/programe.php" style="text-decoration:none;" target="_">
    <div class="display_box" align="left;color:red;">
        <?php echo " $final "; ?>
    </div>
</a>
<?php }
}
// end rezultate programe //

// cautare firme //
else if($rezfirme > 0) {
    while ($search = $rowfirme->fetch(PDO::FETCH_ASSOC)){ 
$final = str_ireplace($_POST['searchword'], '<b>'.ucwords($_POST['searchword']).'</b>', ''.ucwords($search['denumire']).''); ?>
<a href="/firma/<?php echo "$search[adresa]";?>.php" style="text-decoration:none;" target="_">
    <div class="display_box" align="left;color:red;">
        <?php echo " $final "; ?>
    </div>
</a>
<?php }
}
// end search firme //

// cautare intrebari //
else if($rezintrebari > 0) {
    while ($search = $rowintrebari->fetch(PDO::FETCH_ASSOC)){
$final = str_ireplace($_POST['searchword'], '<b>'.ucwords($_POST['searchword']).'</b>', ''.ucwords($search['intrebare']).''); ?>
<a href="/intrebare/<?php echo "$search[adresa]";?>.php" style="text-decoration:none;" target="_">
    <div class="display_box" align="left;color:red;">
        <?php echo " $final "; ?>
    </div>
</a>
<?php }
}
// end search intrebari //
}
}
?>

MarPlo Mesaje: 4343
Salut
1. Cauza de ce nu arata ambele rezultate cand sunt in doua select-uri diferite ar putea fi ca folosesti "if() ... else if()"; daca e if() nu mai executa si "else".
Incearca fara "else":

Cod: Selectaţi tot

if($rezprograme > 0){
//...
}
if($rezfirme > 0){
//...
}
if($rezintrebari > 0){
//...
}  
- In loc sa ai 3 Select-uri si 3 while(), ai putea face un singur Select in toate trei tabele. Uite un tutorial despre cum se face Select in doua tabele MySQL: https://marplo.net/php-mysql/select- ... mysql.html
Similar se poate si cu 3 sau 4 tabele.

2. Sar putea face cu Javascript, dar mai simplu e cu Internal link. Deasupra Div-ului sa ai:

Cod: Selectaţi tot

<a id="id_unic"></a>
Iar adresa de accesare a paginii pt acea portiune sa fie cu "#id_unic" la sfarsit (id-ul acelui <a>):
site/adresa/pagina#id_unic

cadou Mesaje: 328
Salut marplo !
Mai am o problema cu acest formular de cautare.
De exemplu eu in baza de date am un rand ce contine :
" Acest pdf contine Ces 5.1.1 "
Eu daca dau sa caut " acest pdf " - il gaseste
daca dau sa caut " acest contine " - nu il mai gaseste ....
Cum as putea face ca sa imi caute chiar daca nu scriu la rand cuvintele si poate undeva chiar exista o parte din ce scriu eu ....
Sper ca m-am facut inteles.
Multumesc anticipat !

MarPlo Mesaje: 4343
Problema cautarii in baza de date dupa mai multe cuvinte transmise e cam complicata.
Ca idee, ar functiona daca cu explode() separi cuvintele din textul cautat si faci un Select cu LIKE pentru fiecare cuvant. Si pentru un sistem eficient se omit cuvintele scurte (1, 2 caractere) si altele comune, cum ar fi: ori, sau era, etc.
O solutie mai simpla e sa folosesti search cu MySQL match() against(). Pentru asta, la crearea tabelelor se adauga atributul FULLTEXT la coloane.
- Poti sa gasesti tutoriale /exemple pe internet, la cautare: "mysql match against tutorial".

Subiecte similare