PHP array_multisort probleem in zoekfunctie

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben bezig met een zoekfunctie op basis van FULL-INDEX in Mysql te maken. Dat werkt allemaal prima. Maar de website waarvoor ik de functie ontwikkel maakt gebruik van verschillende tabellen die niet allemaal hetzelfde zijn. Als output toon ik alleen een titel of stuk tekst, percentage relevantie door MySQL berekend en een direct link in een nieuw venster naar het item.

Om alle resultaten te combineren heb ik verzonnen ze in een array te stoppen ook dat gaat. Maar nu wil ik na verloop het array sorteren op score en vervolgens op titel/tekst wanneer nodig. Dat gaat dus fout. PHP zegt:

Warning: array_multisort() [function.array-multisort]: Argument #1 is expected to be an array or a sort flag in httpdocs/paginas/zoeken.php on line 63

Op die regel staat:
PHP:
1
array_multisort($score, SORT_DESC, $titel, SORT_ASC, $array);


Overige code
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Ken resultaten toe aan variabelen en vervolgens aan een array.
while($record = mysql_fetch_array($result)){
   $titel = $record['titel_normaal'];
   $link = $record['id'] .'-'. $record['titel_kort'];               
   $score = $record['score'];
   $resultaat[] = array('titel' => $titel, 'link' => 'nieuws/'. $link, 'score' => $score);
}

// Code voor regel 63
foreach ($resultaat as $key => $row) {
    $score[$key] = $row['score'];       
    $titel[$key] = $row['titel'];
    $link[$key]  = $row['link'];        
}



Ik heb het voorbeeld van php.net gebruikt. Maar op een of andere manier lukt het niet. Ik heb al gezocht op het forum hier en op Google maar bij Google kom ik alleen dezefde foutmelding op pagina's zelf tegen.

Acties:
  • 0 Henk 'm!

  • Crayne
  • Registratie: Januari 2002
  • Laatst online: 17-03 13:41

Crayne

Have face, will travel

Edit: Ah, wat je wilt is de multi-dimensionale array $resultaat sorteren op score, en daarna op de andere velden.

Als PHP klaagt dat argument #1 een array of sort flag moet zijn, zal dat dus betekenen dat argument #1 dat nu niet is. Als je gaat debuggen kun je er vast achterkomen wat argument #1 dan wel is en vanaf daar verder speuren.

[ Voor 92% gewijzigd door Crayne op 31-07-2008 13:44 ]

Mijn Library Thing catalogus


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Crayne schreef op donderdag 31 juli 2008 @ 13:28:
Mja, wat begrijp je niet aan de foutmelding? Blijkbaar is $score op het moment dat je hem in de array_multisort dumpt, geen array. En als ik naar je overige code kijk, zie ik ook nergens dat je een array krijgt, $score lijkt gevuld te worden met de (waarschijnlijk) numerieke waarde in je tabel onder de kolom 'score'.

Even wat debug-pogingen doen lijkt me niet zoveel werk.

Edit: wat je waarschijnlijk wilt is de array $resultaat sorteren op score, niet $score. array_multisort is niet waar jij het voor wilt gebruiken.
Dit voorbeeld gebruiken ze op PHP.net wat vergelijkbaar is met mijn probleem denk ik.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
$data[] = array('volume' => 67, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 1);
$data[] = array('volume' => 85, 'edition' => 6);
$data[] = array('volume' => 98, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 6);
$data[] = array('volume' => 67, 'edition' => 7);

// Obtain a list of columns
foreach ($data as $key => $row) {
    $volume[$key]  = $row['volume'];
    $edition[$key] = $row['edition'];
}

// Sort the data with volume descending, edition ascending
// Add $data as the last parameter, to sort by the common key
array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);
?> 


Of begrijp ik het onderwerp array nu gewoon verkeerd.

Acties:
  • 0 Henk 'm!

  • Crayne
  • Registratie: Januari 2002
  • Laatst online: 17-03 13:41

Crayne

Have face, will travel

Je zult sowieso in je aanroep van array_multisort() het laatste argument moeten vervangen door $resultaat, aangezien dat de array is die je uiteindelijk wilt sorteren.

Mijn Library Thing catalogus


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Crayne schreef op donderdag 31 juli 2008 @ 13:44:
Je zult sowieso in je aanroep van array_multisort() het laatste argument moeten vervangen door $resultaat, aangezien dat de array is die je uiteindelijk wilt sorteren.
Na nog wat verder zoeken heb ik het opgelost:
PHP:
1
2
$resultaat[] = array('score' => $score, 'titel' => $titel, 'link' => 'nieuws/'. $link);
rsort($resultaat);


Had ik deze methode maar eerder gevonden had veel tijd bespaard.

Acties:
  • 0 Henk 'm!

  • Crayne
  • Registratie: Januari 2002
  • Laatst online: 17-03 13:41

Crayne

Have face, will travel

Als ik het voorbeeld van PHP.net volg met de volgende code:

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
<?php

$resultaat = array();

$resultaat[] = array('score' => 99, 'titel' => 'blah', 'link' => 'nieuws/link4', );
$resultaat[] = array('score' => 45, 'titel' => 'blah nog meer.', 'link' => 'nieuws/link5', );
$resultaat[] = array('score' => 99, 'titel' => 'blah ook.', 'link' => 'nieuws/link3');

foreach ($resultaat as $key => $row)
{

    $score[$key] = $row['score'];        
    $titel[$key] = $row['titel'];
    $link[$key]  = $row['link'];        

}

array_multisort($score, SORT_DESC, $titel, SORT_ASC, $resultaat);

echo "<pre>";
var_dump($resultaat);
echo "</pre>";

?>


krijg ik netjes:

code:
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
array(3) {
  [0]=>
  array(3) {
    ["score"]=>
    int(99)
    ["titel"]=>
    string(4) "blah"
    ["link"]=>
    string(12) "nieuws/link4"
  }
  [1]=>
  array(3) {
    ["score"]=>
    int(99)
    ["titel"]=>
    string(9) "blah ook."
    ["link"]=>
    string(12) "nieuws/link3"
  }
  [2]=>
  array(3) {
    ["score"]=>
    int(45)
    ["titel"]=>
    string(14) "blah nog meer."
    ["link"]=>
    string(12) "nieuws/link5"
  }
}


Als ik echter rsort() ga gebruiken:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php

$resultaat = array();

$resultaat[] = array('score' => 99, 'titel' => 'blah', 'link' => 'nieuws/link4', );
rsort($resultaat);
$resultaat[] = array('score' => 45, 'titel' => 'blah nog meer.', 'link' => 'nieuws/link5', );
rsort($resultaat);
$resultaat[] = array('score' => 99, 'titel' => 'blah ook.', 'link' => 'nieuws/link3');
rsort($resultaat);

echo "<pre>";
var_dump($resultaat);
echo "</pre>";

?>


krijg ik:

code:
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
array(3) {
  [0]=>
  array(3) {
    ["score"]=>
    int(99)
    ["titel"]=>
    string(9) "blah ook."
    ["link"]=>
    string(12) "nieuws/link3"
  }
  [1]=>
  array(3) {
    ["score"]=>
    int(99)
    ["titel"]=>
    string(4) "blah"
    ["link"]=>
    string(12) "nieuws/link4"
  }
  [2]=>
  array(3) {
    ["score"]=>
    int(45)
    ["titel"]=>
    string(14) "blah nog meer."
    ["link"]=>
    string(12) "nieuws/link5"
  }
}


Nu kan het zijn dat je dat ook wil hebben, maar nu wordt alleen op score gesorteerd en niet meer op titel.

Mijn Library Thing catalogus


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Als ik die code toepas krijg ik nog steeds die foutmelding.
Ik houd het op rsort op dit moment dan maar niet sorteren op titel zou wel leuk zijn. Maar dat kan natuurlijk alleen als het percentage hetzelfde is en die kans is vrij gering.

Mysql komt alleen soms met percentages boven de 100 dat is vrij apart of niet?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Verwijderd schreef op donderdag 31 juli 2008 @ 14:16:
Mysql komt alleen soms met percentages boven de 100 dat is vrij apart of niet?
Afrondingsfouten? :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op donderdag 31 juli 2008 @ 14:16:
Mysql komt alleen soms met percentages boven de 100 dat is vrij apart of niet?
Volgens mij is het resultaat helemaal geen percentage maar een optelsom van overeenkomsten. Althans, dat is vrij gangbaar bij textindexes

Acties:
  • 0 Henk 'm!

  • Icelus
  • Registratie: Januari 2004
  • Niet online
Komt waarschijnlijk doordat je dezelfde variabelen binnen de while en de foreach gebruikt. Probeer 'ns om vlak voor de foreach de variabelen als array te initialiseren:
PHP:
1
$score = $link = $titel = array();

Developer Accused Of Unreadable Code Refuses To Comment


Acties:
  • 0 Henk 'm!

Verwijderd

Ik heb nauwelijks ervaring met MySQL en PHP, en ben meestal nogal huiverig voor fulltext index/search, maar is 't niet handiger om die verschillende tabellen in een view te gieten en dan de database de sortering te laten doen? Daar zijn die dingen nl. goed in.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Zover ik weet kan je met MySQL geen view maken. Met Oracle databases kan dat wel.

Maar het is opgelost en wordt nu door de bezoekers getest. Het ziet er in ieder geval beter uit dan met MySQL LIKE. Nu heb ik alleen nog de volgende vraag:

Met FULLTEXT is het ook mogelijk om met "een naam" specifiek te zoeken naar alleen die tekst binnen "" tekens. Herkenbaar van Google bijvoorbeeld. Maar hoe kan ik dat gebruiken in een query en ervoor zorgen dat dat ook veilig is. "" wordt namelijk uitgevoerd in de query en ik wil injection voorkomen. Nu worden er automatisch \ voor de " gezet.

PHP:
1
 $query = "SELECT id, titel_kort, titel_normaal, MATCH(titel_kort, titel_normaal, artikel) AGAINST('\"een naam\"') AS score FROM nieuws WHERE MATCH(titel_kort, titel_normaal, artikel) AGAINST('\"een naam\"') 

Acties:
  • 0 Henk 'm!

Verwijderd


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dank je, dat wist ik niet had er ook niet echt naar gezocht had even gekeken in PHPMyAdmin.
Pagina: 1