[PHP+MySQL] kan dit makkelijker cq. netter?

Pagina: 1
Acties:

  • KlaasB
  • Registratie: Juli 2000
  • Laatst online: 01-07-2024
Voor de zoekmachine van een nieuwssite heb ik dit bedacht:

Per pagina worden tien zoek resultaten laten zien, en bovenaan de pagina een rijtje met getallen zodat je meteen naar bijv. zoekresultaten 30 t/m 40 kan springen.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?
 if (empty($Start)) { $Start = "0"; }
 connectdb($DBhost, $DBuser, $DBpass, $DBase);
 $vraag = "SELECT titel, ID, MATCH
           (titel,bericht) AGAINST ('$zoeken') AS score
           FROM Nieuws
           WHERE MATCH (titel,bericht) AGAINST ('$zoeken') ";
 $resultaat = mysql_query($vraag);
  $Teller = mysql_num_rows($resultaat);
 $vraag .= " LIMIT  $Start, 10";
 $resultaat = mysql_query($vraag);

 if ($resultaat) {
 $zoeken = html2text($zoeken, '');
 $search = str_replace(" ", "+", $zoeken);
   echo "<TABLE BORDER=0 WIDTH=620>
          <TR VALIGN=TOP ALIGN=CENTER><TD WIDTH=620 COLSPAN=2> [";

   $ZTeller = $Teller;
   while ($ZTeller > 0 ) {
    $Counter2++;
    echo " <A HREF=zoeken.php?Start=$Counter&amp;amp;amp;zoeken=$search>$Counter2</A> ";
    $ZTeller = $ZTeller - 10;
    $Counter=$Counter+10; }

    echo "] </TD></TR>
       <TR ALIGN=LEFT>
        <TD WIDTH=470 CLASS=small COLSPAN=2>$Teller berichten('s) voldoen aan je zoekopdracht ($zoeken).<BR></TD></TR>";

   while ($r = mysql_fetch_array($resultaat)) {
   $ID = $r["ID"];
   $score = $r["score"];
?>

etc. etc.

It's not a bug, it's a feature


  • kvdveer
  • Registratie: November 2000
  • Laatst online: 06-11-2025

kvdveer

Z.O.Z.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?
if (empty($Start)) 
    $Start = "0";    

$eind = $start+10;

// aantal bepalen
$resultaat = mysql_query("select count(Id) from Nieuws WHERE MATCH (titel,bericht) AGAINST ('$zoeken')");
$row = mySQL_fetch_row($resultaat);
$teller = $row[0];  

$vraag = "SELECT titel, ID, MATCH (titel,bericht) AGAINST ('$zoeken') AS score
        FROM Nieuws
        WHERE MATCH (titel,bericht) AGAINST ('$zoeken') 
        LIMIT $start,$eind ;";
        
$resultaat = mysql_query($vraag);
?>

De query "select count" geeft veel minder resultaten en is dus sneller. Ik tel de ID's want die zijn waarschijnlijk key en dus not null....

Verder zie ik niet veel mogelijkheden.

Localhost, sweet localhost


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Op donderdag 06 december 2001 17:36 schreef kvdveer het volgende:
De query "select count" geeft veel minder resultaten en is dus sneller. Ik tel de ID's want die zijn waarschijnlijk key en dus not null....
:D Anders is er idd iets goed mis ;)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • KlaasB
  • Registratie: Juli 2000
  • Laatst online: 01-07-2024
Ik vraag me alleen af of twee keer een FULLTEXT search op een database met 14.000 berichten wel zo verstandig is.
Dus wat is wijs..??

It's not a bug, it's a feature


  • Apache
  • Registratie: Juli 2000
  • Laatst online: 14-09 22:46

Apache

amateur software devver

Op donderdag 06 december 2001 17:52 schreef KlaasB het volgende:
Ik vraag me alleen af of twee keer een FULLTEXT search op een database met 14.000 berichten wel zo verstandig is.
Dus wat is wijs..??
zelf een searchindex bouwen?

If it ain't broken it doesn't have enough features


  • Rense Klinkenberg
  • Registratie: November 2000
  • Laatst online: 15-09 23:45
Op donderdag 06 december 2001 17:12 schreef KlaasB het volgende:
...
PHP:
1
2
3
4
5
6
7
8
9
10
11
<?
 if (empty($Start)) { $Start = "0"; }
 connectdb($DBhost, $DBuser, $DBpass, $DBase);
 $vraag = "SELECT titel, ID, MATCH
           (titel,bericht) AGAINST ('$zoeken') AS score
           FROM Nieuws
           WHERE MATCH (titel,bericht) AGAINST ('$zoeken') ";
 $resultaat = mysql_query($vraag);
  $Teller = mysql_num_rows($resultaat);
 $vraag .= " LIMIT  $Start, 10";
?>
Ik hoop niet voor je dat je deze code op een server hebt draaien met belangerijke data, want met deze code kan het heel makkelijk worden om andere queries uit te voeren. Dit is heel makkelijk op de lossen door alle post/get variabelen die je in queries gebruikt te addslashes()'en.

verder heb ik geen idee hoe je probleem op te lossen.

  • KlaasB
  • Registratie: Juli 2000
  • Laatst online: 01-07-2024
Ik heb dit vaker gehoord, en daarom gebruik ik bij sites in het wild dan ook de addslashes (en vaak meteen de strip_tags) functie op dit soort variabelen.
Mijn vraag is nu (zonder dat je meteen complete hack voorbeelden hoeft te geven), hoe gaat dat dan?

It's not a bug, it's a feature


Verwijderd

count(* ) is minstens zo snel als en doet 't zelfde als count(id)

bij count(* ) telt ie records, dan hoeft ie niet naar inhoud van fields te kijken, en hij weet toch van ieder record hoe groot 't is dus kan ie snel door de table heen springen

  • kvdveer
  • Registratie: November 2000
  • Laatst online: 06-11-2025

kvdveer

Z.O.Z.

Hangt er van af wat je wilt bereiken: Als je je databaseserver wilt ontlasten kun je misschien de query eenmaal uitvoeren en dan naar het resultaat 'springen' met
PHP:
1
2
3
4
<?
for($i=0;$i<10;$i++)
  mysql_fetch_row($resultaat);
?>

Ik denk dat je zelf even moet meten wat het snelst is. Als mensen voornamelijk op de eerste pagina's blijven is deze optie niet eens zo heel erg inefficient.

edit: blunder! het kan zelfs zonder Bill-gates loopje:
PHP:
1
2
3
4
<?
for($i=$start;$i<$eind;$i++)
  mysql_result($resultaat,$i,1);
?>

Localhost, sweet localhost


  • Femme
  • Registratie: Juni 1999
  • Laatst online: 22:41

Femme

Hardwareconnaisseur

Official Jony Ive fan

Op donderdag 06 december 2001 17:52 schreef KlaasB het volgende:
Ik vraag me alleen af of twee keer een FULLTEXT search op een database met 14.000 berichten wel zo verstandig is.
Dus wat is wijs..??
Ik heb een paar dagen geleden even uitgeprobeerd hoe snel de full text search van 3.23.46 is door een full text index op de reactie tabel van t.net te bouwen (415K records). Daarvoor had ik wel eerst alle onzin woorden eruit gefilterd en de gefilterde reacties in een andere tabel gezet (moest toch al aangezien full text indeces niet mogelijk zijn op InnoDB tabellen).

Zolang de result set niet extreem groot was functioneerde de FTS behoorlijk snel. Queries werden vaak binnen 30ms uitgevoerd. Bij grote result set van 8000 records liep de querytijd wel link op tot net iets meer dan een seconde.
Pagina: 1